Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-03-30 Thread Andrew Dunstan


On 3/30/22 01:55, Michael Paquier wrote:
> On Tue, Mar 29, 2022 at 05:56:02PM -0400, Andrew Dunstan wrote:
>> I'm not sure why this item has been moved to the next CF without any
>> discussion I could see on the mailing list. It was always my intention
>> to commit it this time, and I propose to do so tomorrow with the comment
>> Michael has requested above. The cfbot is still happy with it.
> Thanks for taking care of it!



Committed.


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com





Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-03-29 Thread Michael Paquier
On Tue, Mar 29, 2022 at 05:56:02PM -0400, Andrew Dunstan wrote:
> I'm not sure why this item has been moved to the next CF without any
> discussion I could see on the mailing list. It was always my intention
> to commit it this time, and I propose to do so tomorrow with the comment
> Michael has requested above. The cfbot is still happy with it.

Thanks for taking care of it!
--
Michael


signature.asc
Description: PGP signature


Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-03-29 Thread Andrew Dunstan


On 1/21/22 09:59, Andrew Dunstan wrote:
> On 1/21/22 02:47, Michael Paquier wrote:
>> On Tue, Jan 18, 2022 at 06:35:39PM -0500, Andrew Dunstan wrote:
>>> Here's a version that does that and removes some recent bitrot.
>> I have been looking at the full set of features of Cluster.pm and the
>> requirements behind v10 as minimal version supported, and nothing
>> really stands out.
>>
>> +   # old versions of walreceiver just set the application name to
>> +   # `walreceiver'
>>
>> Perhaps this should mention to which older versions this sentence
>> applies?
>
>
> Will do in the next version. FTR it's versions older than 12.
>
>

I'm not sure why this item has been moved to the next CF without any
discussion I could see on the mailing list. It was always my intention
to commit it this time, and I propose to do so tomorrow with the comment
Michael has requested above. The cfbot is still happy with it.


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com





Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-01-21 Thread Andrew Dunstan


On 1/21/22 02:47, Michael Paquier wrote:
> On Tue, Jan 18, 2022 at 06:35:39PM -0500, Andrew Dunstan wrote:
>> Here's a version that does that and removes some recent bitrot.
> I have been looking at the full set of features of Cluster.pm and the
> requirements behind v10 as minimal version supported, and nothing
> really stands out.
>
> +   # old versions of walreceiver just set the application name to
> +   # `walreceiver'
>
> Perhaps this should mention to which older versions this sentence
> applies?



Will do in the next version. FTR it's versions older than 12.


cheers


andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com





Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-01-20 Thread Michael Paquier
On Tue, Jan 18, 2022 at 06:35:39PM -0500, Andrew Dunstan wrote:
> Here's a version that does that and removes some recent bitrot.

I have been looking at the full set of features of Cluster.pm and the
requirements behind v10 as minimal version supported, and nothing
really stands out.

+   # old versions of walreceiver just set the application name to
+   # `walreceiver'

Perhaps this should mention to which older versions this sentence
applies?
--
Michael


signature.asc
Description: PGP signature


Re: Extend compatibility of PostgreSQL::Test::Cluster

2022-01-18 Thread Andrew Dunstan

On 12/31/21 11:22, Andrew Dunstan wrote:
> On 12/31/21 11:20, Dagfinn Ilmari Mannsåker wrote:
>> Andrew Dunstan  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;


Re: Extend compatibility of PostgreSQL::Test::Cluster

2021-12-31 Thread Andrew Dunstan


On 12/31/21 11:20, Dagfinn Ilmari Mannsåker wrote:
> Andrew Dunstan  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.


cheers


andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com





Re: Extend compatibility of PostgreSQL::Test::Cluster

2021-12-31 Thread Dagfinn Ilmari Mannsåker
Andrew Dunstan  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";
}

- ilmari




Re: Extend compatibility of PostgreSQL::Test::Cluster

2021-12-28 Thread Andrew Dunstan

On 12/28/21 09:30, Andrew Dunstan wrote:
> PFA a patch to extend the compatibility of PostgreSQL::Test::Cluster to
> all live branches. It does this by introducing a couple of subclasses
> which override a few things. The required class is automatically
> detected and used, so users don't need to specify a subclass. Although
> this is my work it draws some inspiration from work by Jehan-Guillaume
> de Rorthais. The aim here is to provide minimal disruption to the
> mainline code, and also to have very small override subroutines.
>
> My hope is to take this further, down to 9.2, which we recently decided
> to give limited build support to. However I think the present patch is a
> good stake to put into the ground.



This version handles older versions for which we have no subclass more
gracefully.


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 c061e850fb..89504128ec 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,28 @@ 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};
+
+	# 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 = __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";
+		}
+}
 
-	carp("PostgreSQL::Test::Cluster isn't fully compatible with version " . $v)
-	  if $v < 12;
+	# Add node to list of nodes
+	push(@all_nodes, $node);
 
 	return $node;
 }
@@ -2546,8 +2565,12 @@ sub wait_for_catchup
 	  . "_lsn to pass "
 	  . $lsn_expr . " on "
 	  . $self->name . "\n";
+# old versions of walreceiver just set the application name to
+# `walreceiver'
 	my $query =
-	  qq[SELECT $lsn_expr <= ${mode}_lsn AND state = 'streaming' FROM pg_catalog.pg_stat_replication WHERE application_name = '$standby_name';];
+	  qq[SELECT $lsn_expr <= ${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";
@@ -2771,4 +2794,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;