receivelog_flushpos.patch

application/octet-stream

Filename: receivelog_flushpos.patch
Type: application/octet-stream
Part: 0
Message: Re: pg_receivexlog and feedback message

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/bin/pg_basebackup/receivelog.c 16 2
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)
 				{
 					/*