On 19/11/2025 14:54, Fujii Masao wrote:

With the patch applied, these duplicate records no longer appear in
the pg_recvlogical output.

Thanks! Works like a charm. I confirm duplicates no longer appear with the patch applied.

You can consider adding a test about this in "030_pg_recvlogical.pl", proposal below:


use IPC::Run qw(start);
my $outfile = $node->basedir . '/reconnect.out';

$node->command_ok(
    [
        'pg_recvlogical',
        '--slot' => 'reconnect_test',
        '--dbname' => $node->connstr('postgres'),
        '--create-slot',
    ],
    'slot created for reconnection test');

$node->safe_psql('postgres', 'CREATE TABLE t(x int);');
$node->safe_psql('postgres', 'INSERT INTO t VALUES (1);');

my $recv = start [
    'pg_recvlogical',
    '--slot', 'reconnect_test',
    '--dbname', $node->connstr('postgres'),
    '--start',
    '--file', $outfile,
    '--fsync-interval', '1',
    '--status-interval', '60',
    '--verbose'
], '>', \my $out, '2>', \my $err;

sleep(3);

my $backend_pid = $node->safe_psql('postgres',
    "SELECT active_pid FROM pg_replication_slots WHERE slot_name = 'reconnect_test'");

if ($backend_pid ne '')
{
    $node->safe_psql('postgres', "SELECT pg_terminate_backend($backend_pid)");
}

sleep(6);

$node->safe_psql('postgres', 'INSERT INTO t VALUES (2);');

sleep(3);

$recv->signal('TERM');
$recv->finish();

open(my $file, '<', $outfile);
my $count = 0;
while (<$file>) {
    if (/INSERT/) {
        $count = $count + 1;
    }
}
close($file);

cmp_ok($count, '==', 2, 'two INSERTs');

$node->command_ok(
    [
        'pg_recvlogical',
        '--slot' => 'reconnect_test',
        '--dbname' => $node->connstr('postgres'),
        '--drop-slot'
    ],
    'reconnect_test slot dropped');


--
Regards,
Mircea Cadariu



Reply via email to