use PostgresNode;
use TestLib;
-use Test::More tests => 17;
+use Test::More tests => 20;
my $psql_out = '';
my $psql_rc = '';
+sub configure_and_reload
+{
+ my ($node, $parameter) = @_;
+ my $name = $node->name;
+
+ $node->append_conf(
+ 'postgresql.conf', qq(
+ $parameter
+ ));
+ $node->psql('postgres', "SELECT pg_reload_conf()",
+ stdout => \$psql_out);
+ is($psql_out, 't', "reload node $name with $parameter");
+}
+
# Set up two nodes, which will alternately be master and replication slave.
# Setup london node
has_streaming => 1);
$node_paris->start;
-# Switch to synchronous replication
-$node_london->append_conf(
- 'postgresql.conf', qq(
- synchronous_standby_names = '*'
-));
-$node_london->psql('postgres', "SELECT pg_reload_conf()",
- stdout => \$psql_out);
-is($psql_out, 't', 'Enable synchronous replication');
+# Switch to synchronous replication in both directions
+configure_and_reload($node_london, "synchronous_standby_names = 'paris'");
+configure_and_reload($node_paris, "synchronous_standby_names = 'london'");
+# Set up nonce names for current master and slave nodes
note "Initially, london is master and paris is slave";
my ($cur_master, $cur_slave) = ($node_london, $node_paris);
my $cur_master_name = $cur_master->name;
($cur_master, $cur_slave) = ($node_paris, $node_london);
$cur_master_name = $cur_master->name;
-$psql_rc = $cur_master->psql('postgres', "COMMIT PREPARED 'xact_009_10'");
+# because london is not running at this point, we can't use syncrep commit
+# on this command
+$psql_rc = $cur_master->psql('postgres',
+ "SET synchronous_commit = off; COMMIT PREPARED 'xact_009_10'");
is($psql_rc, '0', "Restore of prepared transaction on promoted slave");
# restart old master as new slave
$cur_master->psql('postgres', "COMMIT PREPARED 'xact_009_12'");
###############################################################################
-# Check for a lock conflict between prepared transaction with DDL inside and replay of
-# XLOG_STANDBY_LOCK wal record.
+# Check for a lock conflict between prepared transaction with DDL inside and
+# replay of XLOG_STANDBY_LOCK wal record.
###############################################################################
$cur_master->psql(
$cur_slave->psql(
'postgres',
- "SELECT count(*) FROM pg_prepared_xacts",
+ "SELECT count(*) FROM t_009_tbl2",
stdout => \$psql_out);
-is($psql_out, '0', "Replay prepared transaction with DDL");
+is($psql_out, '1', "Replay prepared transaction with DDL");
###############################################################################
# Verify expected data appears on both servers.
###############################################################################
+$cur_master->psql(
+ 'postgres',
+ "SELECT count(*) FROM pg_prepared_xacts",
+ stdout => \$psql_out);
+is($psql_out, '0', "No uncommitted prepared transactions on master");
+
$cur_master->psql(
'postgres',
"SELECT * FROM t_009_tbl ORDER BY id",
is($psql_out, qq{27|issued to paris},
"Check expected t_009_tbl2 data on master");
+$cur_slave->psql(
+ 'postgres',
+ "SELECT count(*) FROM pg_prepared_xacts",
+ stdout => \$psql_out);
+is($psql_out, '0', "No uncommitted prepared transactions on slave");
+
$cur_slave->psql(
'postgres',
"SELECT * FROM t_009_tbl ORDER BY id",