From 5fc0fd4ab08de05b9812ddc544a16b77b3ca0f45 Mon Sep 17 00:00:00 2001 From: Bo Peng Date: Fri, 4 Aug 2023 14:13:05 +0900 Subject: [PATCH] Fix find_primary_node_repeatedly doesn't terminate within search_primary_node_timeout. --- src/main/pgpool_main.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/pgpool_main.c b/src/main/pgpool_main.c index 1fb15e085..d3d6e8a3b 100644 --- a/src/main/pgpool_main.c +++ b/src/main/pgpool_main.c @@ -3298,7 +3298,7 @@ find_primary_node(void) bkinfo->backend_port, pool_config->sr_check_database, pool_config->sr_check_user, - password ? password : "", true); + password ? password : "", false); if (!slots[i]) { ereport(LOG, @@ -3348,7 +3348,8 @@ find_primary_node(void) static int find_primary_node_repeatedly(void) { - int sec; + time_t search_primary_expiration; + time_t now; int node_id = -1; int i; @@ -3401,13 +3402,29 @@ find_primary_node_repeatedly(void) */ ereport(LOG, (errmsg("find_primary_node_repeatedly: waiting for finding a primary node"))); - for (sec = 0; (pool_config->search_primary_node_timeout == 0 || - sec < pool_config->search_primary_node_timeout); sec++) - { - node_id = find_primary_node(); - if (node_id != -1) + + /* set expiration time for searching the primary node */ + search_primary_expiration = time(NULL) + pool_config->search_primary_node_timeout; + + for (;;) + { + now = time(NULL); + + if (pool_config->search_primary_node_timeout == 0 || search_primary_expiration > now) + { + node_id = find_primary_node(); + if (node_id != -1) + break; + pool_sleep(1); + } + else + { + ereport(LOG, + (errmsg("failed to find primary node"), + errdetail("find_primary_node_repeatedly: expired after %d seconds", + pool_config->search_primary_node_timeout))); break; - pool_sleep(1); + } } return node_id; } -- 2.39.5