* xlogutils.h
*
* Utilities for replaying WAL records.
*
* openGauss transaction log manager utility routines
*
* Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/access/xlogutils.h
*/
#ifndef XLOG_UTILS_H
#define XLOG_UTILS_H
#include "access/xlogreader.h"
#include "storage/buf/bufmgr.h"
#include "postmaster/pagerepair.h"
typedef enum {
BLK_NEEDS_REDO,
NO_BLK,
BLK_DONE,
BLK_RESTORED,
BLK_NOTFOUND
* replayed) */
} XLogRedoAction;
typedef struct xl_invalid_page_key{
RelFileNode node;
ForkNumber forkno;
BlockNumber blkno;
}xl_invalid_page_key;
typedef struct xl_invalid_page{
xl_invalid_page_key key;
InvalidPageType type;
XLogRecPtr lsn;
XLogRecPtr last_lsn;
XLogPhyBlock pblk;
}xl_invalid_page;
* Returns true if we shouldn't do REDO on that block in record indicated by
* block_id; false otherwise.
*/
#ifdef ENABLE_NEON
extern bool (*redo_read_buffer_filter) (XLogReaderState *record, uint8 block_id);
* Pointer to the target block tag for walredo filtering.
* When set (walredo mode), XLogReadBufferExtended and friends skip
* any block that doesn't match this tag, preventing non-target block
* accesses from consuming buffer pool / inmem_smgr overflow slots.
* Declared as struct buftag* to avoid requiring buf_internals.h here.
*/
extern struct buftag *redo_target_tag;
#endif
extern bool XLogHaveInvalidPages(void);
extern void* XLogGetInvalidPages();
extern void XLogCheckInvalidPages(void);
extern void XLogDropRelation(const RelFileNode& rnode, ForkNumber forknum);
extern void XlogDropRowReation(RelFileNode rnode);
extern void XLogDropDatabase(Oid dbid);
extern void XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, BlockNumber nblocks);
extern void XLogTruncateSegmentSpace(RelFileNode rnode, ForkNumber forkNum, BlockNumber nblocks);
extern void XLogDropSegmentSpace(Oid spcNode, Oid dbNode);
extern Buffer XLogReadBufferExtended(const RelFileNode& rnode, ForkNumber forknum, BlockNumber blkno,
ReadBufferMode mode, const XLogPhyBlock *pblk, bool tde = false);
extern Buffer XLogReadBufferExtendedForHeapDisk(const RelFileNode &rnode, ForkNumber forknum, BlockNumber blkno,
ReadBufferMode mode, const XLogPhyBlock *pblk, bool tde = false);
extern Buffer XLogReadBufferExtendedForSegpage(const RelFileNode& rnode, ForkNumber forknum, BlockNumber blkno, ReadBufferMode mode);
extern XLogRedoAction XLogReadBufferForRedo(XLogReaderState* record, uint8 buffer_id, Buffer* buf);
extern Relation CreateFakeRelcacheEntry(const RelFileNode& rnode);
extern Relation CreateCUReplicationRelation(const RelFileNode& rnode, int BackendId, char relpersistence, const char* relname);
extern void FreeFakeRelcacheEntry(Relation fakerel);
extern void log_invalid_page(const RelFileNode &node, ForkNumber forkno, BlockNumber blkno, InvalidPageType type,
const XLogPhyBlock *pblk);
extern int read_local_xlog_page(XLogReaderState* state, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr,
char* cur_page, TimeLineID* pageTLI, char* xlog_path = NULL);
extern void closeXLogRead();
extern bool IsDataBaseDrop(XLogReaderState* record);
extern bool IsTableSpaceDrop(XLogReaderState* record);
extern bool IsTableSpaceCreate(XLogReaderState* record);
extern bool IsBarrierRelated(XLogReaderState *record);
extern bool IsDataBaseCreate(XLogReaderState* record);
extern bool IsSegPageShrink(XLogReaderState *record);
extern bool IsSegPageDropSpace(XLogReaderState *record);
extern Buffer XLogReadBufferExtendedWithoutBuffer(
RelFileNode rnode, ForkNumber forknum, BlockNumber blkno, ReadBufferMode mode);
extern Buffer XLogReadBufferExtendedWithLocalBuffer(
RelFileNode rnode, ForkNumber forknum, BlockNumber blkno, ReadBufferMode mode);
extern void XlogUpdateFullPageWriteLsn(Page page, XLogRecPtr lsn);
void XLogSynAllBuffer();
bool ParseStateUseShareBuf();
bool ParseStateUseLocalBuf();
bool ParseStateWithoutCache();
extern void forget_specified_invalid_pages(RepairBlockKey key, HTAB* hasTable = NULL);
extern void forget_range_invalid_pages(void *pageinfo);
extern bool RepairPageForSpecificPage(xl_invalid_page* entry, HTAB* invalidHashTable = NULL);
#endif