67 elog(elevel,
"page %u of relation %s is uninitialized",
70 elog(elevel,
"page %u of relation %s does not exist",
95 elog(
PANIC,
"WAL contains references to invalid pages");
106 if (invalid_page_tab ==
NULL)
111 memset(&ctl, 0,
sizeof(ctl));
115 invalid_page_tab =
hash_create(
"XLOG invalid-page table",
146 if (invalid_page_tab ==
NULL)
161 elog(
DEBUG2,
"page %u of relation %s has been dropped",
167 (
void *) &hentry->
key,
181 if (invalid_page_tab ==
NULL)
194 elog(
DEBUG2,
"page %u of relation %s has been dropped",
200 (
void *) &hentry->
key,
211 if (invalid_page_tab !=
NULL &&
223 bool foundone =
false;
225 if (invalid_page_tab ==
NULL)
242 elog(
PANIC,
"WAL contains references to invalid pages");
245 invalid_page_tab =
NULL;
341 elog(
PANIC,
"failed to locate backup block with ID %d", block_id);
350 if (willinit && !zeromode)
351 elog(
PANIC,
"block with WILL_INIT flag in WAL record must be zeroed by redo routine");
352 if (!willinit && zeromode)
353 elog(
PANIC,
"block to be initialized in redo routine must be marked with WILL_INIT flag in the WAL record");
362 elog(
ERROR,
"failed to restore block image");
393 if (get_cleanup_lock)
459 if (blkno < lastblock)
678 if (sendFile < 0 || !
XLByteInSeg(recptr, sendSegNo))
696 errmsg(
"requested WAL segment %s has already been removed",
701 errmsg(
"could not open file \"%s\": %m",
708 if (sendOff != startoff)
710 if (lseek(sendFile, (off_t) startoff, SEEK_SET) < 0)
718 errmsg(
"could not seek in log segment %s to offset %u: %m",
730 readbytes =
read(sendFile, p, segbytes);
739 errmsg(
"could not read from log segment %s, offset %u, length %lu: %m",
740 path, sendOff, (
unsigned long) segbytes)));
746 sendOff += readbytes;
765 int reqLen,
XLogRecPtr targetRecPtr,
char *cur_page,
772 loc = targetPagePtr + reqLen;
790 if (loc <= read_upto)
797 if (targetPagePtr + XLOG_BLCKSZ <= read_upto)
805 else if (targetPagePtr + reqLen > read_upto)
813 count = read_upto - targetPagePtr;
821 XLogRead(cur_page, *pageTLI, targetPagePtr, XLOG_BLCKSZ);
bool XLogHaveInvalidPages(void)
void XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, BlockNumber nblocks)
#define BUFFER_LOCK_UNLOCK
void hash_destroy(HTAB *hashp)
void LockBufferForCleanup(Buffer buffer)
#define relpathperm(rnode, forknum)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
void smgrclearowner(SMgrRelation *owner, SMgrRelation reln)
struct xl_invalid_page xl_invalid_page
#define XLogRecHasBlockImage(decoder, block_id)
void MarkBufferDirty(Buffer buffer)
static void forget_invalid_pages_db(Oid dbid)
struct SMgrRelationData * rd_smgr
void XLogCheckInvalidPages(void)
Buffer XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, BlockNumber blkno, ReadBufferMode mode)
Buffer ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static void XLogRead(char *buf, TimeLineID tli, XLogRecPtr startptr, Size count)
struct xl_invalid_page_key xl_invalid_page_key
long hash_get_num_entries(HTAB *hashp)
XLogRecPtr GetFlushRecPtr(void)
void ReleaseBuffer(Buffer buffer)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
#define BUFFER_LOCK_EXCLUSIVE
bool RecoveryInProgress(void)
#define RELPERSISTENCE_PERMANENT
int read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *cur_page, TimeLineID *pageTLI)
void pg_usleep(long microsec)
struct RelationData * Relation
void pfree(void *pointer)
static void report_invalid_page(int elevel, RelFileNode node, ForkNumber forkno, BlockNumber blkno, bool present)
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
static void log_invalid_page(RelFileNode node, ForkNumber forkno, BlockNumber blkno, bool present)
XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI)
#define XLogFilePath(path, tli, logSegNo)
Relation CreateFakeRelcacheEntry(RelFileNode rnode)
static void forget_invalid_pages(RelFileNode node, ForkNumber forkno, BlockNumber minblkno)
int errcode_for_file_access(void)
#define RelationGetRelationName(relation)
#define BufferGetPage(buffer)
#define BKPBLOCK_WILL_INIT
#define ereport(elevel, rest)
SMgrRelation smgropen(RelFileNode rnode, BackendId backend)
void FreeFakeRelcacheEntry(Relation fakerel)
bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum)
void * palloc0(Size size)
HTAB * hash_create(const char *tabname, long nelem, HASHCTL *info, int flags)
void LockBuffer(Buffer buffer, int mode)
TimeLineID ThisTimeLineID
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
#define XLByteToSeg(xlrp, logSegNo)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
FakeRelCacheEntryData * FakeRelCacheEntry
#define Assert(condition)
#define BufferIsValid(bufnum)
void * hash_seq_search(HASH_SEQ_STATUS *status)
static XLogSegNo sendSegNo
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
void FlushOneBuffer(Buffer buffer)
bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
BlockNumber BufferGetBlockNumber(Buffer buffer)
void XLogDropRelation(RelFileNode rnode, ForkNumber forknum)
int errmsg(const char *fmt,...)
XLogRedoAction XLogReadBufferForRedoExtended(XLogReaderState *record, uint8 block_id, ReadBufferMode mode, bool get_cleanup_lock, Buffer *buf)
void XLogDropDatabase(Oid dbid)
static HTAB * invalid_page_tab
#define CHECK_FOR_INTERRUPTS()
static void static void status(const char *fmt,...) pg_attribute_printf(1
#define XLByteInSeg(xlrp, logSegNo)
#define PageSetLSN(page, lsn)
#define RelFileNodeEquals(node1, node2)
DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID+1]
int BasicOpenFile(FileName fileName, int fileFlags, int fileMode)