Fix MAIN_NODE macro (actually pool_virtual_main_db_node_id()).
authorTatsuo Ishii <[email protected]>
Fri, 21 Jun 2024 05:21:15 +0000 (14:21 +0900)
committerTatsuo Ishii <[email protected]>
Fri, 21 Jun 2024 05:21:15 +0000 (14:21 +0900)
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

src/context/pool_query_context.c

index ed055ec8855019a0ecaf100af1abb51ff1266bf6..f484b77a756d193567ba52c7ca744ea7f2844c26 100644 (file)
@@ -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)