summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
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;