fedcde61创建于 2023年9月18日历史提交
/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 * http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 *
 * storage.cpp
 *    parse storage xlog
 *
 * IDENTIFICATION
 *    src/gausskernel/storage/access/redo/storage.cpp
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"
#include "knl/knl_variable.h"

#include "access/xlogproc.h"
#include "access/redo_common.h"
#include "catalog/storage_xlog.h"
#include "storage/smgr/fd.h"

XLogRecParseState *smgr_xlog_relnode_parse_to_block(XLogReaderState *record, uint32 *blocknum)
{
    uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
    XLogRecParseState *recordstatehead = NULL;
    RelFileNodeOld *rnode = NULL;
    ForkNumber forknum = MAIN_FORKNUM;
    BlockNumber blkno = InvalidBlockNumber;
    int ddltype;
    bool colmrel = false;
    bool compress = (bool)(XLogRecGetInfo(record) & XLR_REL_COMPRESS);
    uint2 opt;

    if (info == XLOG_SMGR_CREATE) {
        xl_smgr_create *xlrec = (xl_smgr_create *)XLogRecGetData(record);
        rnode = &(xlrec->rnode);
        forknum = xlrec->forkNum;
        ddltype = BLOCK_DDL_CREATE_RELNODE;
        colmrel = IsValidColForkNum(xlrec->forkNum);
        opt = compress ? ((xl_smgr_create_compress*)(void *)XLogRecGetData(record))->pageCompressOpts : 0;
    } else {
        xl_smgr_truncate *xlrec = (xl_smgr_truncate *)XLogRecGetData(record);
        rnode = &(xlrec->rnode);
        blkno = xlrec->blkno;
        ddltype = BLOCK_DDL_TRUNCATE_RELNODE;
        opt = compress ? ((xl_smgr_truncate_compress*)(void *)XLogRecGetData(record))->pageCompressOpts : 0;
    }

    (*blocknum)++;
    XLogParseBufferAllocListFunc(record, &recordstatehead, NULL);

    RelFileNode tmp_node;
    RelFileNodeCopy(tmp_node, *rnode, (int2)XLogRecGetBucketId(record));
    tmp_node.opt = opt;

    RelFileNodeForkNum filenode = RelFileNodeForkNumFill(&tmp_node, InvalidBackendId, forknum, blkno);
    XLogRecSetBlockCommonState(record, BLOCK_DATA_DDL_TYPE, filenode, recordstatehead);

    XLogRecSetBlockDdlState(&(recordstatehead->blockparse.extra_rec.blockddlrec), ddltype,
                            (char *)XLogRecGetData(record), 1, compress, XLogRecGetDataLen(record));
    return recordstatehead;
}

XLogRecParseState *smgr_redo_parse_to_block(XLogReaderState *record, uint32 *blocknum)
{
    uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
    XLogRecParseState *recordstatehead = NULL;

    *blocknum = 0;
    if ((info == XLOG_SMGR_CREATE) || (info == XLOG_SMGR_TRUNCATE)) {
        recordstatehead = smgr_xlog_relnode_parse_to_block(record, blocknum);
        recordstatehead->isFullSync = record->isFullSync;
    } else {
        ereport(PANIC, (errmsg("smgr_redo_parse_to_block: unknown op code %u", info)));
    }
    return recordstatehead;
}