Change pg_last_xlog_receive_location() not to move backwards. That makes

it a lot more useful for determining which standby is most up-to-date,
for example. There was long discussions on whether overwriting existing
existing WAL makes sense to begin with, and whether we should do some more
extensive variable renaming, but this change nevertheless seems quite
uncontroversial.

Fujii Masao, reviewed by Jeff Janes, Robert Haas, Stephen Frost.
This commit is contained in:
Heikki Linnakangas 2011-03-01 20:46:57 +02:00
parent 47ad79122b
commit 6eba5a7c57
4 changed files with 29 additions and 13 deletions

View File

@ -14179,10 +14179,8 @@ postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
<entry><type>text</type></entry>
<entry>Get last transaction log location received and synced to disk by
streaming replication. While streaming replication is in progress
this will increase monotonically. But when streaming replication is
restarted this will back off to the replication starting position,
typically the beginning of the WAL file containing the current
replay location. If recovery has completed this will remain static at
this will increase monotonically. If recovery has completed this will
remain static at
the value of the last WAL record received and synced to disk during
recovery. If streaming replication is disabled, or if it has not yet
started, the function returns NULL.

View File

@ -218,7 +218,7 @@ WalReceiverMain(void)
/* Fetch information required to start streaming */
strlcpy(conninfo, (char *) walrcv->conninfo, MAXCONNINFO);
startpoint = walrcv->receivedUpto;
startpoint = walrcv->receiveStart;
SpinLockRelease(&walrcv->mutex);
/* Arrange to clean up at walreceiver exit */
@ -558,8 +558,11 @@ XLogWalRcvFlush(bool dying)
/* Update shared-memory status */
SpinLockAcquire(&walrcv->mutex);
walrcv->latestChunkStart = walrcv->receivedUpto;
walrcv->receivedUpto = LogstreamResult.Flush;
if (XLByteLT(walrcv->receivedUpto, LogstreamResult.Flush))
{
walrcv->latestChunkStart = walrcv->receivedUpto;
walrcv->receivedUpto = LogstreamResult.Flush;
}
SpinLockRelease(&walrcv->mutex);
/* Signal the startup process that new WAL has arrived */

View File

@ -199,8 +199,17 @@ RequestXLogStreaming(XLogRecPtr recptr, const char *conninfo)
walrcv->walRcvState = WALRCV_STARTING;
walrcv->startTime = now;
walrcv->receivedUpto = recptr;
walrcv->latestChunkStart = recptr;
/*
* If this is the first startup of walreceiver, we initialize
* receivedUpto and latestChunkStart to receiveStart.
*/
if (walrcv->receiveStart.xlogid == 0 &&
walrcv->receiveStart.xrecoff == 0)
{
walrcv->receivedUpto = recptr;
walrcv->latestChunkStart = recptr;
}
walrcv->receiveStart = recptr;
SpinLockRelease(&walrcv->mutex);

View File

@ -51,12 +51,18 @@ typedef struct
WalRcvState walRcvState;
pg_time_t startTime;
/*
* receiveStart is the first byte position that will be received.
* When startup process starts the walreceiver, it sets receiveStart
* to the point where it wants the streaming to begin.
*/
XLogRecPtr receiveStart;
/*
* receivedUpto-1 is the last byte position that has already been
* received. When startup process starts the walreceiver, it sets
* receivedUpto to the point where it wants the streaming to begin. After
* that, walreceiver updates this whenever it flushes the received WAL to
* disk.
* received. At the first startup of walreceiver, receivedUpto is
* set to receiveStart. After that, walreceiver updates this whenever
* it flushes the received WAL to disk.
*/
XLogRecPtr receivedUpto;