From 89ac7004dadf4116d9b180bb5ff64b64bfce94b1 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 26 Feb 2016 13:24:22 -0300 Subject: [PATCH] Move some code from RewindTest into PostgresNode Some code in the RewindTest test suite is more generally useful than just for that suite, so put it where other test suites can reach it. Some postgresql.conf parameters change their default values when a cluster is initialized with 'allows_streaming' than the previous behavior; most notably, autovacuum is no longer turned off. (Also, we no longer call pg_ctl promote with -w, but that flag doesn't actually do anything in promote so there's no behavior change.) Author: Michael Paquier --- src/bin/pg_rewind/RewindTest.pm | 19 +-------- src/test/perl/PostgresNode.pm | 71 +++++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/bin/pg_rewind/RewindTest.pm b/src/bin/pg_rewind/RewindTest.pm index 68834cd6a4..bda0516cb3 100644 --- a/src/bin/pg_rewind/RewindTest.pm +++ b/src/bin/pg_rewind/RewindTest.pm @@ -114,24 +114,9 @@ sub check_query sub setup_cluster { - # Initialize master, data checksums are mandatory $node_master = get_new_node('master'); - $node_master->init; - - # Custom parameters for master's postgresql.conf - $node_master->append_conf( - "postgresql.conf", qq( -wal_level = hot_standby -max_wal_senders = 2 -wal_keep_segments = 20 -max_wal_size = 200MB -shared_buffers = 1MB -wal_log_hints = on -hot_standby = on -autovacuum = off -max_connections = 10 -)); + $node_master->init(allows_streaming => 1); } sub start_master @@ -177,7 +162,7 @@ sub promote_standby # Now promote slave and insert some new data on master, this will put # the master out-of-sync with the standby. Wait until the standby is # out of recovery mode, and is ready to accept read-write connections. - system_or_bail('pg_ctl', '-w', '-D', $node_standby->data_dir, 'promote'); + $node_standby->promote; $node_standby->poll_query_until('postgres', "SELECT NOT pg_is_in_recovery()") or die "Timed out while waiting for promotion of standby"; diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index aec3b9adfd..167b89ad4d 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -47,7 +47,7 @@ allowing to start, stop, backup and initialize it with various options. The set of nodes managed by a given test is also managed by this module. In addition to node management, PostgresNode instances have some wrappers -around Test::More functions to run commands with an envronment set up to +around Test::More functions to run commands with an environment set up to point to the instance. The IPC::Run module is required. @@ -66,7 +66,6 @@ use File::Basename; use File::Spec; use File::Temp (); use IPC::Run; -use PostgresNode; use RecursiveCopy; use Test::More; use TestLib (); @@ -347,6 +346,9 @@ On Windows, we use SSPI authentication to ensure the same (by pg_regress pg_hba.conf is configured to allow replication connections. Pass the keyword parameter hba_permit_replication => 0 to disable this. +postgresql.conf can be set up for replication by passing the keyword +parameter allows_streaming => 1. This is disabled by default. + The new node is set up in a fast but unsafe configuration where fsync is disabled. @@ -360,7 +362,8 @@ sub init my $host = $self->host; $params{hba_permit_replication} = 1 - if (!defined($params{hba_permit_replication})); + unless defined $params{hba_permit_replication}; + $params{allows_streaming} = 0 unless defined $params{allows_streaming}; mkdir $self->backup_dir; mkdir $self->archive_dir; @@ -373,6 +376,19 @@ sub init print $conf "fsync = off\n"; print $conf "log_statement = all\n"; print $conf "port = $port\n"; + + if ($params{allows_streaming}) + { + print $conf "wal_level = hot_standby\n"; + print $conf "max_wal_senders = 5\n"; + print $conf "wal_keep_segments = 20\n"; + print $conf "max_wal_size = 128MB\n"; + print $conf "shared_buffers = 1MB\n"; + print $conf "wal_log_hints = on\n"; + print $conf "hot_standby = on\n"; + print $conf "max_connections = 10\n"; + } + if ($TestLib::windows_os) { print $conf "listen_addresses = '$host'\n"; @@ -384,7 +400,7 @@ sub init } close $conf; - $self->set_replication_conf if ($params{hba_permit_replication}); + $self->set_replication_conf if $params{hba_permit_replication}; } =pod @@ -446,6 +462,9 @@ Does not start the node after init. A recovery.conf is not created. +Streaming replication can be enabled on this node by passing the keyword +parameter has_streaming => 1. This is disabled by default. + The backup is copied, leaving the original unmodified. pg_hba.conf is unconditionally set to enable replication connections. @@ -453,12 +472,13 @@ unconditionally set to enable replication connections. sub init_from_backup { - my ($self, $root_node, $backup_name) = @_; + my ($self, $root_node, $backup_name, %params) = @_; my $backup_path = $root_node->backup_dir . '/' . $backup_name; my $port = $self->port; my $node_name = $self->name; my $root_name = $root_node->name; + $params{has_streaming} = 0 unless defined $params{has_streaming}; print "# Initializing node \"$node_name\" from backup \"$backup_name\" of node \"$root_name\"\n"; die "Backup \"$backup_name\" does not exist at $backup_path" @@ -479,6 +499,7 @@ sub init_from_backup port = $port )); $self->set_replication_conf; + $self->enable_streaming($root_node) if $params{has_streaming}; } =pod @@ -525,7 +546,7 @@ sub stop my $port = $self->port; my $pgdata = $self->data_dir; my $name = $self->name; - $mode = 'fast' if (!defined($mode)); + $mode = 'fast' unless defined $mode; print "### Stopping node \"$name\" using mode $mode\n"; TestLib::system_log('pg_ctl', '-D', $pgdata, '-m', $mode, 'stop'); $self->{_pid} = undef; @@ -536,7 +557,7 @@ sub stop =item $node->restart() -wrapper for pg_ctl -w restart +Wrapper for pg_ctl -w restart =cut @@ -553,6 +574,39 @@ sub restart $self->_update_pid; } +=pod + +=item $node->promote() + +Wrapper for pg_ctl promote + +=cut + +sub promote +{ + my ($self) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $logfile = $self->logfile; + my $name = $self->name; + print "### Promoting node \"$name\"\n"; + TestLib::system_log('pg_ctl', '-D', $pgdata, '-l', $logfile, + 'promote'); +} + +# Internal routine to enable streaming replication on a standby node. +sub enable_streaming +{ + my ($self, $root_node) = @_; + my $root_connstr = $root_node->connstr; + my $name = $self->name; + + print "### Enabling streaming replication for node \"$name\"\n"; + $self->append_conf('recovery.conf', qq( +primary_conninfo='$root_connstr application_name=$name' +standby_mode=on +)); +} # Internal method sub _update_pid @@ -632,7 +686,7 @@ sub DESTROY { my $self = shift; my $name = $self->name; - return if not defined $self->{_pid}; + return unless defined $self->{_pid}; print "### Signalling QUIT to $self->{_pid} for node \"$name\"\n"; TestLib::system_log('pg_ctl', 'kill', 'QUIT', $self->{_pid}); } @@ -789,6 +843,7 @@ Run a command on the node, then verify that $expected_sql appears in the server log file. Reads the whole log file so be careful when working with large log outputs. +The log file is truncated prior to running the command, however. =cut -- 2.40.0