Fix find_primary_node_repeatedly doesn't terminate within search_primary_node_timeout.
authorBo Peng <pengbo@sraoss.co.jp>
Fri, 4 Aug 2023 04:43:33 +0000 (13:43 +0900)
committerBo Peng <pengbo@sraoss.co.jp>
Fri, 4 Aug 2023 04:43:33 +0000 (13:43 +0900)
src/main/pgpool_main.c

index 66c342034830fd40b07941c1bc0cbd68d17bed02..5200daa98e29bb6c3b424234fdd6a7b23e9b7fee 100644 (file)
@@ -2776,7 +2776,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,
@@ -2826,7 +2826,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;
 
@@ -2879,13 +2880,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++)
+
+       /* set expiration time for searching the primary node */
+       search_primary_expiration = time(NULL) + pool_config->search_primary_node_timeout;
+
+       for (;;)
        {
-               node_id = find_primary_node();
-               if (node_id != -1)
+               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;
 }