On Wed, Aug 24, 2022 at 6:42 AM Kyotaro Horiguchi <horikyota....@gmail.com> wrote: > > At Tue, 16 Aug 2022 18:40:49 +0200, Alvaro Herrera <alvhe...@alvh.no-ip.org> > wrote in > > On 2022-Aug-16, Andrew Dunstan wrote: > > > > > I don't think there's a hard and fast rule about it. Certainly the case > > > would be more compelling if the functions were used across different TAP > > > suites. The SSL suite has suite-specific modules. That's a pattern also > > > worth considering. e.g something like. > > > > > > use FindBin qw($Bin); > > > use lib $Bin; > > > use MySuite; > > > > > > and then you put your common routines in MySuite.pm in the same > > > directory as the TAP test files. > > > > Yeah, I agree with that for advance_wal. Regarding find_in_log, that > > one seems general enough to warrant being in Cluster.pm -- consider > > issues_sql_like, which also slurps_file($log). That could be unified a > > little bit, I think. > > +1
With the generalized function for find_in_log() has been added as part of https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e25e5f7fc6b74c9d4ce82627e9145ef5537412e2, I'm proposing a generalized function for advance_wal(). Please find the attached patch. I tried to replace the existing tests with the new cluster function advance_wal(). Please let me know if I'm missing any other tests. Also, this new function can be used by an in-progress feature - https://commitfest.postgresql.org/43/3663/. Thoughts? FWIW, it's discussed here - https://www.postgresql.org/message-id/ZIKVd%2Ba43UfsIWJE%40paquier.xyz. -- Bharath Rupireddy PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
From ab7a5b56e0ed84fb0cceef1892dc435fed877029 Mon Sep 17 00:00:00 2001 From: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com> Date: Sat, 10 Jun 2023 08:05:20 +0000 Subject: [PATCH v1] Add a perl function in Cluster.pm to generate WAL This commit adds a perl function in Cluster.pm to generate WAL. Some TAP tests are now using their own way to generate WAL. Generalizing this functionality enables multiple TAP tests to reuse the functionality. --- src/test/perl/PostgreSQL/Test/Cluster.pm | 20 ++++++++ src/test/recovery/t/001_stream_rep.pl | 6 +-- src/test/recovery/t/019_replslot_limit.pl | 46 ++++--------------- .../t/035_standby_logical_decoding.pl | 7 +-- 4 files changed, 33 insertions(+), 46 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 5e161dbee6..cf2202d170 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -3120,6 +3120,26 @@ sub create_logical_slot_on_standby =pod +=item $node->advance_wal($n) + +Advance WAL of given node by $n segments + +=cut + +sub advance_wal +{ + my ($self, $n) = @_; + + # Advance by $n segments (= (wal_segment_size * $n) bytes). + for (my $i = 0; $i < $n; $i++) + { + $self->safe_psql('postgres', + "CREATE TABLE tt (); DROP TABLE tt; SELECT pg_switch_wal();"); + } +} + +=pod + =back =cut diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl index 0c72ba0944..0e256dab8d 100644 --- a/src/test/recovery/t/001_stream_rep.pl +++ b/src/test/recovery/t/001_stream_rep.pl @@ -496,11 +496,7 @@ $node_primary->safe_psql('postgres', my $segment_removed = $node_primary->safe_psql('postgres', 'SELECT pg_walfile_name(pg_current_wal_lsn())'); chomp($segment_removed); -$node_primary->psql( - 'postgres', " - CREATE TABLE tab_phys_slot (a int); - INSERT INTO tab_phys_slot VALUES (generate_series(1,10)); - SELECT pg_switch_wal();"); +$node_primary->advance_wal(1); my $current_lsn = $node_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); chomp($current_lsn); diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 33e50ad933..a6e427ebf1 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -59,7 +59,7 @@ $result = $node_primary->safe_psql('postgres', is($result, "reserved|t", 'check the catching-up state'); # Advance WAL by five segments (= 5MB) on primary -advance_wal($node_primary, 1); +$node_primary->advance_wal(1); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is always "safe" when fitting max_wal_size @@ -69,7 +69,7 @@ $result = $node_primary->safe_psql('postgres', is($result, "reserved|t", 'check that it is safe if WAL fits in max_wal_size'); -advance_wal($node_primary, 4); +$node_primary->advance_wal(4); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is always "safe" when max_slot_wal_keep_size is not set @@ -100,7 +100,7 @@ $result = $node_primary->safe_psql('postgres', is($result, "reserved", 'check that max_slot_wal_keep_size is working'); # Advance WAL again then checkpoint, reducing remain by 2 MB. -advance_wal($node_primary, 2); +$node_primary->advance_wal(2); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is still working @@ -118,7 +118,7 @@ $node_standby->stop; $result = $node_primary->safe_psql('postgres', "ALTER SYSTEM SET wal_keep_size to '8MB'; SELECT pg_reload_conf();"); # Advance WAL again then checkpoint, reducing remain by 6 MB. -advance_wal($node_primary, 6); +$node_primary->advance_wal(6); $result = $node_primary->safe_psql('postgres', "SELECT wal_status as remain FROM pg_replication_slots WHERE slot_name = 'rep1'" ); @@ -134,7 +134,7 @@ $node_primary->wait_for_catchup($node_standby); $node_standby->stop; # Advance WAL again without checkpoint, reducing remain by 6 MB. -advance_wal($node_primary, 6); +$node_primary->advance_wal(6); # Slot gets into 'reserved' state $result = $node_primary->safe_psql('postgres', @@ -145,7 +145,7 @@ is($result, "extended", 'check that the slot state changes to "extended"'); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # Advance WAL again without checkpoint; remain goes to 0. -advance_wal($node_primary, 1); +$node_primary->advance_wal(1); # Slot gets into 'unreserved' state and safe_wal_size is negative $result = $node_primary->safe_psql('postgres', @@ -174,7 +174,7 @@ $node_primary->safe_psql('postgres', # Advance WAL again. The slot loses the oldest segment by the next checkpoint my $logstart = get_log_size($node_primary); -advance_wal($node_primary, 7); +$node_primary->advance_wal(7); # Now create another checkpoint and wait until the WARNING is issued $node_primary->safe_psql('postgres', @@ -275,19 +275,8 @@ $node_standby->init_from_backup($node_primary2, $backup_name, has_streaming => 1); $node_standby->append_conf('postgresql.conf', "primary_slot_name = 'rep1'"); $node_standby->start; -my @result = - split( - '\n', - $node_primary2->safe_psql( - 'postgres', - "CREATE TABLE tt(); - DROP TABLE tt; - SELECT pg_switch_wal(); - CHECKPOINT; - SELECT 'finished';", - timeout => $PostgreSQL::Test::Utils::timeout_default)); -is($result[1], 'finished', 'check if checkpoint command is not blocked'); - +$node_primary2->advance_wal(1); +$node_primary2->safe_psql('postgres', 'CHECKPOINT;'); $node_primary2->stop; $node_standby->stop; @@ -372,7 +361,7 @@ $logstart = get_log_size($node_primary3); # freeze walsender and walreceiver. Slot will still be active, but walreceiver # won't get anything anymore. kill 'STOP', $senderpid, $receiverpid; -advance_wal($node_primary3, 2); +$node_primary3->advance_wal(2); my $msg_logged = 0; my $max_attempts = $PostgreSQL::Test::Utils::timeout_default; @@ -418,21 +407,6 @@ kill 'CONT', $receiverpid; $node_primary3->stop; $node_standby3->stop; -##################################### -# Advance WAL of $node by $n segments -sub advance_wal -{ - my ($node, $n) = @_; - - # Advance by $n segments (= (wal_segment_size * $n) bytes) on primary. - for (my $i = 0; $i < $n; $i++) - { - $node->safe_psql('postgres', - "CREATE TABLE t (); DROP TABLE t; SELECT pg_switch_wal();"); - } - return; -} - # return the size of logfile of $node in bytes sub get_log_size { diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index 480e6d6caa..2d19adab4e 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -524,11 +524,8 @@ my $walfile_name = $node_primary->safe_psql('postgres', chomp($walfile_name); # Generate some activity and switch WAL file on the primary -$node_primary->safe_psql( - 'postgres', "create table retain_test(a int); - select pg_switch_wal(); - insert into retain_test values(1); - checkpoint;"); +$node_primary->advance_wal(1); +$node_primary->safe_psql('postgres', "checkpoint;"); # Wait for the standby to catch up $node_primary->wait_for_replay_catchup($node_standby); -- 2.34.1