From df2cf1a188b0b4bcade5e4c8b4dd26a381cfde27 Mon Sep 17 00:00:00 2001 From: Taiki Koshino Date: Fri, 21 Aug 2026 11:25:23 +0900 Subject: [PATCH v1] Report replication delay as unknown for down standby nodes SHOW POOL_NODES and pcp_node_info reported the last measured replication delay after a standby node became down or was detached. The value could be stale because replication delay cannot be measured for a down node. Report the delay as "unknown" for a down standby in both commands. Keep the stored value unchanged to avoid treating an unmeasured delay as zero when the standby is attached again. Update the 003.failover regression test expectations for the new SHOW POOL_NODES output. Author: Taiki Koshino Discussion: https://github.com/pgpool/pgpool2/issues/131 --- .../regression/tests/003.failover/create_expected.sql | 2 +- .../tests/003.failover/create_expected_node0.sql | 2 +- src/tools/pcp/pcp_frontend_client.c | 7 ++++++- src/utils/pool_process_reporting.c | 10 +++++++++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/test/regression/tests/003.failover/create_expected.sql b/src/test/regression/tests/003.failover/create_expected.sql index 598d98a61..675e70a5d 100644 --- a/src/test/regression/tests/003.failover/create_expected.sql +++ b/src/test/regression/tests/003.failover/create_expected.sql @@ -17,7 +17,7 @@ CREATE TEMP TABLE tmp ( INSERT INTO tmp VALUES ('0','localhost','11002','up','up','0.500000','primary','unknown','0','false','0','','','XXXX-XX-XX XX:XX:XX','s'), -('1','localhost','11003','down','down','0.500000','standby','unknown','0','false','0','','','XXXX-XX-XX XX:XX:XX','s'), +('1','localhost','11003','down','down','0.500000','standby','unknown','0','false','unknown','','','XXXX-XX-XX XX:XX:XX','s'), ('0','localhost','11002','up','up','0.500000','main','main','0','false','0','','','XXXX-XX-XX XX:XX:XX','r'), ('1','localhost','11003','down','down','0.500000','replica','replica','0','false','0','','','XXXX-XX-XX XX:XX:XX','r'); diff --git a/src/test/regression/tests/003.failover/create_expected_node0.sql b/src/test/regression/tests/003.failover/create_expected_node0.sql index 676ad70ff..6842f338e 100644 --- a/src/test/regression/tests/003.failover/create_expected_node0.sql +++ b/src/test/regression/tests/003.failover/create_expected_node0.sql @@ -16,7 +16,7 @@ CREATE TEMP TABLE tmp ( mode text); INSERT INTO tmp VALUES -('0','localhost','11002','down','down','0.500000','standby','unknown','0','false','0','','','XXXX-XX-XX XX:XX:XX','s'), +('0','localhost','11002','down','down','0.500000','standby','unknown','0','false','unknown','','','XXXX-XX-XX XX:XX:XX','s'), ('1','localhost','11003','up','up','0.500000','primary','unknown','0','false','0','','','XXXX-XX-XX XX:XX:XX','s'), ('0','localhost','11002','down','down','0.500000','replica','replica','0','false','0','','','XXXX-XX-XX XX:XX:XX','r'), ('1','localhost','11003','up','up','0.500000','main','main','0','false','0','','','XXXX-XX-XX XX:XX:XX','r'); diff --git a/src/tools/pcp/pcp_frontend_client.c b/src/tools/pcp/pcp_frontend_client.c index 9f63a78f4..b98030256 100644 --- a/src/tools/pcp/pcp_frontend_client.c +++ b/src/tools/pcp/pcp_frontend_client.c @@ -564,7 +564,12 @@ output_nodeinfo_result(PCPResultInfo * pcpResInfo, bool all, bool verbose) localtime_r(&backend_info->status_changed_time, &tm); strftime(last_status_change, sizeof(last_status_change), "%F %T", &tm); - if (backend_info->standby_delay_by_time) + if (backend_info->role == ROLE_STANDBY && + backend_info->backend_status == CON_DOWN) + { + snprintf(standby_delay_str, sizeof(standby_delay_str), "unknown"); + } + else if (backend_info->standby_delay_by_time) { snprintf(standby_delay_str, sizeof(standby_delay_str), "%.6f", ((float) backend_info->standby_delay) / 1000000); if (verbose) diff --git a/src/utils/pool_process_reporting.c b/src/utils/pool_process_reporting.c index 3fa073f09..097c5ab67 100644 --- a/src/utils/pool_process_reporting.c +++ b/src/utils/pool_process_reporting.c @@ -1437,7 +1437,15 @@ get_nodes(int *nrows, int node_id) { snprintf(nodes[i].role, POOLCONFIG_MAXWEIGHTLEN, "%s", "standby"); - if (bi->standby_delay_by_time) + /* + * Report "unknown" if the replication delay cannot be measured; + * otherwise, report the last measured value. + */ + if (!VALID_BACKEND_RAW(i)) + { + snprintf(nodes[i].delay, POOLCONFIG_MAXWEIGHTLEN, "unknown"); + } + else if (bi->standby_delay_by_time) { snprintf(nodes[i].delay, POOLCONFIG_MAXWEIGHTLEN, "%.6f", ((float) bi->standby_delay) / 1000000); if (bi->standby_delay >= 2 * 1000 * 1000) -- 2.52.0