]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Test pg_stat_statements across crash restart
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 2 Apr 2026 10:33:06 +0000 (13:33 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 2 Apr 2026 10:33:06 +0000 (13:33 +0300)
Add 'pg_stat_statements' to the crash restart test, to test that
shared memory and LWLock initialization works across crash restart in
a library listed in shared_preload_libraries. We had no test coverage
for that.

Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Discussion: https://www.postgresql.org/message-id/CAExHW5vM1bneLYfg0wGeAa=52UiJ3z4vKd3AJ72X8Fw6k3KKrg@mail.gmail.com

src/test/recovery/t/013_crash_restart.pl

index 20d648ad6afb84b197bcd9d355c67b084af95102..56afb1aa6ebb5ced6105d2c4a3472eabe54b01aa 100644 (file)
@@ -21,14 +21,32 @@ my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default);
 
 my $node = PostgreSQL::Test::Cluster->new('primary');
 $node->init(allows_streaming => 1);
+
+# Enable pg_stat_statements to test restart of shared_preload_libraries.
+$node->append_conf(
+       'postgresql.conf',
+       qq{shared_preload_libraries = 'pg_stat_statements'
+pg_stat_statements.max = 50000
+compute_query_id = 'regress'
+});
+
 $node->start();
 
 # by default PostgreSQL::Test::Cluster doesn't restart after a crash
 $node->safe_psql(
-       'postgres',
-       q[ALTER SYSTEM SET restart_after_crash = 1;
-                                  ALTER SYSTEM SET log_connections = receipt;
-                                  SELECT pg_reload_conf();]);
+       'postgres', q[
+               ALTER SYSTEM SET restart_after_crash = 1;
+               ALTER SYSTEM SET log_connections = receipt;
+               SELECT pg_reload_conf();
+       ]);
+
+# Remember the time that pg_stat_statements was reset. We'll use it later to
+# verify that it gets re-initialized after crash.
+my $stats_reset = $node->safe_psql(
+       'postgres', q[
+               CREATE EXTENSION pg_stat_statements;
+               SELECT stats_reset FROM pg_stat_statements_info;
+       ]);
 
 # Run psql, keeping session alive, so we have an alive backend to kill.
 my ($killme_stdin, $killme_stdout, $killme_stderr) = ('', '', '');
@@ -141,6 +159,13 @@ $killme->run();
 ($monitor_stdin, $monitor_stdout, $monitor_stderr) = ('', '', '');
 $monitor->run();
 
+# Verify that pg_stat_statements, loaded via shared_preload_libraries,
+# was re-initialized at the crash.
+my $stats_reset_after = $node->safe_psql('postgres',
+       q[SELECT stats_reset FROM pg_stat_statements_info]);
+cmp_ok($stats_reset, 'ne', $stats_reset_after,
+       "pg_stat_statements was reset by restart");
+
 
 # Acquire pid of new backend
 $killme_stdin .= q[