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]