summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuo Ishii2024-06-21 05:21:15 +0000
committerTatsuo Ishii2024-06-21 05:21:15 +0000
commitd699b8f129c70f434c525208b58bcc09da36f3a3 (patch)
treef78d8bfb37c28b8759a55d3b24c16bd5d0620de7 /src
parentd6f5b11516887088cbfe3ca6aa712f529b01b6c9 (diff)
Fix MAIN_NODE macro (actually pool_virtual_main_db_node_id()).
The macro used to REAL_MAIN_NODE_ID if there's no session context. This is wrong since REAL_MAIN_NODE_ID can be changed any time when failover/failback happens. Suppose REAL_MAIN_NODE_ID == my_main_node_id == 1. Then due to failback, REAL_MAIN_NODE_ID is changed to 0. Then MAIN_CONNECTION(cp) will return NULL and any reference to it will cause segmentation fault. To prevent the issue we should return my_main_node_id instead. Discussion: https://www.pgpool.net/pipermail/pgpool-general/2024-June/009205.html Backpatch-through: V4.1
Diffstat (limited to 'src')
-rw-r--r--src/context/pool_query_context.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/context/pool_query_context.c b/src/context/pool_query_context.c
index ed055ec88..f484b77a7 100644
--- a/src/context/pool_query_context.c
+++ b/src/context/pool_query_context.c
@@ -376,7 +376,16 @@ pool_virtual_main_db_node_id(void)
sc = pool_get_session_context(true);
if (!sc)
{
- return REAL_MAIN_NODE_ID;
+ /*
+ * We used to return REAL_MAIN_NODE_ID here. Problem with it is, it
+ * is possible that REAL_MAIN_NODE_ID could be changed
+ * anytime. Suppose REAL_MAIN_NODE_ID == my_main_node_id == 1. Then
+ * due to failback, REAL_MAIN_NODE_ID is changed to 0. Then
+ * MAIN_CONNECTION(cp) will return NULL and any reference to it will
+ * cause segmentation fault. To prevent the issue we should return
+ * my_main_node_id instead.
+ */
+ return my_main_node_id;
}
if (sc->in_progress && sc->query_context)