summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorAlvaro Herrera2016-05-04 20:32:22 +0000
committerAlvaro Herrera2016-05-04 20:32:22 +0000
commitc1543a81a7a89207b6c45b8f3f7f07b1148fcc6e (patch)
tree4a19f5b8572e10fee45f184f4b977acbad393bca /src/test
parent6535bf399894db3597d257486062fe17311c642e (diff)
Revert timeline following in replication slots
This reverts commits f07d18b6e94d, 82c83b337202, 3a3b309041b0, and 24c5f1a103ce. This feature has shown enough immaturity that it was deemed better to rip it out before rushing some more fixes at the last minute. There are discussions on larger changes in this area for the next release.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/modules/Makefile1
-rw-r--r--src/test/modules/test_slot_timelines/.gitignore3
-rw-r--r--src/test/modules/test_slot_timelines/Makefile22
-rw-r--r--src/test/modules/test_slot_timelines/README19
-rw-r--r--src/test/modules/test_slot_timelines/expected/load_extension.out19
-rw-r--r--src/test/modules/test_slot_timelines/expected/load_extension_1.out7
-rw-r--r--src/test/modules/test_slot_timelines/sql/load_extension.sql7
-rw-r--r--src/test/modules/test_slot_timelines/test_slot_timelines--1.0.sql16
-rw-r--r--src/test/modules/test_slot_timelines/test_slot_timelines.c133
-rw-r--r--src/test/modules/test_slot_timelines/test_slot_timelines.conf2
-rw-r--r--src/test/modules/test_slot_timelines/test_slot_timelines.control5
-rw-r--r--src/test/recovery/Makefile2
-rw-r--r--src/test/recovery/t/006_logical_decoding_timelines.pl307
13 files changed, 0 insertions, 543 deletions
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
index d086163fabc..9b935521f47 100644
--- a/src/test/modules/Makefile
+++ b/src/test/modules/Makefile
@@ -14,7 +14,6 @@ SUBDIRS = \
test_parser \
test_rls_hooks \
test_shm_mq \
- test_slot_timelines \
worker_spi
all: submake-errcodes
diff --git a/src/test/modules/test_slot_timelines/.gitignore b/src/test/modules/test_slot_timelines/.gitignore
deleted file mode 100644
index 543c50d1bbd..00000000000
--- a/src/test/modules/test_slot_timelines/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-results/
-tmp_check/
-log/
diff --git a/src/test/modules/test_slot_timelines/Makefile b/src/test/modules/test_slot_timelines/Makefile
deleted file mode 100644
index 21757c5bcb7..00000000000
--- a/src/test/modules/test_slot_timelines/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# src/test/modules/test_slot_timelines/Makefile
-
-MODULES = test_slot_timelines
-PGFILEDESC = "test_slot_timelines - test utility for slot timeline following"
-
-EXTENSION = test_slot_timelines
-DATA = test_slot_timelines--1.0.sql
-
-EXTRA_INSTALL=contrib/test_decoding
-REGRESS=load_extension
-REGRESS_OPTS = --temp-config=$(top_srcdir)/src/test/modules/test_slot_timelines/test_slot_timelines.conf
-
-ifdef USE_PGXS
-PG_CONFIG = pg_config
-PGXS := $(shell $(PG_CONFIG) --pgxs)
-include $(PGXS)
-else
-subdir = src/test/modules/test_slot_timelines
-top_builddir = ../../../..
-include $(top_builddir)/src/Makefile.global
-include $(top_srcdir)/contrib/contrib-global.mk
-endif
diff --git a/src/test/modules/test_slot_timelines/README b/src/test/modules/test_slot_timelines/README
deleted file mode 100644
index 585f02f1e6e..00000000000
--- a/src/test/modules/test_slot_timelines/README
+++ /dev/null
@@ -1,19 +0,0 @@
-A test module for logical decoding failover and timeline following.
-
-This module provides a minimal way to maintain logical slots on replicas
-that mirror the state on the master. It doesn't make decoding possible,
-just tracking slot state so that a decoding client that's using the master
-can follow a physical failover to the standby. The master doesn't know
-about the slots on the standby, they're synced by a client that connects
-to both.
-
-This is intentionally not part of the test_decoding module because that's meant
-to serve as example code, where this module exercises internal server features
-by unsafely exposing internal state to SQL. It's not the right way to do
-failover, it's just a simple way to test it from the perl TAP framework to
-prove the feature works.
-
-In a practical implementation of this approach a bgworker on the master would
-monitor slot positions and relay them to a bgworker on the standby that applies
-the position updates without exposing slot internals to SQL. That's too complex
-for this test framework though.
diff --git a/src/test/modules/test_slot_timelines/expected/load_extension.out b/src/test/modules/test_slot_timelines/expected/load_extension.out
deleted file mode 100644
index 7c2ad9d7c19..00000000000
--- a/src/test/modules/test_slot_timelines/expected/load_extension.out
+++ /dev/null
@@ -1,19 +0,0 @@
-CREATE EXTENSION test_slot_timelines;
-SELECT test_slot_timelines_create_logical_slot('test_slot', 'test_decoding');
- test_slot_timelines_create_logical_slot
------------------------------------------
-
-(1 row)
-
-SELECT test_slot_timelines_advance_logical_slot('test_slot', txid_current()::text::xid, txid_current()::text::xid, pg_current_xlog_location(), pg_current_xlog_location());
- test_slot_timelines_advance_logical_slot
-------------------------------------------
-
-(1 row)
-
-SELECT pg_drop_replication_slot('test_slot');
- pg_drop_replication_slot
---------------------------
-
-(1 row)
-
diff --git a/src/test/modules/test_slot_timelines/expected/load_extension_1.out b/src/test/modules/test_slot_timelines/expected/load_extension_1.out
deleted file mode 100644
index 0db21e46d90..00000000000
--- a/src/test/modules/test_slot_timelines/expected/load_extension_1.out
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE EXTENSION test_slot_timelines;
-SELECT test_slot_timelines_create_logical_slot('test_slot', 'test_decoding');
-ERROR: replication slots can only be used if max_replication_slots > 0
-SELECT test_slot_timelines_advance_logical_slot('test_slot', txid_current()::text::xid, txid_current()::text::xid, pg_current_xlog_location(), pg_current_xlog_location());
-ERROR: replication slots can only be used if max_replication_slots > 0
-SELECT pg_drop_replication_slot('test_slot');
-ERROR: replication slots can only be used if max_replication_slots > 0
diff --git a/src/test/modules/test_slot_timelines/sql/load_extension.sql b/src/test/modules/test_slot_timelines/sql/load_extension.sql
deleted file mode 100644
index 24403552464..00000000000
--- a/src/test/modules/test_slot_timelines/sql/load_extension.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE EXTENSION test_slot_timelines;
-
-SELECT test_slot_timelines_create_logical_slot('test_slot', 'test_decoding');
-
-SELECT test_slot_timelines_advance_logical_slot('test_slot', txid_current()::text::xid, txid_current()::text::xid, pg_current_xlog_location(), pg_current_xlog_location());
-
-SELECT pg_drop_replication_slot('test_slot');
diff --git a/src/test/modules/test_slot_timelines/test_slot_timelines--1.0.sql b/src/test/modules/test_slot_timelines/test_slot_timelines--1.0.sql
deleted file mode 100644
index a1886f732f1..00000000000
--- a/src/test/modules/test_slot_timelines/test_slot_timelines--1.0.sql
+++ /dev/null
@@ -1,16 +0,0 @@
--- complain if script is sourced in psql, rather than via CREATE EXTENSION
-\echo Use "CREATE EXTENSION test_slot_timelines" to load this file. \quit
-
-CREATE OR REPLACE FUNCTION test_slot_timelines_create_logical_slot(slot_name text, plugin text)
-RETURNS void
-STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-COMMENT ON FUNCTION test_slot_timelines_create_logical_slot(text, text)
-IS 'Create a logical slot at a particular lsn and xid. Do not use in production servers, it is not safe. The slot is created with an invalid xmin and lsn.';
-
-CREATE OR REPLACE FUNCTION test_slot_timelines_advance_logical_slot(slot_name text, new_xmin xid, new_catalog_xmin xid, new_restart_lsn pg_lsn, new_confirmed_lsn pg_lsn)
-RETURNS void
-STRICT LANGUAGE c AS 'MODULE_PATHNAME';
-
-COMMENT ON FUNCTION test_slot_timelines_advance_logical_slot(text, xid, xid, pg_lsn, pg_lsn)
-IS 'Advance a logical slot directly. Do not use this in production servers, it is not safe.';
diff --git a/src/test/modules/test_slot_timelines/test_slot_timelines.c b/src/test/modules/test_slot_timelines/test_slot_timelines.c
deleted file mode 100644
index 1f074881d2f..00000000000
--- a/src/test/modules/test_slot_timelines/test_slot_timelines.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*--------------------------------------------------------------------------
- *
- * test_slot_timelines.c
- * Test harness code for slot timeline following
- *
- * Copyright (c) 2016, PostgreSQL Global Development Group
- *
- * IDENTIFICATION
- * src/test/modules/test_slot_timelines/test_slot_timelines.c
- *
- * -------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include "access/transam.h"
-#include "fmgr.h"
-#include "miscadmin.h"
-#include "replication/slot.h"
-#include "utils/builtins.h"
-#include "utils/pg_lsn.h"
-
-PG_MODULE_MAGIC;
-
-PG_FUNCTION_INFO_V1(test_slot_timelines_create_logical_slot);
-PG_FUNCTION_INFO_V1(test_slot_timelines_advance_logical_slot);
-
-static void clear_slot_transient_state(void);
-
-/*
- * Create a new logical slot, with invalid LSN and xid, directly. This does not
- * use the snapshot builder or logical decoding machinery. It's only intended
- * for creating a slot on a replica that mirrors the state of a slot on an
- * upstream master.
- *
- * Note that this is test harness code. You shouldn't expose slot internals
- * to SQL like this for any real world usage. See the README.
- */
-Datum
-test_slot_timelines_create_logical_slot(PG_FUNCTION_ARGS)
-{
- char *slotname = text_to_cstring(PG_GETARG_TEXT_P(0));
- char *plugin = text_to_cstring(PG_GETARG_TEXT_P(1));
-
- CheckSlotRequirements();
-
- ReplicationSlotCreate(slotname, true, RS_PERSISTENT);
-
- /* register the plugin name with the slot */
- StrNCpy(NameStr(MyReplicationSlot->data.plugin), plugin, NAMEDATALEN);
-
- /*
- * Initialize persistent state to placeholders to be set by
- * test_slot_timelines_advance_logical_slot .
- */
- MyReplicationSlot->data.xmin = InvalidTransactionId;
- MyReplicationSlot->data.catalog_xmin = InvalidTransactionId;
- MyReplicationSlot->data.restart_lsn = InvalidXLogRecPtr;
- MyReplicationSlot->data.confirmed_flush = InvalidXLogRecPtr;
-
- clear_slot_transient_state();
-
- ReplicationSlotRelease();
-
- PG_RETURN_VOID();
-}
-
-/*
- * Set the state of a slot.
- *
- * This doesn't maintain the non-persistent state at all,
- * but since the slot isn't in use that's OK.
- *
- * There's intentionally no check to prevent slots going backwards
- * because they can actually go backwards if the master crashes when
- * it hasn't yet flushed slot state to disk then we copy the older
- * slot state after recovery.
- *
- * There's no checking done for xmin or catalog xmin either, since
- * we can't really do anything useful that accounts for xid wrap-around.
- *
- * Note that this is test harness code. You shouldn't expose slot internals
- * to SQL like this for any real world usage. See the README.
- */
-Datum
-test_slot_timelines_advance_logical_slot(PG_FUNCTION_ARGS)
-{
- char *slotname = text_to_cstring(PG_GETARG_TEXT_P(0));
- TransactionId new_xmin = DatumGetTransactionId(PG_GETARG_DATUM(1));
- TransactionId new_catalog_xmin = DatumGetTransactionId(PG_GETARG_DATUM(2));
- XLogRecPtr restart_lsn = PG_GETARG_LSN(3);
- XLogRecPtr confirmed_lsn = PG_GETARG_LSN(4);
-
- CheckSlotRequirements();
-
- ReplicationSlotAcquire(slotname);
-
- if (MyReplicationSlot->data.database != MyDatabaseId)
- elog(ERROR, "trying to update a slot on a different database");
-
- MyReplicationSlot->data.xmin = new_xmin;
- MyReplicationSlot->data.catalog_xmin = new_catalog_xmin;
- MyReplicationSlot->data.restart_lsn = restart_lsn;
- MyReplicationSlot->data.confirmed_flush = confirmed_lsn;
-
- clear_slot_transient_state();
-
- ReplicationSlotMarkDirty();
- ReplicationSlotSave();
- ReplicationSlotRelease();
-
- ReplicationSlotsComputeRequiredXmin(false);
- ReplicationSlotsComputeRequiredLSN();
-
- PG_RETURN_VOID();
-}
-
-static void
-clear_slot_transient_state(void)
-{
- Assert(MyReplicationSlot != NULL);
-
- /*
- * Make sure the slot state is the same as if it were newly loaded from
- * disk on recovery.
- */
- MyReplicationSlot->effective_xmin = MyReplicationSlot->data.xmin;
- MyReplicationSlot->effective_catalog_xmin = MyReplicationSlot->data.catalog_xmin;
-
- MyReplicationSlot->candidate_catalog_xmin = InvalidTransactionId;
- MyReplicationSlot->candidate_xmin_lsn = InvalidXLogRecPtr;
- MyReplicationSlot->candidate_restart_lsn = InvalidXLogRecPtr;
- MyReplicationSlot->candidate_restart_valid = InvalidXLogRecPtr;
-}
diff --git a/src/test/modules/test_slot_timelines/test_slot_timelines.conf b/src/test/modules/test_slot_timelines/test_slot_timelines.conf
deleted file mode 100644
index 56b46d7e275..00000000000
--- a/src/test/modules/test_slot_timelines/test_slot_timelines.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-max_replication_slots=2
-wal_level=logical
diff --git a/src/test/modules/test_slot_timelines/test_slot_timelines.control b/src/test/modules/test_slot_timelines/test_slot_timelines.control
deleted file mode 100644
index dcee1a72576..00000000000
--- a/src/test/modules/test_slot_timelines/test_slot_timelines.control
+++ /dev/null
@@ -1,5 +0,0 @@
-# test_slot_timelines extension
-comment = 'Test utility for slot timeline following and logical decoding'
-default_version = '1.0'
-module_pathname = '$libdir/test_slot_timelines'
-relocatable = true
diff --git a/src/test/recovery/Makefile b/src/test/recovery/Makefile
index 78570dd1566..929071909ad 100644
--- a/src/test/recovery/Makefile
+++ b/src/test/recovery/Makefile
@@ -9,8 +9,6 @@
#
#-------------------------------------------------------------------------
-EXTRA_INSTALL=contrib/test_decoding src/test/modules/test_slot_timelines
-
subdir = src/test/recovery
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
diff --git a/src/test/recovery/t/006_logical_decoding_timelines.pl b/src/test/recovery/t/006_logical_decoding_timelines.pl
deleted file mode 100644
index a3a4b6150ae..00000000000
--- a/src/test/recovery/t/006_logical_decoding_timelines.pl
+++ /dev/null
@@ -1,307 +0,0 @@
-# Demonstrate that logical can follow timeline switches.
-#
-# Logical replication slots can follow timeline switches but it's
-# normally not possible to have a logical slot on a replica where
-# promotion and a timeline switch can occur. The only ways
-# we can create that circumstance are:
-#
-# * By doing a filesystem-level copy of the DB, since pg_basebackup
-# excludes pg_replslot but we can copy it directly; or
-#
-# * by creating a slot directly at the C level on the replica and
-# advancing it as we go using the low level APIs. It can't be done
-# from SQL since logical decoding isn't allowed on replicas.
-#
-# This module uses the first approach to show that timeline following
-# on a logical slot works.
-#
-use strict;
-use warnings;
-
-use PostgresNode;
-use TestLib;
-use Test::More tests => 20;
-use RecursiveCopy;
-use File::Copy;
-
-my ($stdout, $stderr, $ret);
-
-# Initialize master node
-my $node_master = get_new_node('master');
-$node_master->init(allows_streaming => 1, has_archiving => 1);
-$node_master->append_conf('postgresql.conf', "wal_level = 'logical'\n");
-$node_master->append_conf('postgresql.conf', "max_replication_slots = 2\n");
-$node_master->append_conf('postgresql.conf', "max_wal_senders = 2\n");
-$node_master->append_conf('postgresql.conf', "log_min_messages = 'debug2'\n");
-$node_master->dump_info;
-$node_master->start;
-
-diag "Testing logical timeline following with a filesystem-level copy";
-
-$node_master->safe_psql('postgres',
-"SELECT pg_create_logical_replication_slot('before_basebackup', 'test_decoding');"
-);
-$node_master->safe_psql('postgres', "CREATE TABLE decoding(blah text);");
-$node_master->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('beforebb');");
-$node_master->safe_psql('postgres', 'CHECKPOINT;');
-
-my $backup_name = 'b1';
-$node_master->backup_fs_hot($backup_name);
-
-my $node_replica = get_new_node('replica');
-$node_replica->init_from_backup(
- $node_master, $backup_name,
- has_streaming => 1,
- has_restoring => 1);
-$node_replica->start;
-
-$node_master->safe_psql('postgres',
-"SELECT pg_create_logical_replication_slot('after_basebackup', 'test_decoding');"
-);
-$node_master->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('afterbb');");
-$node_master->safe_psql('postgres', 'CHECKPOINT;');
-
-# Verify that only the before base_backup slot is on the replica
-$stdout = $node_replica->safe_psql('postgres',
- 'SELECT slot_name FROM pg_replication_slots ORDER BY slot_name');
-is($stdout, 'before_basebackup',
- 'Expected to find only slot before_basebackup on replica');
-
-# Boom, crash
-$node_master->stop('immediate');
-
-$node_replica->promote;
-$node_replica->poll_query_until('postgres',
- "SELECT NOT pg_is_in_recovery();");
-
-$node_replica->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('after failover');");
-
-# Shouldn't be able to read from slot created after base backup
-($ret, $stdout, $stderr) = $node_replica->psql('postgres',
-"SELECT data FROM pg_logical_slot_peek_changes('after_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');"
-);
-is($ret, 3, 'replaying from after_basebackup slot fails');
-like(
- $stderr,
- qr/replication slot "after_basebackup" does not exist/,
- 'after_basebackup slot missing');
-
-# Should be able to read from slot created before base backup
-($ret, $stdout, $stderr) = $node_replica->psql(
- 'postgres',
-"SELECT data FROM pg_logical_slot_peek_changes('before_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');",
- timeout => 30);
-is($ret, 0, 'replay from slot before_basebackup succeeds');
-is( $stdout, q(BEGIN
-table public.decoding: INSERT: blah[text]:'beforebb'
-COMMIT
-BEGIN
-table public.decoding: INSERT: blah[text]:'afterbb'
-COMMIT
-BEGIN
-table public.decoding: INSERT: blah[text]:'after failover'
-COMMIT), 'decoded expected data from slot before_basebackup');
-is($stderr, '', 'replay from slot before_basebackup produces no stderr');
-
-# We don't need the standby anymore
-$node_replica->teardown_node();
-
-
-# OK, time to try the same thing again, but this time we'll be using slot
-# mirroring on the standby and a pg_basebackup of the master.
-
-diag "Testing logical timeline following with test_slot_timelines module";
-
-$node_master->start();
-
-# Clean up after the last test
-$node_master->safe_psql('postgres', 'DELETE FROM decoding;');
-is( $node_master->psql(
- 'postgres',
-'SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots;'),
- 0,
- 'dropping slots succeeds via pg_drop_replication_slot');
-
-# Same as before, we'll make one slot before basebackup, one after. This time
-# the basebackup will be with pg_basebackup so it'll omit both slots, then
-# we'll use SQL functions provided by the test_slot_timelines test module to sync
-# them to the replica, do some work, sync them and fail over then test again.
-# This time we should have both the before- and after-basebackup slots working.
-
-is( $node_master->psql(
- 'postgres',
-"SELECT pg_create_logical_replication_slot('before_basebackup', 'test_decoding');"
- ),
- 0,
- 'creating slot before_basebackup succeeds');
-
-$node_master->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('beforebb');");
-
-$backup_name = 'b2';
-$node_master->backup($backup_name);
-
-is( $node_master->psql(
- 'postgres',
-"SELECT pg_create_logical_replication_slot('after_basebackup', 'test_decoding');"
- ),
- 0,
- 'creating slot after_basebackup succeeds');
-
-$node_master->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('afterbb');");
-
-$node_replica = get_new_node('replica2');
-$node_replica->init_from_backup(
- $node_master, $backup_name,
- has_streaming => 1,
- has_restoring => 1);
-
-$node_replica->start;
-
-# Verify the slots are both absent on the replica
-$stdout = $node_replica->safe_psql('postgres',
- 'SELECT slot_name FROM pg_replication_slots ORDER BY slot_name');
-is($stdout, '', 'No slots exist on the replica');
-
-# Now do our magic to sync the slot states across. Normally
-# this would be being done continuously by a bgworker but
-# we're just doing it by hand for this test. This is exposing
-# postgres innards to SQL so it's unsafe except for testing.
-$node_master->safe_psql('postgres', 'CREATE EXTENSION test_slot_timelines;');
-
-my $slotinfo = $node_master->safe_psql(
- 'postgres',
- qq{SELECT slot_name, plugin,
- COALESCE(xmin, '0'), catalog_xmin,
- restart_lsn, confirmed_flush_lsn
- FROM pg_replication_slots ORDER BY slot_name}
-);
-diag "Copying slots to replica";
-open my $fh, '<', \$slotinfo or die $!;
-while (<$fh>)
-{
- print $_;
- chomp $_;
- my ($slot_name, $plugin, $xmin, $catalog_xmin, $restart_lsn,
- $confirmed_flush_lsn)
- = map { "'$_'" } split qr/\|/, $_;
-
- print
-"# Copying slot $slot_name,$plugin,$xmin,$catalog_xmin,$restart_lsn,$confirmed_flush_lsn\n";
- $node_replica->safe_psql('postgres',
- "SELECT test_slot_timelines_create_logical_slot($slot_name, $plugin);"
- );
- $node_replica->safe_psql('postgres',
-"SELECT test_slot_timelines_advance_logical_slot($slot_name, $xmin, $catalog_xmin, $restart_lsn, $confirmed_flush_lsn);"
- );
-}
-close $fh or die $!;
-
-# Now both slots are present on the replica and exactly match the master
-$stdout = $node_replica->safe_psql('postgres',
- 'SELECT slot_name FROM pg_replication_slots ORDER BY slot_name');
-is( $stdout,
- "after_basebackup\nbefore_basebackup",
- 'both slots now exist on replica');
-
-$stdout = $node_replica->safe_psql(
- 'postgres',
- qq{SELECT slot_name, plugin, COALESCE(xmin, '0'), catalog_xmin,
- restart_lsn, confirmed_flush_lsn
- FROM pg_replication_slots
- ORDER BY slot_name});
-is($stdout, $slotinfo,
- "slot data read back from replica matches slot data on master");
-
-# We now have to copy some extra WAL to satisfy the requirements of the oldest
-# replication slot. pg_basebackup doesn't know to copy the extra WAL for slots
-# so we have to help out. We know the WAL is still retained on the master
-# because we haven't advanced the slots there.
-#
-# Figure out what the oldest segment we need is by looking at the restart_lsn
-# of the oldest slot.
-#
-# It only makes sense to do this once the slots are created on the replica,
-# otherwise it might just delete the segments again.
-
-my $oldest_needed_segment = $node_master->safe_psql(
- 'postgres',
- qq{SELECT pg_xlogfile_name((
- SELECT restart_lsn
- FROM pg_replication_slots
- ORDER BY restart_lsn ASC
- LIMIT 1
- ));}
-);
-
-diag "oldest needed xlog seg is $oldest_needed_segment ";
-
-# WAL segment names sort lexically so we can just grab everything > than this
-# segment.
-opendir(my $pg_xlog, $node_master->data_dir . "/pg_xlog") or die $!;
-while (my $seg = readdir $pg_xlog)
-{
- next if $seg eq '.' or $seg eq '..';
- next unless $seg >= $oldest_needed_segment && $seg =~ /^[0-9]{24}/;
- diag "copying xlog seg $seg";
- copy(
- $node_master->data_dir . "/pg_xlog/" . $seg,
- $node_replica->data_dir . "/pg_xlog/" . $seg
- ) or die "copy of xlog seg $seg failed: $!";
-}
-closedir $pg_xlog;
-
-# Boom, crash the master
-$node_master->stop('immediate');
-
-$node_replica->promote;
-$node_replica->poll_query_until('postgres',
- "SELECT NOT pg_is_in_recovery();");
-
-$node_replica->safe_psql('postgres',
- "INSERT INTO decoding(blah) VALUES ('after failover');");
-
-# This time we can read from both slots
-($ret, $stdout, $stderr) = $node_replica->psql(
- 'postgres',
-"SELECT data FROM pg_logical_slot_peek_changes('after_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');",
- timeout => 30);
-is($ret, 0, 'replay from slot after_basebackup succeeds');
-is( $stdout, q(BEGIN
-table public.decoding: INSERT: blah[text]:'afterbb'
-COMMIT
-BEGIN
-table public.decoding: INSERT: blah[text]:'after failover'
-COMMIT), 'decoded expected data from slot after_basebackup');
-is($stderr, '', 'replay from slot after_basebackup produces no stderr');
-
-# Should be able to read from slot created before base backup
-#
-# This would fail with an error about missing WAL segments if we hadn't
-# copied extra WAL earlier.
-($ret, $stdout, $stderr) = $node_replica->psql(
- 'postgres',
-"SELECT data FROM pg_logical_slot_peek_changes('before_basebackup', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');",
- timeout => 30);
-is($ret, 0, 'replay from slot before_basebackup succeeds');
-is( $stdout, q(BEGIN
-table public.decoding: INSERT: blah[text]:'beforebb'
-COMMIT
-BEGIN
-table public.decoding: INSERT: blah[text]:'afterbb'
-COMMIT
-BEGIN
-table public.decoding: INSERT: blah[text]:'after failover'
-COMMIT), 'decoded expected data from slot before_basebackup');
-is($stderr, '', 'replay from slot before_basebackup produces no stderr');
-
-($ret, $stdout, $stderr) = $node_replica->psql('postgres',
- 'SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots;');
-is($ret, 0, 'dropping slots succeeds via pg_drop_replication_slot');
-is($stderr, '', 'dropping slots produces no stderr output');
-
-1;