优化gs ctl、basebackup过程完整校验性能
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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. */
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user