Add PostgreSQL::Test::Cluster::wait_for_event()
authorMichael Paquier <[email protected]>
Mon, 4 Mar 2024 01:25:50 +0000 (10:25 +0900)
committerMichael Paquier <[email protected]>
Mon, 4 Mar 2024 01:27:50 +0000 (10:27 +0900)
Per a demand from the author and the reviewer of this commit, this adds
to Cluster.pm a helper routine that can be used to monitor when a
process reaches a wanted wait event.  This can be used in combination
with the module injection_points for the "wait" callback, though it is
not limited to it as this monitors pg_stat_activity for a wait_event and
a backend_type.

Author: Bertrand Drouvot
Reviewed-by: Andrey Borodin
Discussion: https://postgr.es/m/[email protected]

src/test/perl/PostgreSQL/Test/Cluster.pm
src/test/recovery/t/041_checkpoint_at_promote.pl

index 44c1bb5afd07e27855fbcc08e4c2165c5786c2bb..4fec417f6fabf693ae392d996ffac22827a60bd9 100644 (file)
@@ -2742,6 +2742,29 @@ sub lsn
 
 =pod
 
+=item $node->wait_for_event(wait_event_name, backend_type)
+
+Poll pg_stat_activity until backend_type reaches wait_event_name.
+
+=cut
+
+sub wait_for_event
+{
+   my ($self, $backend_type, $wait_event_name) = @_;
+
+   $self->poll_query_until(
+       'postgres', qq[
+       SELECT count(*) > 0 FROM pg_stat_activity
+       WHERE backend_type = '$backend_type' AND wait_event = '$wait_event_name'
+   ])
+     or die
+     qq(timed out when waiting for $backend_type to reach wait event '$wait_event_name');
+
+   return;
+}
+
+=pod
+
 =item $node->wait_for_catchup(standby_name, mode, target_lsn)
 
 Wait for the replication connection with application_name standby_name until
index 1a6a8d86a1cf528757e06bd9641d994901885871..7c307314eae2e90669b7b6ddde8de7f4671fe7ac 100644 (file)
@@ -78,13 +78,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
 
 # Wait until the checkpointer is in the middle of the restart point
 # processing.
-ok( $node_standby->poll_query_until(
-       'postgres',
-       qq[SELECT count(*) FROM pg_stat_activity
-           WHERE backend_type = 'checkpointer' AND wait_event = 'create-restart-point' ;],
-       '1'),
-   'checkpointer is waiting in restart point'
-) or die "Timed out while waiting for checkpointer to run restart point";
+$node_standby->wait_for_event('checkpointer', 'create-restart-point');
 
 # Check the logs that the restart point has started on standby.  This is
 # optional, but let's be sure.