Close yet another race condition in replication slot test code
authorAlvaro Herrera
Thu, 29 Jul 2021 21:09:06 +0000 (17:09 -0400)
committerAlvaro Herrera
Thu, 29 Jul 2021 21:09:06 +0000 (17:09 -0400)
Buildfarm shows that this test has a further failure mode when a
checkpoint starts earlier than expected, so we detect a "checkpoint
completed" line that's not the one we want.  Change the config to try
and prevent this.

Per buildfarm

While at it, update one comment that was forgotten in commit
d18e75664a2f.

Author: Kyotaro Horiguchi 
Discussion: https://postgr.es/m/20210729.162038.534808353849568395[email protected]

src/backend/access/transam/xlog.c
src/test/recovery/t/019_replslot_limit.pl

index 195b840d6faa1371b4140172582e557b19ec4df9..d73a55ae1759196836fe56ddbdba197a7a3a0e98 100644 (file)
@@ -9291,7 +9291,7 @@ CreateCheckPoint(int flags)
    if (!RecoveryInProgress())
        TruncateSUBTRANS(GetOldestTransactionIdConsideredRunning());
 
-   /* Real work is done, but log and update stats before releasing lock. */
+   /* Real work is done; log and update stats. */
    LogCheckpointEnd(false);
 
    /* Reset the process title */
index 54ddcef2bbd734f1b040f13e8914f0d9d0228df2..f99fa16d47235c35df891c1e033ffbc6e72cf992 100644 (file)
@@ -173,11 +173,21 @@ ok( !find_in_log(
        "requested WAL segment [0-9A-F]+ has already been removed"),
    'check that required WAL segments are still available');
 
-# Advance WAL again, the slot loses the oldest segment.
+# Create one checkpoint, to improve stability of the next steps
+$node_primary->safe_psql('postgres', "CHECKPOINT;");
+
+# Prevent other checkpoints from occurring while advancing WAL segments
+$node_primary->safe_psql('postgres',
+   "ALTER SYSTEM SET max_wal_size='40MB'; SELECT pg_reload_conf()");
+
+# Advance WAL again. The slot loses the oldest segment by the next checkpoint
 my $logstart = get_log_size($node_primary);
 advance_wal($node_primary, 7);
 
-# wait until the WARNING is issued
+# Now create another checkpoint and wait until the WARNING is issued
+$node_primary->safe_psql('postgres',
+   'ALTER SYSTEM RESET max_wal_size; SELECT pg_reload_conf()');
+$node_primary->safe_psql('postgres', "CHECKPOINT;");
 my $invalidated = 0;
 for (my $i = 0; $i < 10000; $i++)
 {