From 6ccbbee4cde68e5b6bc4a5e9344582e1d79b98be Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Thu, 6 Jan 2022 16:53:42 +0900 Subject: [PATCH] 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/auth/pool_auth.c | 44 ++++++++++++++++++++++++++++--- src/include/pool.h | 4 +-- src/protocol/pool_process_query.c | 26 +++++++++++++++--- 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/auth/pool_auth.c b/src/auth/pool_auth.c index 369bc41aa..ed77fe64f 100644 --- a/src/auth/pool_auth.c +++ b/src/auth/pool_auth.c @@ -5,7 +5,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2020 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 @@ -1158,7 +1158,7 @@ int *pool_read_message_length2(POOL_CONNECTION_POOL *cp) int i; static int length_array[MAX_CONNECTION_SLOTS]; - /* read message from master node */ + /* read message from main node */ pool_read(CONNECTION(cp, MASTER_NODE_ID), &length0, sizeof(length0)); length0 = ntohl(length0); @@ -1180,7 +1180,7 @@ int *pool_read_message_length2(POOL_CONNECTION_POOL *cp) if (length != length0) { - ereport(LOG, + ereport(DEBUG5, (errmsg("reading message length"), errdetail("message length (%d) in slot %d does not match with slot 0(%d)", length, i, length0))); } @@ -1199,7 +1199,43 @@ int *pool_read_message_length2(POOL_CONNECTION_POOL *cp) return &length_array[0]; } -signed char pool_read_kind(POOL_CONNECTION_POOL *cp) +/* + * 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[MASTER_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) { char kind0, kind; int i; diff --git a/src/include/pool.h b/src/include/pool.h index 96a2ba43b..f35c1e66c 100644 --- a/src/include/pool.h +++ b/src/include/pool.h @@ -6,7 +6,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2019 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 @@ -586,7 +586,6 @@ extern bool degenerate_backend_set_ex(int *node_id_set, int count, unsigned char extern bool promote_backend(int node_id, unsigned char flags); extern bool send_failback_request(int node_id, bool throw_error, unsigned char flags); - extern void pool_set_timeout(int timeoutval); extern int pool_check_fd(POOL_CONNECTION *cp); @@ -596,6 +595,7 @@ extern int pool_read_message_length(POOL_CONNECTION_POOL *cp); extern int *pool_read_message_length2(POOL_CONNECTION_POOL *cp); extern signed char pool_read_kind(POOL_CONNECTION_POOL *cp); extern int pool_read_int(POOL_CONNECTION_POOL *cp); +extern void pool_emit_log_for_message_length_diff(int *length_array, char *name); extern POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend); extern POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, int len, char *contents); diff --git a/src/protocol/pool_process_query.c b/src/protocol/pool_process_query.c index 5f6fde795..94bd5c70c 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-2020 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 @@ -911,8 +911,8 @@ POOL_STATUS ParameterStatus(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *bac char *name; char *value; POOL_STATUS status; - char parambuf[1024]; /* parameter + value string buffer. XXX is this enough? */ - int i; + char *parambuf = NULL; /* pointer to parameter + value string buffer */ + int i; pool_write(frontend, "S", 1); @@ -949,9 +949,20 @@ POOL_STATUS ParameterStatus(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *bac if (IS_MASTER_NODE_ID(i)) { len1 = len; + parambuf = palloc(len); memcpy(parambuf, p, len); pool_add_param(&CONNECTION(backend, i)->params, name, value); } + 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(&MASTER(backend)->params); @@ -959,7 +970,14 @@ POOL_STATUS ParameterStatus(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *bac } } - 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; } -- 2.39.5