diff options
Diffstat (limited to 'src/backend/access/transam/xlogreader.c')
-rw-r--r-- | src/backend/access/transam/xlogreader.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index cdcacc78037..cd3dd8cc5c0 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -275,22 +275,24 @@ XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr) } /* - * See if we can release the last record that was returned by - * XLogNextRecord(), if any, to free up space. + * Release the last record that was returned by XLogNextRecord(), if any, to + * free up space. Returns the LSN past the end of the record. */ -void +XLogRecPtr XLogReleasePreviousRecord(XLogReaderState *state) { DecodedXLogRecord *record; + XLogRecPtr next_lsn; if (!state->record) - return; + return InvalidXLogRecPtr; /* * Remove it from the decoded record queue. It must be the oldest item * decoded, decode_queue_head. */ record = state->record; + next_lsn = record->next_lsn; Assert(record == state->decode_queue_head); state->record = NULL; state->decode_queue_head = record->next; @@ -336,6 +338,8 @@ XLogReleasePreviousRecord(XLogReaderState *state) state->decode_buffer_tail = state->decode_buffer; } } + + return next_lsn; } /* @@ -907,6 +911,17 @@ err: */ state->abortedRecPtr = RecPtr; state->missingContrecPtr = targetPagePtr; + + /* + * If we got here without reporting an error, report one now so that + * XLogPrefetcherReadRecord() doesn't bring us back a second time and + * clobber the above state. Otherwise, the existing error takes + * precedence. + */ + if (!state->errormsg_buf[0]) + report_invalid_record(state, + "missing contrecord at %X/%X", + LSN_FORMAT_ARGS(RecPtr)); } if (decoded && decoded->oversized) |