On 12/31/21 11:22, Andrew Dunstan wrote:
> On 12/31/21 11:20, Dagfinn Ilmari Mannsåker wrote:
>> Andrew Dunstan <[email protected]> writes:
>>
>>> + my $subclass = __PACKAGE__ . "::V_$maj";
>>> + bless $node, $subclass;
>>> + unless ($node->isa(__PACKAGE__))
>>> + {
>>> + # It's not a subclass, so re-bless back into the main
>>> package
>>> + bless($node, __PACKAGE__);
>>> + carp "PostgreSQL::Test::Cluster isn't fully compatible
>>> with version $ver";
>>> + }
>> The ->isa() method works on package names as well as blessed objects, so
>> the back-and-forth blessing can be avoided.
>>
>> my $subclass = __PACKAGE__ . "::V_$maj";
>> if ($subclass->isa(__PACKAGE__))
>> {
>> bless($node, $subclass);
>> }
>> else
>> {
>> carp "PostgreSQL::Test::Cluster isn't fully compatible with
>> version $ver";
>> }
>>
> OK, thanks, will fix in next version.
>
>
Here's a version that does that and removes some recent bitrot.
cheers
andrew
--
Andrew Dunstan
EDB: https://www.enterprisedb.com
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index 7af0f8db13..a5e3d2f159 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -111,6 +111,10 @@ use Scalar::Util qw(blessed);
our ($use_tcp, $test_localhost, $test_pghost, $last_host_assigned,
$last_port_assigned, @all_nodes, $died);
+# the minimum version we believe to be compatible with this package without
+# subclassing.
+our $min_compat = 12;
+
INIT
{
@@ -1018,7 +1022,7 @@ sub enable_streaming
print "### Enabling streaming replication for node \"$name\"\n";
$self->append_conf(
- 'postgresql.conf', qq(
+ $self->_recovery_file, qq(
primary_conninfo='$root_connstr'
));
$self->set_standby_mode();
@@ -1047,7 +1051,7 @@ sub enable_restoring
: qq{cp "$path/%f" "%p"};
$self->append_conf(
- 'postgresql.conf', qq(
+ $self->_recovery_file, qq(
restore_command = '$copy_command'
));
if ($standby)
@@ -1061,6 +1065,8 @@ restore_command = '$copy_command'
return;
}
+sub _recovery_file { return "postgresql.conf"; }
+
=pod
=item $node->set_recovery_mode()
@@ -1246,15 +1252,29 @@ sub new
$node->dump_info;
- # Add node to list of nodes
- push(@all_nodes, $node);
-
$node->_set_pg_version;
- my $v = $node->{_pg_version};
+ my $ver = $node->{_pg_version};
- carp("PostgreSQL::Test::Cluster isn't fully compatible with version " . $v)
- if $v < 12;
+ # Use a subclass as defined below (or elsewhere) if this version
+ # isn't fully compatible. Warn if the version is too old and thus we don't
+ # have a subclass of this class.
+ if (ref $ver && $ver < $min_compat)
+ {
+ my $maj = $ver->major(separator => '_');
+ my $subclass = $class . "::V_$maj";
+ if ($subclass->isa($class))
+ {
+ bless $node, $subclass;
+ }
+ else
+ {
+ carp "PostgreSQL::Test::Cluster isn't fully compatible with version $ver";
+ }
+ }
+
+ # Add node to list of nodes
+ push(@all_nodes, $node);
return $node;
}
@@ -2546,8 +2566,12 @@ sub wait_for_catchup
. "_lsn to pass "
. $target_lsn . " on "
. $self->name . "\n";
+ # old versions of walreceiver just set the application name to
+ # `walreceiver'
my $query =
- qq[SELECT '$target_lsn' <= ${mode}_lsn AND state = 'streaming' FROM pg_catalog.pg_stat_replication WHERE application_name = '$standby_name';];
+ qq[SELECT '$target_lsn' <= ${mode}_lsn AND state = 'streaming'
+ FROM pg_catalog.pg_stat_replication
+ WHERE application_name in ('$standby_name', 'walreceiver');];
$self->poll_query_until('postgres', $query)
or croak "timed out waiting for catchup";
print "done\n";
@@ -2807,4 +2831,41 @@ sub pg_recvlogical_upto
=cut
+##########################################################################
+
+package PostgreSQL::Test::Cluster::V_11; ## no critic (ProhibitMultiplePackages)
+
+use parent -norequire, qw(PostgreSQL::Test::Cluster);
+
+# https://www.postgresql.org/docs/11/release-11.html
+
+# max_wal_senders + superuser_reserved_connections must be < max_connections
+# uses recovery.conf
+
+sub _recovery_file { return "recovery.conf"; }
+
+sub set_standby_mode
+{
+ my $self = shift;
+ $self->append_conf("recovery.conf", "standby_mode = on\n");
+}
+
+sub init
+{
+ my ($self, %params) = @_;
+ $self->SUPER::init(%params);
+ $self->adjust_conf('postgresql.conf', 'max_wal_senders',
+ $params{allows_streaming} ? 5 : 0);
+}
+
+##########################################################################
+
+package PostgreSQL::Test::Cluster::V_10; ## no critic (ProhibitMultiplePackages)
+
+use parent -norequire, qw(PostgreSQL::Test::Cluster::V_11);
+
+# https://www.postgresql.org/docs/10/release-10.html
+
+########################################################################
+
1;