diff --git a/src/backend/storage/buffer/buf_init_ext.c b/src/backend/storage/buffer/buf_init_ext.c index 3696a3c3a630ff1851473e59dcca561a3d263635..3171f73b7457839ec87565f2c30f7c7f615d0503 100644 --- a/src/backend/storage/buffer/buf_init_ext.c +++ b/src/backend/storage/buffer/buf_init_ext.c @@ -71,7 +71,7 @@ void KPHCPciBufInitCtx() KPHCPciPageCtrl *ctrl = PCI_GET_CTRL_BY_ID(gPciBufCtx, i); memset((void*)ctrl, 0, sizeof(KPHCPciPageCtrl)); ctrl->ctrlId = i; - ctrl->pciPage = (CfsExtentHeader *)(void *)(gPciBufCtx->pageBuf + (Size)((Size)(i - 1) * BLCKSZ)); + ctrl->pciPage = (KPHCCfsExtentHeader *)(void *)(gPciBufCtx->pageBuf + (Size)((Size)(i - 1) * BLCKSZ)); LWLockInitialize(&ctrl->contentLock, (int)LWTRANCHE_PCI_BUFFER_CONTENT); KPHCPciLruPushNoLock(&gPciBufCtx->freeLru[ctrl->ctrlId % PCI_PART_LIST_NUM], ctrl, CTRL_STATE_FREE); diff --git a/src/backend/storage/page/page_compression.c b/src/backend/storage/page/page_compression.c index e21eb0ae604f521c5852d72c5a9a2258c6d27daf..7cd45892e29f3a085ff964dcb5fa983a407201df 100644 --- a/src/backend/storage/page/page_compression.c +++ b/src/backend/storage/page/page_compression.c @@ -1,6 +1,7 @@ #include "postgres.h" #include "storage/fd.h" #include "storage/bufpage.h" +#include "storage/page_common.h" #include "storage/page_compression.h" #include "utils/rel.h" #include "utils/wait_event.h" @@ -8,7 +9,8 @@ #ifdef USE_ZSTD #include #endif -extern KPHCCfsLocationConvert cfsLocationConverts[]; + +const KPHC_CFS_STORAGE_TYPE COMMON_STORAGE = 0; uint32 AddrChecksum32(const KPHCCfsExtentAddress *cfsExtentAddress, const int needChunks); @@ -306,6 +308,46 @@ char *KPHCCfsCompressPage(const char *buffer, KPHCRelFileCompressOption *option, return workBuffer; } +int KPHCDecompressPage(const char* src, char* dst) +{ + int decompressed_size; + char* data; +#ifdef USE_ZSTD + uint32 size; +#endif + int algorithm; + size_t headerSize = SizeOfPageHeaderData; + memcpy(dst, src, headerSize); + data = ((KPHCPageCompressData*)src)->data; +#ifdef USE_ZSTD + size = ((KPHCPageCompressData*)src)->size; +#endif + algorithm = ((KPHCPageCompressData*)src)->algorithm; + + switch (algorithm) { + case KPHC_COMPRESS_ALGORITHM_PGLZ: + decompressed_size = KPHCLzDecompress((const KPHC_PGLZ_Header *)data, dst + headerSize); + if (decompressed_size == -1) { + return -1; + } + break; + case KPHC_COMPRESS_ALGORITHM_ZSTD: +#ifdef USE_ZSTD + decompressed_size = ZSTD_decompress(dst + headerSize, BLCKSZ - headerSize, data, size); + if (ZSTD_isError(decompressed_size)) { + return -1; + } +#else + return -1; +#endif + break; + default: + return KPHC_COMPRESS_UNSUPPORTED_ERROR; + break; + } + return headerSize + decompressed_size; +} + void KPHCAnalyzeCompressOptions(const RelFileNode node, KPHCRelFileCompressOption* opt) { unsigned short compressOption = node.opt; @@ -385,3 +427,48 @@ size_t KPHCCfsWritePage(SMgrRelation reln, ForkNumber forknum, BlockNumber logic KPHCPciBufFreePage(ctrl, location, changed); return BLCKSZ; } + +int KPHCCfsReadPage(SMgrRelation reln, ForkNumber forknum, BlockNumber logicBlockNumber, char *buffer, KPHC_CFS_STORAGE_TYPE type) +{ + uint32 chunkSize; + uint32 startOffset; + char *compressedBuffer; + char *bufferPos; + off_t seekPos; + uint8 start; + int readAmount; + KPHCExtentLocation location = cfsLocationConverts[type](reln, forknum, logicBlockNumber, false, KPHC_EXTENT_OPEN_FILE); + KPHCPciPageCtrl *ctrl = KPHCPciBufReadPage(location, LW_SHARED, PCI_BUF_NORMAL_READ); + KPHCCfsExtentHeader *cfsExtentHeader = ctrl->pciPage; + KPHCCfsExtentAddress *cfsExtentAddress = KPHCGetExtentAddress(cfsExtentHeader, (uint16)location.extentOffset); + KPHCRelFileCompressOption option; + KPHCAnalyzeCompressOptions(reln->smgr_rnode.node, &option); + chunkSize = CHUNK_SIZE_LIST[option.compressChunkSize]; + startOffset = location.extentStart * BLCKSZ; + compressedBuffer = (char *) palloc(chunkSize * cfsExtentAddress->nchunks); + bufferPos = compressedBuffer; + + for (uint32 i = 0; i < cfsExtentAddress->nchunks; i++) { + bufferPos = compressedBuffer + (long)chunkSize * i; + seekPos = OffsetOfPageCompressChunk((uint16)chunkSize, cfsExtentAddress->chunknos[i]) + startOffset; + start = (uint8)i; + while (i < cfsExtentAddress->nchunks - 1 && + cfsExtentAddress->chunknos[i + 1] == cfsExtentAddress->chunknos[i] + 1) { + i++; + } + readAmount = (int)(chunkSize * ((int)(i - (int)start) + 1)); + FileRead(location.fd, bufferPos, readAmount, seekPos, (uint32)WAIT_EVENT_DATA_FILE_READ); + } + + if (cfsExtentAddress->nchunks == (BLCKSZ / chunkSize)) { + memcpy(buffer, compressedBuffer, BLCKSZ); + } else if (KPHCDecompressPage(compressedBuffer, buffer) != BLCKSZ) { + memset(buffer, 0, BLCKSZ); + KPHCPciBufFreePage(ctrl, location, false); + pfree(compressedBuffer); + return -1; + } + KPHCPciBufFreePage(ctrl, location, false); + pfree(compressedBuffer); + return BLCKSZ; +} diff --git a/src/backend/storage/smgr/Makefile b/src/backend/storage/smgr/Makefile index cc02a8a0c22aafd373e8e28523bcce56f30e2664..3131b776eacf4fa051620d31d90a7d53b84029c4 100644 --- a/src/backend/storage/smgr/Makefile +++ b/src/backend/storage/smgr/Makefile @@ -14,8 +14,7 @@ include $(top_builddir)/src/Makefile.global OBJS = \ md.o \ - smgr.o \ - cfs_buffers.o + smgr.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/storage/smgr/cfs_buffers.c b/src/backend/storage/smgr/cfs_buffers.c deleted file mode 100644 index d288b9912203d879a21e7cec5805da59612b8f8b..0000000000000000000000000000000000000000 --- a/src/backend/storage/smgr/cfs_buffers.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "storage/cfs_buffers.h" - -void KPHCPciBufInitCtx(void) -{ -} -KPHCPciPageCtrl *KPHCPciBufReadPage(const KPHCExtentLocation location, LWLockMode lockMode, KPHCPciBufferReadMode readMode) -{ - return NULL; -} - -void KPHCPciBufFreePage(KPHCPciPageCtrl *ctrl, const KPHCExtentLocation location, bool need_write) -{ -} - diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index c8d737162008c96c1d9b8eed90040f70205c9af2..a9051d1f518c2fca46998256c07c1dc55721c1c4 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -669,18 +669,6 @@ mdwriteback(SMgrRelation reln, ForkNumber forknum, } } -const KPHC_CFS_STORAGE_TYPE COMMON_STORAGE = 0; - -enum KPHC_SMGR_READ_STATUS { - SMGR_RD_OK = 0, - SMGR_RD_NO_BLOCK = 1, - SMGR_RD_CRC_ERROR = 2 -}; - -KPHCExtentLocation KPHCStorageConvert(SMgrRelation sRel, ForkNumber forknum, BlockNumber logicBlockNumber, bool skipSync, int type); -int KPHCDecompressPage(const char* src, char* dst); -int KPHCCfsReadPage(SMgrRelation reln, ForkNumber forknum, BlockNumber logicBlockNumber, char *buffer, KPHC_CFS_STORAGE_TYPE type); - KPHCExtentLocation KPHCStorageConvert(SMgrRelation sRel, ForkNumber forknum, BlockNumber logicBlockNumber, bool skipSync, int type) { @@ -726,98 +714,6 @@ KPHCCfsLocationConvert cfsLocationConverts[2] = { NULL }; -inline size_t SizeOfKPHCExtentAddress(uint16 chunkSize) { - if (chunkSize == 0) { - return -1; - } - return offsetof(KPHCCfsExtentAddress, chunknos) + sizeof(uint16) * BLCKSZ / chunkSize; -} - -int KPHCDecompressPage(const char* src, char* dst) -{ - int decompressed_size; - char* data; -#ifdef USE_ZSTD - uint32 size; -#endif - int algorithm; - size_t headerSize = SizeOfPageHeaderData; - memcpy(dst, src, headerSize); - data = ((KPHCPageCompressData*)src)->data; -#ifdef USE_ZSTD - size = ((KPHCPageCompressData*)src)->size; -#endif - algorithm = ((KPHCPageCompressData*)src)->algorithm; - - switch (algorithm) { - case KPHC_COMPRESS_ALGORITHM_PGLZ: - decompressed_size = KPHCLzDecompress((const KPHC_PGLZ_Header *)data, dst + headerSize); - if (decompressed_size == -1) { - return -1; - } - break; - case KPHC_COMPRESS_ALGORITHM_ZSTD: -#ifdef USE_ZSTD - decompressed_size = ZSTD_decompress(dst + headerSize, BLCKSZ - headerSize, data, size); - if (ZSTD_isError(decompressed_size)) { - return -1; - } -#else - return -1; -#endif - break; - default: - return KPHC_COMPRESS_UNSUPPORTED_ERROR; - break; - } - return headerSize + decompressed_size; -} - -int KPHCCfsReadPage(SMgrRelation reln, ForkNumber forknum, BlockNumber logicBlockNumber, char *buffer, - KPHC_CFS_STORAGE_TYPE type) -{ - uint32 chunkSize; - uint32 startOffset; - char *compressedBuffer; - char *bufferPos; - off_t seekPos; - uint8 start; - int readAmount; - KPHCExtentLocation location = cfsLocationConverts[type](reln, forknum, logicBlockNumber, false, KPHC_EXTENT_OPEN_FILE); - KPHCPciPageCtrl *ctrl = KPHCPciBufReadPage(location, LW_SHARED, PCI_BUF_NORMAL_READ); - KPHCCfsExtentHeader *cfsExtentHeader = ctrl->pciPage; - KPHCCfsExtentAddress *cfsExtentAddress = KPHCGetExtentAddress(cfsExtentHeader, (uint16)location.extentOffset); - KPHCRelFileCompressOption option; - KPHCAnalyzeCompressOptions(reln->smgr_rnode.node, &option); - chunkSize = CHUNK_SIZE_LIST[option.compressChunkSize]; - startOffset = location.extentStart * BLCKSZ; - compressedBuffer = (char *) palloc(chunkSize * cfsExtentAddress->nchunks); - bufferPos = compressedBuffer; - - for (uint32 i = 0; i < cfsExtentAddress->nchunks; i++) { - bufferPos = compressedBuffer + (long)chunkSize * i; - seekPos = OffsetOfPageCompressChunk((uint16)chunkSize, cfsExtentAddress->chunknos[i]) + startOffset; - start = (uint8)i; - while (i < cfsExtentAddress->nchunks - 1 && - cfsExtentAddress->chunknos[i + 1] == cfsExtentAddress->chunknos[i] + 1) { - i++; - } - readAmount = (int)(chunkSize * ((int)(i - (int)start) + 1)); - FileRead(location.fd, bufferPos, readAmount, seekPos, (uint32)WAIT_EVENT_DATA_FILE_READ); - } - - if (cfsExtentAddress->nchunks == (BLCKSZ / chunkSize)) { - memcpy(buffer, compressedBuffer, BLCKSZ); - } else if (KPHCDecompressPage(compressedBuffer, buffer) != BLCKSZ) { - memset(buffer, 0, BLCKSZ); - KPHCPciBufFreePage(ctrl, location, false); - pfree(compressedBuffer); - return -1; - } - KPHCPciBufFreePage(ctrl, location, false); - pfree(compressedBuffer); - return BLCKSZ; -} /* * mdread() -- Read the specified block from a relation. */ diff --git a/src/include/storage/buf_ext.h b/src/include/storage/buf_ext.h index e358caa49526843d0e2ab617194df0f219cf3225..10d4884b40e24d68af864b81e475cf23e8baf564 100644 --- a/src/include/storage/buf_ext.h +++ b/src/include/storage/buf_ext.h @@ -31,22 +31,26 @@ #define PCI_SET_NO_READ(ctrl) (ctrl->loadStatus = CTRL_PAGE_NO_LOAD) +typedef struct CfsExtentAddress { + uint32 checksum; + volatile uint8 nchunks; + volatile uint8 allocated_chunks; + uint16 chunknos[FLEXIBLE_ARRAY_MEMBER]; +}KPHCCfsExtentAddress; typedef struct CfsExtentHeader { - void *exHeader; -} CfsExtentHeader; - - -typedef struct RelFileNodeKp { - Oid spcNode; - Oid dbNode; - Oid relNode; - uint8 bucketNode; -} RelFileNodeKp; + pg_atomic_uint32 nblocks; + pg_atomic_uint32 allocated_chunks; + uint16 chunk_size; + uint8 algorithm : 7; + uint8 recycleInOrder : 1; + uint8 recv; + KPHCCfsExtentAddress cfsExtentAddress[FLEXIBLE_ARRAY_MEMBER]; +}KPHCCfsExtentHeader; typedef struct KPHCExtentLocation { int fd; - RelFileNodeKp relFileNode; + RelFileNode relFileNode; BlockNumber extentNumber; BlockNumber extentStart; BlockNumber extentOffset; @@ -64,7 +68,7 @@ typedef struct stPciHashBucket { } KPHCPciHashBucket; typedef struct stPciPageHashtbl { - HashValueFunc hash; + HashValueFunc hash; HashCompareFunc match; uint32 bucketNum; KPHCPciHashBucket *buckets; @@ -77,9 +81,8 @@ typedef struct stPciLruList { volatile uint32 last; } KPHCPciLruList; - typedef struct KPHCCfsBufferKey { - RelFileNodeKp relFileNode; + RelFileNode relFileNode; uint32 extentCount; } KPHCCfsBufferKey; @@ -95,7 +98,6 @@ typedef enum enCtrlLoadStatus { CTRL_PAGE_LOADED_ERROR } KPHCCtrlLoadStatus; - typedef struct __attribute__((aligned(128))) stPciPageCtrl { uint32 ctrlId; @@ -111,7 +113,7 @@ typedef struct __attribute__((aligned(128))) stPciPageCtrl LWLock contentLock; KPHCCtrlLoadStatus loadStatus; KPHCCfsBufferKey pciKey; - CfsExtentHeader *pciPage; + KPHCCfsExtentHeader *pciPage; } KPHCPciPageCtrl; typedef struct __attribute__((aligned(128))) stPciPageBuffCtx @@ -129,7 +131,6 @@ typedef enum pciBufferReadMode { PCI_BUF_NO_READ } KPHCPciBufferReadMode; - extern KPHCPciPageBuffCtx *gPciBufCtx; void KPHCPciBufInitCtx(); @@ -139,5 +140,5 @@ void KPHCPciBufFreePage(KPHCPciPageCtrl *ctrl, const KPHCExtentLocation location void KPHCPciLruPushNoLock(KPHCPciLruList *lru, KPHCPciPageCtrl *item, KPHCCtrlState state); KPHCPciPageCtrl *KPHCPciBufReadPage(const KPHCExtentLocation location, LWLockMode lockMode, KPHCPciBufferReadMode readMode); - +typedef KPHCExtentLocation (*KPHCCfsLocationConvert)(SMgrRelation sRel, ForkNumber forknum, BlockNumber logicBlockNumber, bool skipSync, int type); #endif \ No newline at end of file diff --git a/src/include/storage/cfs_buffers.h b/src/include/storage/cfs_buffers.h deleted file mode 100644 index 2f46383994d1b0ac0bc015fbdd71f2775fa2f1cb..0000000000000000000000000000000000000000 --- a/src/include/storage/cfs_buffers.h +++ /dev/null @@ -1,138 +0,0 @@ -#ifndef CFS_BUFFERS_H -#define CFS_BUFFERS_H - -#include "postgres.h" -#include "postgres_ext.h" -#include "storage/block.h" -#include "port/atomics.h" -#include "storage/lwlock.h" -#include "utils/wait_event.h" -#include "storage/fd.h" -#include "utils/elog.h" -#include "storage/shmem.h" -#include "utils/hsearch.h" -#include "storage/relfilenode.h" -#include "storage/smgr.h" - -typedef struct ExtentLocation { - int fd; - RelFileNode relFileNode; - BlockNumber extentNumber; - BlockNumber extentStart; - BlockNumber extentOffset; - BlockNumber headerNum; - uint16 chrunkSize; - uint8 algorithm; -}KPHCExtentLocation; - -typedef struct CfsBufferKey { - RelFileNode relFileNode; - uint32 extentCount; -}KPHCCfsBufferKey; - -typedef enum enCtrlState { - CTRL_STATE_INIT = 0, - CTRL_STATE_USED = 1, - CTRL_STATE_FREE = 2, -} KPHCCtrlState; - -typedef enum enCtrlLoadStatus { - CTRL_PAGE_NO_LOAD, - CTRL_PAGE_IS_LOADED, - CTRL_PAGE_LOADED_ERROR -} KPHCCtrlLoadStatus; - -typedef struct CfsExtentAddress { - uint32 checksum; - volatile uint8 nchunks; - volatile uint8 allocated_chunks; - uint16 chunknos[FLEXIBLE_ARRAY_MEMBER]; -}KPHCCfsExtentAddress; - -typedef struct CfsExtentHeader { - pg_atomic_uint32 nblocks; - pg_atomic_uint32 allocated_chunks; - uint16 chunk_size; - uint8 algorithm : 7; - uint8 recycleInOrder : 1; - uint8 recv; - KPHCCfsExtentAddress cfsExtentAddress[FLEXIBLE_ARRAY_MEMBER]; -}KPHCCfsExtentHeader; - -typedef struct __attribute__((aligned(128))) stPciPageCtrl -{ - uint32 ctrlId; - KPHCCtrlState state; - volatile uint32 lruPrev; - volatile uint32 lruNext; - volatile uint32 bckPrev; - volatile uint32 bckNext; - volatile uint32 bckId; - pg_atomic_uint32 touchNum; - pg_atomic_uint32 refNum; - - LWLock *contentLock; - KPHCCtrlLoadStatus loadStatus; - - KPHCCfsBufferKey pciKey; - KPHCCfsExtentHeader *pciPage; -} KPHCPciPageCtrl; - -typedef struct stPciHashBucket { - LWLock *lock; - uint32 bckId; - uint32 ctrlCount; - uint32 firstCtrlId; -} KPHCPciHashBucket; - -typedef struct stPciPageHashtbl { - HashValueFunc hash; - HashCompareFunc match; - - uint32 bucketNum; - KPHCPciHashBucket *buckets; -} KPHCPciPageHashtbl; - -typedef struct stPciLruList { - LWLock *lock; - volatile uint32 count; - volatile uint32 first; - volatile uint32 last; -} KPHCPciLruList; - -#define PCI_PART_LIST_NUM (8) -#define PCI_LRU_LIST_NUM (PCI_PART_LIST_NUM * 2) - -typedef struct __attribute__((aligned(128))) stPciPageBuffCtx -{ - KPHCPciPageCtrl *ctrlBuf; - char *pageBuf; - KPHCPciPageHashtbl hashtbl; - - uint32 maxCount; - KPHCPciLruList mainLru[PCI_PART_LIST_NUM]; - KPHCPciLruList freeLru[PCI_PART_LIST_NUM]; -} KPHCPciPageBuffCtx; - -#define PCI_INVALID_ID (0) -#define PCI_GET_CTRL_BY_ID(ctx, ctrlId) ((KPHCPciPageCtrl *)(&(ctx->ctrlBuf[(ctrlId) - 1]))) -#define PCI_GET_BUCKET_BY_ID(ctx, bckId) ((KPHCPciHashBucket *)(&(ctx->hashtbl.buckets[(bckId) - 1]))) -#define PCI_GET_BUCKET_BY_HASH(ctx, hashcode) (PCI_GET_BUCKET_BY_ID(ctx, (((hashcode) % ctx->hashtbl.bucketNum) + 1))) - -#define PCI_SET_NO_READ(ctrl) (ctrl->loadStatus = CTRL_PAGE_NO_LOAD) - -typedef enum pciBufferReadMode { - PCI_BUF_NORMAL_READ, - PCI_BUF_NO_READ -} KPHCPciBufferReadMode; - -typedef KPHCExtentLocation (*KPHCCfsLocationConvert)(SMgrRelation sRel, ForkNumber forknum, BlockNumber logicBlockNumber, bool skipSync, int type); - -extern KPHCPciPageBuffCtx *gPciBufCtx; - -extern void KPHCPciBufInitCtx(void); - -extern KPHCPciPageCtrl *KPHCPciBufReadPage(const KPHCExtentLocation location, LWLockMode lockMode, KPHCPciBufferReadMode readMode); - -extern void KPHCPciBufFreePage(KPHCPciPageCtrl *ctrl, const KPHCExtentLocation location, bool need_write); -#endif // CFS_BUFFERS_H diff --git a/src/include/storage/page_common.h b/src/include/storage/page_common.h new file mode 100644 index 0000000000000000000000000000000000000000..6dda937ff254c22ee42817bb17f1861bbbd65374 --- /dev/null +++ b/src/include/storage/page_common.h @@ -0,0 +1,6 @@ +#ifndef PAGE_COMMON_H +#define PAGE_COMMON_H + +// 公共头结构放这里,例如KPHCExtentLocation、KPHCCfsExtentAddress、KPHCCfsExtentHeader + +#endif \ No newline at end of file diff --git a/src/include/storage/page_compression.h b/src/include/storage/page_compression.h index 25598e9406c014901fcfdf0f0111eeb3b4fa43ac..c31f6996bf2d33b33850d9f1ef32cf20d781fe72 100644 --- a/src/include/storage/page_compression.h +++ b/src/include/storage/page_compression.h @@ -5,7 +5,8 @@ #include "storage/relfilenode.h" #include "storage/bufpage.h" #include "utils/rel.h" -#include "storage/cfs_buffers.h" +#include "storage/buf_ext.h" + #define KPHC_CMP_BYTE_CONVERT_LEN 1 #define KPHC_CMP_DIFF_CONVERT_LEN 1 #define KPHC_CMP_PRE_CHUNK_LEN 3 @@ -55,6 +56,12 @@ typedef struct relFileCompressOption { unsigned compressChunkSize : KPHC_CMP_CHUNK_SIZE_LEN; }KPHCRelFileCompressOption; +enum KPHC_SMGR_READ_STATUS { + SMGR_RD_OK = 0, + SMGR_RD_NO_BLOCK = 1, + SMGR_RD_CRC_ERROR = 2 +}; + typedef struct PageCompressData { char page_header[SizeOfPageHeaderData]; uint32 crc32; @@ -101,6 +108,8 @@ typedef struct HeapPageCompressData { #define REL_SUPPORT_COMPRESSED(relation) SUPPORT_COMPRESSED((relation)->rd_rel->relkind, (relation)->rd_rel->relam) +extern const KPHC_CFS_STORAGE_TYPE COMMON_STORAGE; + extern const uint32 INDEX_OF_HALF_BLCKSZ; extern const uint32 INDEX_OF_QUARTER_BLCKSZ; extern const uint32 INDEX_OF_EIGHTH_BLCKSZ; @@ -117,19 +126,23 @@ extern const int KPHC_EXTENT_CREATE_FILE; extern const KPHCCmpBitStuct gCmpBitStruct[]; extern const uint32 CHUNK_SIZE_LIST[4]; +extern KPHCCfsLocationConvert cfsLocationConverts[]; uint8 ConvertChunkSize(uint32 compressedChunkSize, bool *success); void SetupPageCompressForRelation(RelFileNode *node, PageCompressOpts *compress_options, const char *relationName); +KPHCExtentLocation KPHCStorageConvert(SMgrRelation sRel, ForkNumber forknum, BlockNumber logicBlockNumber, bool skipSync, int type); + int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFileCompressOption option); char *KPHCCfsCompressPage(const char *buffer, KPHCRelFileCompressOption *option, uint8 *nchunks); +int KPHCDecompressPage(const char* src, char* dst); void KPHCAnalyzeCompressOptions(const RelFileNode node, KPHCRelFileCompressOption* opt); +off_t OffsetOfPageCompressChunk(uint16 chunkSize, int chunkNo); +KPHCCfsExtentAddress *KPHCGetExtentAddress(KPHCCfsExtentHeader *header, uint16 blockOffset); size_t KPHCCfsWritePage(SMgrRelation reln, ForkNumber forknum, BlockNumber logicBlockNumber, char *buffer, bool sipSync, KPHC_CFS_STORAGE_TYPE type); +int KPHCCfsReadPage(SMgrRelation reln, ForkNumber forknum, BlockNumber logicBlockNumber, char *buffer, KPHC_CFS_STORAGE_TYPE type); -off_t OffsetOfPageCompressChunk(uint16 chunkSize, int chunkNo); - -KPHCCfsExtentAddress *KPHCGetExtentAddress(KPHCCfsExtentHeader *header, uint16 blockOffset); #endif // PAGE_COMPRESSION_H \ No newline at end of file diff --git a/src/include/storage/relfilenode.h b/src/include/storage/relfilenode.h index 1a66dde36d97b5a0a054c1b8d7268cff53dbfda6..cd4b8a41309e0ce74458c7c9ca1ecda5c99f6701 100644 --- a/src/include/storage/relfilenode.h +++ b/src/include/storage/relfilenode.h @@ -59,6 +59,7 @@ typedef struct RelFileNode Oid spcNode; /* tablespace */ Oid dbNode; /* database */ Oid relNode; /* relation */ + uint16 bucketNode; uint16 opt; /* 2 bytes for compress options */ } RelFileNode;