From 260d3f3ea0fbaaf29b379a53de79bc36008dc187 Mon Sep 17 00:00:00 2001 From: wuyuechuan Date: Thu, 17 Mar 2022 16:22:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96gs=20ctl=E3=80=81basebackup?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E5=AE=8C=E6=95=B4=E6=A0=A1=E9=AA=8C=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/genfile.cpp | 3 --- .../storage/replication/basebackup.cpp | 3 +-- .../storage/smgr/page_compression.cpp | 23 +++++++++++++------ src/include/storage/page_compression.h | 2 -- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/common/backend/utils/adt/genfile.cpp b/src/common/backend/utils/adt/genfile.cpp index a96365143..5f8304b9c 100644 --- a/src/common/backend/utils/adt/genfile.cpp +++ b/src/common/backend/utils/adt/genfile.cpp @@ -370,11 +370,8 @@ static void ReadBinaryFileBlocksFirstCall(PG_FUNCTION_ARGS, int32 startBlockNum, if (fp == NULL) { ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", pcdFilePath))); } - char* pageBuffer = (char*)palloc(BLCKSZ); itemState->pcaFile = pcaFile; itemState->rbStruct.header = map; - itemState->rbStruct.pageBuffer = pageBuffer; - itemState->rbStruct.pageBufferLen = BLCKSZ; itemState->rbStruct.fp = fp; itemState->rbStruct.segmentNo = segmentNo; itemState->rbStruct.fileName = pcdFilePath; diff --git a/src/gausskernel/storage/replication/basebackup.cpp b/src/gausskernel/storage/replication/basebackup.cpp index 781e1ccf3..a84becd7d 100755 --- a/src/gausskernel/storage/replication/basebackup.cpp +++ b/src/gausskernel/storage/replication/basebackup.cpp @@ -1997,8 +1997,7 @@ static void SendCompressedFile(char* readFileName, int basePathLen, struct stat& bool* onlyExtend = (bool*)palloc0(totalBlockNum * sizeof(bool)); /* allocated in advance to prevent repeated allocated */ - char pageBuffer[BLCKSZ]; - ReadBlockChunksStruct rbStruct{map, pageBuffer, BLCKSZ, fp, segmentNo, readFileName}; + ReadBlockChunksStruct rbStruct{map, fp, segmentNo, readFileName}; for (blockNum = 0; blockNum < totalBlockNum; blockNum++) { PageCompressAddr* addr = GET_PAGE_COMPRESS_ADDR(transfer, chunkSize, blockNum); /* skip some blocks which only extends. The size of blocks is 0. */ diff --git a/src/gausskernel/storage/smgr/page_compression.cpp b/src/gausskernel/storage/smgr/page_compression.cpp index fb1167fb1..f83fc46fa 100644 --- a/src/gausskernel/storage/smgr/page_compression.cpp +++ b/src/gausskernel/storage/smgr/page_compression.cpp @@ -384,7 +384,6 @@ size_t ReadAllChunkOfBlock(char *dst, size_t destLen, BlockNumber blockNumber, R (ERRCODE_INVALID_PARAMETER_VALUE, errmsg("blocknum \"%u\" exceeds max block number", blockNumber))); } - char* pageBuffer = rbStruct.pageBuffer; const char* fileName = rbStruct.fileName; decltype(PageCompressHeader::chunk_size) chunkSize = header->chunk_size; decltype(ReadBlockChunksStruct::segmentNo) segmentNo = rbStruct.segmentNo; @@ -416,12 +415,22 @@ size_t ReadAllChunkOfBlock(char *dst, size_t destLen, BlockNumber blockNumber, R if (nchunks == 0) { break; } - if (DecompressPage(dst, pageBuffer, header->algorithm) == BLCKSZ) { - PageHeader phdr = PageHeader(pageBuffer); - BlockNumber blkNo = blockNumber + segmentNo * ((BlockNumber)RELSEG_SIZE); - if (PageIsNew(phdr) || pg_checksum_page(pageBuffer, blkNo) == phdr->pd_checksum) { - break; - } + char *data = NULL; + size_t dataLen; + uint32 crc32; + if (PageIs8BXidHeapVersion(dst)) { + HeapPageCompressData *heapPageData = (HeapPageCompressData *)dst; + data = heapPageData->data; + dataLen = heapPageData->size; + crc32 = heapPageData->crc32; + } else { + PageCompressData *heapPageData = (PageCompressData *)dst; + data = heapPageData->data; + dataLen = heapPageData->size; + crc32 = heapPageData->crc32; + } + if (DataBlockChecksum(data, dataLen, true) == crc32) { + break; } if (tryCount < MAX_RETRY_LIMIT) { diff --git a/src/include/storage/page_compression.h b/src/include/storage/page_compression.h index 33b671ed3..ce90ed84f 100644 --- a/src/include/storage/page_compression.h +++ b/src/include/storage/page_compression.h @@ -88,8 +88,6 @@ typedef struct PageCompressAddr { struct ReadBlockChunksStruct { PageCompressHeader* header; // header: pca file - char* pageBuffer; // pageBuffer: decompressed page - size_t pageBufferLen; FILE* fp; // fp: table fp int segmentNo; char* fileName; // fileName: for error report