Suppress message length log for in_hot_standby.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Wed, 5 Jan 2022 04:50:59 +0000 (13:50 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Wed, 5 Jan 2022 04:50:59 +0000 (13:50 +0900)
PostgreSQL 14 introduced new config parameter: in_hot_standby
https://www.postgresql.org/docs/14/runtime-config-preset.html
The value is either "on" for standby servers or "off" for primary
servers. As a result pgpool log is fladded by the messages:

2021-12-16 10:40:34.855: psql pid 366965: LOG:  reading message length
2021-12-16 10:40:34.855: psql pid 366965: DETAIL:  message length (22) in slot 1 does not match with slot 0(23)

To avoid this, only complain if the parameter name is not in_hot_standby.
Also the message is enhanced to show the parameter name.

2022-01-05 13:05:15.993: psql pid 642877: LOG:  ParameterStatus "TimeZone": node 1 message length 30 is different from main node message length 24

Discussion: https://www.pgpool.net/pipermail/pgpool-hackers/2021-December/004077.html

src/protocol/pool_process_query.c
src/protocol/pool_proto_modules.c

index c0c0971b257d7e149bf37f763226b35b5a36aad8..cfdbb8ae9f62ffba3380621d72a6dd84df3a547d 100644 (file)
@@ -3,7 +3,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2021     PgPool Global Development Group
+ * Copyright (c) 2003-2022     PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -883,6 +883,9 @@ SimpleForwardToBackend(char kind, POOL_CONNECTION * frontend,
        return POOL_CONTINUE;
 }
 
+/*
+ * Handle parameter status message
+ */
 POOL_STATUS
 ParameterStatus(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend)
 {
@@ -894,8 +897,7 @@ ParameterStatus(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend)
        char       *name;
        char       *value;
        POOL_STATUS status;
-       char            parambuf[1024]; /* parameter + value string buffer. XXX is
-                                                                * this enough? */
+       char            *parambuf = NULL; /* pointer to parameter + value string buffer */
        int                     i;
 
        pool_write(frontend, "S", 1);
@@ -932,9 +934,10 @@ ParameterStatus(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend)
 
                        if (IS_MAIN_NODE_ID(i))
                        {
-                               len1 = len;
                                int     pos;
 
+                               len1 = len;
+                               parambuf = palloc(len);
                                memcpy(parambuf, p, len);
                                pool_add_param(&CONNECTION(backend, i)->params, name, value);
 
@@ -943,6 +946,16 @@ ParameterStatus(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend)
                                        set_application_name_with_string(pool_find_name(&CONNECTION(backend, i)->params, name, &pos));
                                }
                        }
+                       else
+                       {
+                               /*
+                                * Except "in_hot_standby" parameter, complain the message length difference.
+                                */
+                               if (strcmp(name, "in_hot_standby"))
+                               {
+                                       pool_emit_log_for_message_length_diff(len_array, name);
+                               }
+                       }
 
 #ifdef DEBUG
                        pool_param_debug_print(&MAIN(backend)->params);
@@ -950,7 +963,14 @@ ParameterStatus(POOL_CONNECTION * frontend, POOL_CONNECTION_POOL * backend)
                }
        }
 
-       status = pool_write(frontend, parambuf, len1);
+       if (parambuf)
+       {
+               status = pool_write(frontend, parambuf, len1);
+               pfree(parambuf);
+       }
+       else
+               ereport(ERROR,
+                               (errmsg("ParameterStatus: failed to obatain parameter name, value from the main node.")));
        return status;
 }
 
index 60a3adbeca1b146b75f02fdff660c501ca2b7355..8170bf5c0d662e651cce76bea2867dfdcce0f022 100644 (file)
@@ -3,7 +3,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2021     PgPool Global Development Group
+ * Copyright (c) 2003-2022     PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -4307,7 +4307,7 @@ pool_read_message_length2(POOL_CONNECTION_POOL * cp)
 
                        if (length != length0)
                        {
-                               ereport(LOG,
+                               ereport(DEBUG1,
                                                (errmsg("reading message length"),
                                                 errdetail("message length (%d) in slot %d does not match with slot 0(%d)", length, i, length0)));
                        }
@@ -4326,6 +4326,41 @@ pool_read_message_length2(POOL_CONNECTION_POOL * cp)
        return &length_array[0];
 }
 
+/*
+ * By given message length array, emit log message to complain the difference.
+ * If no difference, no log is emitted.
+ * If "name" is not NULL, it is added to the log message.
+ */
+void
+pool_emit_log_for_message_length_diff(int *length_array, char *name)
+{
+       int                     length0,        /* message length of main node id */
+                               length;
+       int                     i;
+
+       length0 = length_array[MAIN_NODE_ID];
+
+       for (i = 0; i < NUM_BACKENDS; i++)
+       {
+               if (VALID_BACKEND(i))
+               {
+                       length = length_array[i];
+
+                       if (length != length0)
+                       {
+                               if (name != NULL)
+                                       ereport(LOG,
+                                                       (errmsg("ParameterStatus \"%s\": node %d message length %d is different from main node message length %d",
+                                                                       name, i, length_array[i], length0)));
+                               else
+                                       ereport(LOG,
+                                                       (errmsg("node %d message length %d is different from main node message length %d",
+                                                                       i, length_array[i], length0)));
+                       }
+               }
+       }
+}
+
 signed char
 pool_read_kind(POOL_CONNECTION_POOL * cp)
 {