* 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
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);
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)));
}
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;
* 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
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);
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);
* 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
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);
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);
}
}
- 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;
}