@ -9,6 +9,7 @@ use warnings;
use PostgreSQL::Test::Cluster ;
use PostgreSQL::Test::Utils ;
use Test::More ;
use Time::HiRes qw( usleep ) ;
sub test_tablespace
{
@ -34,14 +35,13 @@ sub test_tablespace
has_streaming = > 1 ) ;
$ node_standby - > append_conf ( 'postgresql.conf' ,
"allow_in_place_tablespaces = on" ) ;
$ node_standby - > append_conf ( 'postgresql.conf' ,
"primary_slot_name = slot" ) ;
$ node_standby - > start ;
# Make sure connection is made
$ node_primary - > poll_query_until ( 'postgres' ,
'SELECT count(*) = 1 FROM pg_stat_replication' ) ;
$ node_primary - > safe_psql ( 'postgres' , "SELECT pg_drop_replication_slot('slot')" ) ;
$ node_standby - > safe_psql ( 'postgres' , 'CHECKPOINT' ) ;
# Make sure the connection is made
$ node_primary - > wait_for_catchup ( $ node_standby , 'write' ,
$ node_primary - > lsn ( 'write' ) ) ;
# Do immediate shutdown just after a sequence of CREATE DATABASE / DROP
# DATABASE / DROP TABLESPACE. This causes CREATE DATABASE WAL records
@ -62,7 +62,7 @@ sub test_tablespace
] ;
$ node_primary - > safe_psql ( 'postgres' , $ query ) ;
$ node_primary - > wait_for_catchup ( $ node_standby , 'replay ' ,
$ node_primary - > wait_for_catchup ( $ node_standby , 'w rit e' ,
$ node_primary - > lsn ( 'write' ) ) ;
# show "create missing directory" log message
@ -113,7 +113,7 @@ my $tspoid = $node_standby->safe_psql('postgres',
my $ tspdir = $ node_standby - > data_dir . "/pg_tblspc/$tspoid" ;
File::Path:: rmtree ( $ tspdir ) ;
my $ logstart = get_log_size ( $ node_standby ) ;
my $ logstart = - s $ node_standby - > logfile ;
# Create a database in the tablespace and a table in default tablespace
$ node_primary - > safe_psql (
@ -127,7 +127,7 @@ $node_primary->safe_psql(
# Standby should fail and should not silently skip replaying the wal
# In this test, PANIC turns into WARNING by allow_in_place_tablespaces.
# Check the log messages instead of confirming standby failure.
my $ max_attempts = $ PostgreSQL:: Test:: Utils:: timeout_default ;
my $ max_attempts = $ PostgreSQL:: Test:: Utils:: timeout_default * 10 ;
while ( $ max_attempts - - >= 0 )
{
last
@ -135,31 +135,18 @@ while ($max_attempts-- >= 0)
find_in_log (
$ node_standby , qr!WARNING: ( [A-Z0-9]+:)? creating missing directory: pg_tblspc/! ,
$ logstart ) ) ;
sleep 1 ;
usleep ( 100_000 ) ;
}
ok ( $ max_attempts > 0 , "invalid directory creation is detected" ) ;
done_testing ( ) ;
# return the size of logfile of $node in bytes
sub get_log_size
{
my ( $ node ) = @ _ ;
return ( stat $ node - > logfile ) [ 7 ] ;
}
# find $pat in logfile of $node after $off-th byte
sub find_in_log
{
my ( $ node , $ pat , $ off ) = @ _ ;
$ off = 0 unless defined $ off ;
my $ log = PostgreSQL::Test::Utils:: slurp_file ( $ node - > logfile ) ;
return 0 if ( length ( $ log ) <= $ off ) ;
$ log = substr ( $ log , $ off ) ;
my $ log = PostgreSQL::Test::Utils:: slurp_file ( $ node - > logfile , $ off ) ;
return $ log =~ m/$pat/ ;
}