Attached is a v2 patch that implements the "handshake clamp" approach
Xuneng suggested. Rather than tracking lastStreamedFlush in
process-local state (which doesn't survive a cascade restart, as
Fujii-san demonstrated), it uses the WAL flush position already
returned by IDENTIFY_SYSTEM.
The walreceiver now checks the upstream's flush position before issuing
START_REPLICATION. If the requested startpoint is ahead (on the same
timeline), it waits for wal_retrieve_retry_interval and retries. This
works across restarts since it queries the upstream's live position on
every connection attempt, and requires no new state variables.
When timelines differ, we let START_REPLICATION handle the timeline
negotiation as before.
The patch includes a TAP test (
053_cascade_reconnect.pl) that
reproduces the scenario and verifies the fix.