Thread

  1. Re: pg_recvlogical: Prevent flushed data from being re-sent after restarting replication

    Mircea Cadariu <cadariu.mircea@gmail.com> — 2025-11-19T19:57:11Z

    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