Re: BUG: Cascading standby fails to reconnect after falling back to archive recovery

Xuneng Zhou <xunengzhou@gmail.com>

From: Xuneng Zhou <xunengzhou@gmail.com>
To: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Cc: Fujii Masao <masao.fujii@gmail.com>, pgsql-hackers@postgresql.org
Date: 2026-03-21T10:07:16Z
Lists: pgsql-hackers
On Fri, Mar 20, 2026 at 8:40 PM Marco Nenciarini
<marco.nenciarini@enterprisedb.com> wrote:
>
> On Fri, Mar 20, 2026 at 4:33 AM Xuneng Zhou <xunengzhou@gmail.com> wrote:
> >
> > After taking a closer look, I'm less certain about this. I'll
> > investigate further. Could you also explain why you think this is the
> > case?
>
> The mechanism is in RequestXLogStreaming (walreceiverfuncs.c, around
> line 276): it explicitly truncates recptr to the segment start before
> passing it to the walreceiver.  So even when both nodes have replayed
> the same records, the cascade's startpoint lands at the beginning of
> the next segment while the upstream's GetStandbyFlushRecPtr returns
> replayPtr somewhere inside the current one.
>
> I covered this in more detail in my reply to your previous message.
>
> Best regards,
> Marco
>

if (XLogSegmentOffset(recptr, wal_segment_size) != 0)
    recptr -= XLogSegmentOffset(recptr, wal_segment_size);

I think this rounds down to the start of segment that contains
targetPagePtr + reqLen. It does not round up.  So if both standby have
replayed the same record, the cascade's startpoint would land at the
beginning of the current segment, which will provide a legitimate LSN
to upstream server. This case would be fine. Am I missing something
here?

-- 
Best,
Xuneng



Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Fix scenario where streaming standby gets stuck at a continuation record.

  2. Allow a streaming replication standby to follow a timeline switch.