diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index a51a40e..cd71721 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -274,6 +274,7 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline, char *sysi int walfile = -1; int64 last_status = -1; XLogRecPtr blockpos = InvalidXLogRecPtr; + XLogRecPtr flushedpos = InvalidXLogRecPtr; if (sysidentifier != NULL) { @@ -359,8 +360,8 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline, char *sysi char replybuf[sizeof(StandbyReplyMessage) + 1]; StandbyReplyMessage *replymsg = (StandbyReplyMessage *) (replybuf + 1); - replymsg->write = InvalidXLogRecPtr; - replymsg->flush = InvalidXLogRecPtr; + replymsg->write = blockpos; + replymsg->flush = flushedpos; replymsg->apply = InvalidXLogRecPtr; replymsg->sendTime = now; replybuf[0] = 'r'; @@ -552,6 +553,19 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline, char *sysi walfile = -1; xlogoff = 0; + /* + * Set flushed position to the last byte in the previous + * file. Per above we know that xrecoff%XLOG_SEG_SIZE=0 + */ + flushedpos = blockpos; + if (flushedpos.xrecoff == 0) + { + flushedpos.xlogid--; + flushedpos.xrecoff = XLogFileSize-1; + } + else + flushedpos.xrecoff--; + if (stream_stop != NULL) { /*