Thread
-
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