LLiHengsync code
de223dd1创建于 2022年3月4日历史提交
/*
 * 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"

/* Result codes for XLogReadBufferForRedo[Extended] */
typedef enum {
    BLK_NEEDS_REDO, /* changes from WAL record need to be applied */
    NO_BLK,         /* ddl no need get block */
    BLK_DONE,       /* block is already up-to-date */
    BLK_RESTORED,   /* block was restored from a full-page image */
    BLK_NOTFOUND    /* block was not found (and hence does not need to be
                     * replayed) */
} XLogRedoAction;

typedef enum {
    NOT_PRESENT,
    NOT_INITIALIZED,
    LSN_CHECK_ERROR,
    CRC_CHECK_ERROR,
    SEGPAGE_LSN_CHECK_ERROR,
}InvalidPageType;

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);
extern void forget_range_invalid_pages(void *pageinfo);
#endif