优化gs ctl、basebackup过程完整校验性能

This commit is contained in:
wuyuechuan
2022-03-17 16:22:39 +08:00
parent 74c8611e4a
commit 260d3f3ea0
4 changed files with 17 additions and 14 deletions

View File

@ -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;

View File

@ -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. */

View File

@ -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) {

View File

@ -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