Start Walreceiver completely before shut down it on standby server. The walreceiver will be shut down, when read an invalid record in the WAL streaming from master.And then, we retry from archive/pg_wal again.
After that, we start walreceiver in RequestXLogStreaming(), and read record from the WAL streaming. But before walreceiver starts, we read data from file which be streamed over and present in pg_wal by last time, because of walrcv->receivedUpto > RecPtr and the wal is actually flush on disk. Now, we read the invalid record again, what the next to do? Shut down the walreceiver and do it again. So, we always read the invalid record, starting the walreceiver and make it down before it starts completely. This code fix it by set the walrcv->receivedUpto to the starting point, we can read nothing before the walreceiver starts and streaming.
start_walreceiver.diff
Description: Binary data