Fix integer overflow in streaming replication check.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 13 Jan 2023 00:21:59 +0000 (09:21 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 13 Jan 2023 01:24:59 +0000 (10:24 +0900)
When delay_threshold_by_time is enabled, following query is
periodically sent to the primary node to obtain the replication delay
in micro seconds.

SELECT application_name, state, sync_state,(EXTRACT(EPOCH FROM
replay_lag)*1000000)::integer FROM pg_stat_replication";

Unfortunately the result from EXTRACT::integer overflows if replay_lag
is bigger than 2147483647/1000000 (that is about 35 minutes and 47
seconds). Fix is, changing "integer" to "bigint". By this, the result
will not overflow unless it becomes bigger than 292,472 years.
Discussion: https://www.pgpool.net/pipermail/pgpool-general/2023-January/008600.html
Backpatch-through: 4.4

src/streaming_replication/pool_worker_child.c

index 87224de7da067508de1658c81a08f37b15dd585c..746f1817bfe1ffd4a426d9063aae34712e9fac92 100644 (file)
@@ -3,7 +3,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2022     PgPool Global Development Group
+ * Copyright (c) 2003-2023     PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -405,7 +405,7 @@ check_replication_time_lag(void)
                                stat_rep_query = "SELECT application_name, state, '' AS sync_state, '' AS replay_lag FROM pg_stat_replication";
                        else if (server_version[i] >= PG10_SERVER_VERSION)
                        {
-                               stat_rep_query = "SELECT application_name, state, sync_state,(EXTRACT(EPOCH FROM replay_lag)*1000000)::integer FROM pg_stat_replication";
+                               stat_rep_query = "SELECT application_name, state, sync_state,(EXTRACT(EPOCH FROM replay_lag)*1000000)::BIGINT FROM pg_stat_replication";
                                if (pool_config->delay_threshold_by_time > 0)
                                        replication_delay_by_time = true;
                        }