diff options
Diffstat (limited to 'src/test/modules')
-rw-r--r-- | src/test/modules/test_misc/meson.build | 1 | ||||
-rw-r--r-- | src/test/modules/test_misc/t/004_io_direct.pl | 57 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build index 21bde427b41..911084ac0fe 100644 --- a/src/test/modules/test_misc/meson.build +++ b/src/test/modules/test_misc/meson.build @@ -9,6 +9,7 @@ tests += { 't/001_constraint_validation.pl', 't/002_tablespace.pl', 't/003_check_guc.pl', + 't/004_io_direct.pl', ], }, } diff --git a/src/test/modules/test_misc/t/004_io_direct.pl b/src/test/modules/test_misc/t/004_io_direct.pl new file mode 100644 index 00000000000..f5bf0b11e4e --- /dev/null +++ b/src/test/modules/test_misc/t/004_io_direct.pl @@ -0,0 +1,57 @@ +# Very simple exercise of direct I/O GUC. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Systems that we know to have direct I/O support, and whose typical local +# filesystems support it or at least won't fail with an error. (illumos should +# probably be in this list, but perl reports it as solaris. Solaris should not +# be in the list because we don't support its way of turning on direct I/O, and +# even if we did, its version of ZFS rejects it, and OpenBSD just doesn't have +# it.) +if (!grep { $^O eq $_ } qw(aix darwin dragonfly freebsd linux MSWin32 netbsd)) +{ + plan skip_all => "no direct I/O support"; +} + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf( + 'postgresql.conf', qq{ +io_direct = 'data,wal,wal_init' +shared_buffers = '256kB' # tiny to force I/O +}); +$node->start; + +# Do some work that is bound to generate shared and local writes and reads as a +# simple exercise. +$node->safe_psql('postgres', + 'create table t1 as select 1 as i from generate_series(1, 10000)'); +$node->safe_psql('postgres', 'create table t2count (i int)'); +$node->safe_psql( + 'postgres', qq{ +begin; +create temporary table t2 as select 1 as i from generate_series(1, 10000); +update t2 set i = i; +insert into t2count select count(*) from t2; +commit; +}); +$node->safe_psql('postgres', 'update t1 set i = i'); +is( '10000', + $node->safe_psql('postgres', 'select count(*) from t1'), + "read back from shared"); +is( '10000', + $node->safe_psql('postgres', 'select * from t2count'), + "read back from local"); +$node->stop('immediate'); + +$node->start; +is( '10000', + $node->safe_psql('postgres', 'select count(*) from t1'), + "read back from shared after crash recovery"); +$node->stop; + +done_testing(); |