From 297e698652ac08a9f2e4412a655b6cdd0ece0d8e Mon Sep 17 00:00:00 2001 From: David Christensen Date: Fri, 19 Jan 2024 12:32:24 -0500 Subject: [PATCH v4 19/22] feature: Teach bloom about PageUsableSpace --- contrib/bloom/bloom.h | 22 +++++++++++----------- contrib/bloom/blutils.c | 4 ++-- contrib/bloom/blvacuum.c | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h index 6d645aa3a2..eadb37aca5 100644 --- a/contrib/bloom/bloom.h +++ b/contrib/bloom/bloom.h @@ -106,16 +106,13 @@ typedef struct BloomOptions * index key */ } BloomOptions; -/* - * FreeBlockNumberArray - array of block numbers sized so that metadata fill - * all space in metapage. - */ -typedef BlockNumber FreeBlockNumberArray[ - MAXALIGN_DOWN( - PageUsableSpaceMax - MAXALIGN(sizeof(BloomPageOpaqueData)) - - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions)) - ) / sizeof(BlockNumber) -]; +#define CalcFreeBlockNumberArraySize(usablespace) \ + (MAXALIGN_DOWN((usablespace) - \ + MAXALIGN(sizeof(BloomPageOpaqueData)) \ + - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions)) \ + ) / sizeof(BlockNumber) ) + +typedef BlockNumber FreeBlockNumberArray[FLEXIBLE_ARRAY_MEMBER]; /* Metadata of bloom index */ typedef struct BloomMetaPageData @@ -127,11 +124,14 @@ typedef struct BloomMetaPageData FreeBlockNumberArray notFullPage; } BloomMetaPageData; +#define SizeOfFreeBlockNumberArray CalcFreeBlockNumberArraySize(PageUsableSpace) +#define SizeOfBloomMetaPageData (offsetof(BloomMetaPageData,notFullPage) + (SizeOfFreeBlockNumberArray)) + /* Magic number to distinguish bloom pages from others */ #define BLOOM_MAGICK_NUMBER (0xDBAC0DED) /* Number of blocks numbers fit in BloomMetaPageData */ -#define BloomMetaBlockN (sizeof(FreeBlockNumberArray) / sizeof(BlockNumber)) +#define BloomMetaBlockN (SizeOfFreeBlockNumberArray / sizeof(BlockNumber)) #define BloomPageGetMeta(page) ((BloomMetaPageData *) PageGetContents(page)) diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c index 6836129c90..f42efa4907 100644 --- a/contrib/bloom/blutils.c +++ b/contrib/bloom/blutils.c @@ -432,10 +432,10 @@ BloomFillMetapage(Relation index, Page metaPage) */ BloomInitPage(metaPage, BLOOM_META); metadata = BloomPageGetMeta(metaPage); - memset(metadata, 0, sizeof(BloomMetaPageData)); + memset(metadata, 0, SizeOfBloomMetaPageData); metadata->magickNumber = BLOOM_MAGICK_NUMBER; metadata->opts = *opts; - ((PageHeader) metaPage)->pd_lower += sizeof(BloomMetaPageData); + ((PageHeader) metaPage)->pd_lower += SizeOfBloomMetaPageData; /* If this fails, probably FreeBlockNumberArray size calc is wrong: */ Assert(((PageHeader) metaPage)->pd_lower <= ((PageHeader) metaPage)->pd_upper); diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c index 0998240fea..b22e1fb15b 100644 --- a/contrib/bloom/blvacuum.c +++ b/contrib/bloom/blvacuum.c @@ -37,7 +37,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, Relation index = info->index; BlockNumber blkno, npages; - FreeBlockNumberArray notFullPage; + BlockNumber notFullPage[CalcFreeBlockNumberArraySize(PageUsableSpaceMax)]; int countPage = 0; BloomState state; Buffer buffer; -- 2.40.1