diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2016-03-30 20:07:05 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2016-03-30 20:07:05 -0300 |
commit | 24c5f1a103ce6656a5cb430d9a996c34e61ab2a5 (patch) | |
tree | c55425aba03671efba7b59497f9fad55d021411a /src/include/access/xlogreader.h | |
parent | 3b02ea4f0780ccce7dc116010201dad7ee50a401 (diff) |
Enable logical slots to follow timeline switches
When decoding from a logical slot, it's necessary for xlog reading to be
able to read xlog from historical (i.e. not current) timelines;
otherwise, decoding fails after failover, because the archives are in
the historical timeline. This is required to make "failover logical
slots" possible; it currently has no other use, although theoretically
it could be used by an extension that creates a slot on a standby and
continues to replay from the slot when the standby is promoted.
This commit includes a module in src/test/modules with functions to
manipulate the slots (which is not otherwise possible in SQL code) in
order to enable testing, and a new test in src/test/recovery to ensure
that the behavior is as expected.
Author: Craig Ringer
Reviewed-By: Oleksii Kliukin, Andres Freund, Petr JelĂnek
Diffstat (limited to 'src/include/access/xlogreader.h')
-rw-r--r-- | src/include/access/xlogreader.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index deaa7f5128b..300747dbf76 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -27,6 +27,10 @@ #include "access/xlogrecord.h" +#ifndef FRONTEND +#include "nodes/pg_list.h" +#endif + typedef struct XLogReaderState XLogReaderState; /* Function type definition for the read_page callback */ @@ -160,11 +164,25 @@ struct XLogReaderState /* beginning of the WAL record being read. */ XLogRecPtr currRecPtr; + /* timeline to read it from, 0 if a lookup is required */ + TimeLineID currTLI; + /* + * Safe point to read to in currTLI. If currTLI is historical, then this + * is set to the end of the last whole segment that contains that TLI; + * if currTLI is ThisTimeLineID, this is InvalidXLogRecPtr. This is *not* + * the tliSwitchPoint. + */ + XLogRecPtr currTLIValidUntil; /* Buffer for current ReadRecord result (expandable) */ char *readRecordBuf; uint32 readRecordBufSize; +#ifndef FRONTEND + /* cached timeline history, only available in backend */ + List *timelineHistory; +#endif + /* Buffer to hold error message */ char *errormsg_buf; }; |