From cf2a2af837603ffcfc77ce8278fe1537f70f79b9 Mon Sep 17 00:00:00 2001 From: Yugo Nagata Date: Thu, 9 Mar 2017 11:34:12 +0900 Subject: [PATCH] Fix pcp_promote_node bug that fails promoting node 0 The master node could not be promoted by pcp_promote_node with the following error; FATAL: invalid pgpool mode for process recovery request DETAIL: specified node is already primary node, can't promote node id 0 In streaming replication mode, there is a case that Pgpool-II regards the status of primary node as "standby" for some reasons, for example, when pg_ctl promote is executed manually during Pgpool-II is running, in which case, it seems to Pgpool-II that the primary node doesn't exist. This status mismatch should be fixe by pcp_promote_node, but when the node is the master node (the first alive node), it fails as mentioned above. The reason is as following. before changing the status, pcp_promote_node checks if the specified node is already primary or not by comparing the node id with PRIMARY_NODE_ID. However, if the primary doesn't exist from Pgpool-II's view, PRIMARY_NODE_ID is set to 0, which is same as MASTER_NODE_ID. Hence, when the master node is specified to be promoted, pcp_promote_node is confused that this node is already primary and doesn't have to be promoted, and it exits with the error. To fix this, pcp_promote_node should check the node id by using REAL_PRIMARY_NODE_ID, which is set -1 when the primary doesn't exist, rather than PRIMARY_NODE_ID. --- src/pcp_con/pcp_child.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pcp_con/pcp_child.c b/src/pcp_con/pcp_child.c index 174ede74c..4dbac9349 100644 --- a/src/pcp_con/pcp_child.c +++ b/src/pcp_con/pcp_child.c @@ -1439,7 +1439,7 @@ process_promote_node(PCP_CONNECTION *frontend, char *buf, char tos) } - if (node_id == PRIMARY_NODE_ID) + if (node_id == REAL_PRIMARY_NODE_ID) { char code[] = "NodeIdAlreadyPrimary"; pcp_write(frontend, "e", 1); -- 2.39.5