pgpool2.git / summary / log / commit / refs
commit 17cf4e9d6eec412ecd7ab3efc6bf57b6366d5d21
Author: Tatsuo Ishii <ishii@sraoss.co.jp>
Date: Wed Jan 05 04:50:59 2022 +0000
Suppress message length log for in_hot_standby.
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 | 30 +++++++++++++++++++++++++-----
src/protocol/pool_proto_modules.c | 39 +++++++++++++++++++++++++++++++++++++--
2 files changed, 62 insertions(+), 7 deletions(-)
diff --git a/src/protocol/pool_process_query.c b/src/protocol/pool_process_query.c
index c0c0971b2..cfdbb8ae9 100644
--- a/src/protocol/pool_process_query.c
+++ b/src/protocol/pool_process_query.c
@@ -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;
}
diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c
index 60a3adbec..8170bf5c0 100644
--- a/src/protocol/pool_proto_modules.c
+++ b/src/protocol/pool_proto_modules.c
@@ -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)
{
[parent: ce420f1f8a7f]