worker_spi: Add tests for BGWORKER_BYPASS_ALLOWCONN
authorMichael Paquier <michael@paquier.xyz>
Fri, 6 Oct 2023 00:01:27 +0000 (09:01 +0900)
committerMichael Paquier <michael@paquier.xyz>
Fri, 6 Oct 2023 00:01:27 +0000 (09:01 +0900)
This bgworker flag exists in the core code since eed1ce72e159, but was
never tested.  This relies on 4f2994647ff1, that has added a way to
start dynamic workers with this flag enabled.

Reviewed-by: Bertrand Drouvot, Bharath Rupireddy
Discussion: https://postgr.es/m/bcc36259-7850-4882-97ef-d6b905d2fc51@gmail.com

src/test/modules/worker_spi/t/001_worker_spi.pl

index 4b46b1336b1076fc641a8e35bc4b2092bcaa1b1b..06bb73816fd20964d588b25f702d171bfd27a557 100644 (file)
@@ -104,4 +104,31 @@ postgres|myrole|WorkerSpiMain]),
    'dynamic bgworkers all launched'
 ) or die "Timed out while waiting for dynamic bgworkers to be launched";
 
+# Check BGWORKER_BYPASS_ALLOWCONN.
+$node->safe_psql('postgres', q(ALTER DATABASE mydb ALLOW_CONNECTIONS false;));
+my $log_offset = -s $node->logfile;
+
+# bgworker cannot be launched with connection restriction.
+my $worker3_pid = $node->safe_psql('postgres',
+   qq[SELECT worker_spi_launch(12, $mydb_id, $myrole_id);]);
+$node->wait_for_log(
+   qr/database "mydb" is not currently accepting connections/, $log_offset);
+
+$result = $node->safe_psql('postgres',
+   "SELECT count(*) FROM pg_stat_activity WHERE pid = $worker3_pid;");
+is($result, '0', 'dynamic bgworker without BYPASS_ALLOWCONN not started');
+
+# bgworker bypasses the connection check, and can be launched.
+my $worker4_pid = $node->safe_psql('postgres',
+   qq[SELECT worker_spi_launch(12, $mydb_id, $myrole_id, '{"ALLOWCONN"}');]);
+ok( $node->poll_query_until(
+       'postgres',
+       qq[SELECT datname, usename, wait_event FROM pg_stat_activity
+            WHERE backend_type = 'worker_spi dynamic' AND
+            pid IN ($worker4_pid) ORDER BY datname;],
+       qq[mydb|myrole|WorkerSpiMain]),
+   'dynamic bgworker with BYPASS_ALLOWCONN started');
+
+$node->safe_psql('postgres', q(ALTER DATABASE mydb ALLOW_CONNECTIONS true;));
+
 done_testing();