Add a regression test for contrib/pg_prewarm.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Aug 2022 21:59:35 +0000 (17:59 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Aug 2022 21:59:44 +0000 (17:59 -0400)
We had a little bit of coverage here thanks to e2f65f425,
but not enough; notably, autoprewarm wasn't exercised at all.

Dong Wook Lee, with help from Julien Rouhaud and myself

Discussion: https://postgr.es/m/20220629053812.mifmdrch5iuasg2s@home-desktop

contrib/pg_prewarm/.gitignore [new file with mode: 0644]
contrib/pg_prewarm/Makefile
contrib/pg_prewarm/t/001_basic.pl [new file with mode: 0644]

diff --git a/contrib/pg_prewarm/.gitignore b/contrib/pg_prewarm/.gitignore
new file mode 100644 (file)
index 0000000..5dcb3ff
--- /dev/null
@@ -0,0 +1,4 @@
+# Generated subdirectories
+/log/
+/results/
+/tmp_check/
index b13ac3c813ce4e0ef41a6cfc5cbefa6c0cd40f7d..9cfde8c4e4fad0761d6c377e1294e2ffa7cbe2a2 100644 (file)
@@ -10,6 +10,8 @@ EXTENSION = pg_prewarm
 DATA = pg_prewarm--1.1--1.2.sql pg_prewarm--1.1.sql pg_prewarm--1.0--1.1.sql
 PGFILEDESC = "pg_prewarm - preload relation data into system buffer cache"
 
+TAP_TESTS = 1
+
 ifdef USE_PGXS
 PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
diff --git a/contrib/pg_prewarm/t/001_basic.pl b/contrib/pg_prewarm/t/001_basic.pl
new file mode 100644 (file)
index 0000000..b1df0dd
--- /dev/null
@@ -0,0 +1,58 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+$node->init;
+$node->append_conf(
+   'postgresql.conf',
+   qq{shared_preload_libraries = 'pg_prewarm'
+    pg_prewarm.autoprewarm = true
+    pg_prewarm.autoprewarm_interval = 0});
+$node->start;
+
+# setup
+$node->safe_psql("postgres",
+       "CREATE EXTENSION pg_prewarm;\n"
+     . "CREATE TABLE test(c1 int);\n"
+     . "INSERT INTO test SELECT generate_series(1, 100);");
+
+# test read mode
+my $result =
+  $node->safe_psql("postgres", "SELECT pg_prewarm('test', 'read');");
+like($result, qr/^[1-9][0-9]*$/, 'read mode succeeded');
+
+# test buffer_mode
+$result =
+  $node->safe_psql("postgres", "SELECT pg_prewarm('test', 'buffer');");
+like($result, qr/^[1-9][0-9]*$/, 'buffer mode succeeded');
+
+# prefetch mode might or might not be available
+my ($cmdret, $stdout, $stderr) =
+  $node->psql("postgres", "SELECT pg_prewarm('test', 'prefetch');");
+ok( (        $stdout =~ qr/^[1-9][0-9]*$/
+         or $stderr =~ qr/prefetch is not supported by this build/),
+   'prefetch mode succeeded');
+
+# test autoprewarm_dump_now()
+$result = $node->safe_psql("postgres", "SELECT autoprewarm_dump_now();");
+like($result, qr/^[1-9][0-9]*$/, 'autoprewarm_dump_now succeeded');
+
+# restart, to verify that auto prewarm actually works
+$node->restart;
+
+$node->wait_for_log(
+   "autoprewarm successfully prewarmed [1-9][0-9]* of [0-9]+ previously-loaded blocks"
+);
+
+$node->stop;
+
+done_testing();