Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 426ea61

Browse files
nbtree: Make BTMaxItemSize into object-like macro.
Make nbtree's "1/3 of a page limit" BTMaxItemSize function-like macro (which accepts a "page" argument) into an object-like macro that can be used from code that doesn't have convenient access to an nbtree page. Preparation for an upcoming patch that adds skip scan to nbtree. Parallel index scans that use skip scan will serialize datums (not just SAOP array subscripts) when scheduling primitive scans. BTMaxItemSize will be used by btestimateparallelscan to determine how much DSM to request. Author: Peter Geoghegan <pg@bowt.ie> Discussion: https://postgr.es/m/CAH2-Wz=H_RG5weNGeUG_TkK87tRBnH9mGCQj6WpM4V4FNWKv2g@mail.gmail.com
1 parent 0fbceae commit 426ea61

File tree

7 files changed

+15
-17
lines changed

7 files changed

+15
-17
lines changed

contrib/amcheck/verify_nbtree.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -1597,8 +1597,7 @@ bt_target_page_check(BtreeCheckState *state)
15971597
*/
15981598
lowersizelimit = skey->heapkeyspace &&
15991599
(P_ISLEAF(topaque) || BTreeTupleGetHeapTID(itup) == NULL);
1600-
if (tupsize > (lowersizelimit ? BTMaxItemSize(state->target) :
1601-
BTMaxItemSizeNoHeapTid(state->target)))
1600+
if (tupsize > (lowersizelimit ? BTMaxItemSize : BTMaxItemSizeNoHeapTid))
16021601
{
16031602
ItemPointer tid = BTreeTupleGetPointsToTID(itup);
16041603
char *itid,

src/backend/access/nbtree/nbtdedup.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, IndexTuple newitem, Size newitemsz,
8484
state = (BTDedupState) palloc(sizeof(BTDedupStateData));
8585
state->deduplicate = true;
8686
state->nmaxitems = 0;
87-
state->maxpostingsize = Min(BTMaxItemSize(page) / 2, INDEX_SIZE_MASK);
87+
state->maxpostingsize = Min(BTMaxItemSize / 2, INDEX_SIZE_MASK);
8888
/* Metadata about base tuple of current pending posting list */
8989
state->base = NULL;
9090
state->baseoff = InvalidOffsetNumber;
@@ -568,7 +568,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
568568
/* Use original, unchanged base tuple */
569569
tuplesz = IndexTupleSize(state->base);
570570
Assert(tuplesz == MAXALIGN(IndexTupleSize(state->base)));
571-
Assert(tuplesz <= BTMaxItemSize(newpage));
571+
Assert(tuplesz <= BTMaxItemSize);
572572
if (PageAddItem(newpage, (Item) state->base, tuplesz, tupoff,
573573
false, false) == InvalidOffsetNumber)
574574
elog(ERROR, "deduplication failed to add tuple to page");
@@ -588,7 +588,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
588588
state->intervals[state->nintervals].nitems = state->nitems;
589589

590590
Assert(tuplesz == MAXALIGN(IndexTupleSize(final)));
591-
Assert(tuplesz <= BTMaxItemSize(newpage));
591+
Assert(tuplesz <= BTMaxItemSize);
592592
if (PageAddItem(newpage, (Item) final, tuplesz, tupoff, false,
593593
false) == InvalidOffsetNumber)
594594
elog(ERROR, "deduplication failed to add tuple to page");

src/backend/access/nbtree/nbtinsert.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ _bt_findinsertloc(Relation rel,
827827
opaque = BTPageGetOpaque(page);
828828

829829
/* Check 1/3 of a page restriction */
830-
if (unlikely(insertstate->itemsz > BTMaxItemSize(page)))
830+
if (unlikely(insertstate->itemsz > BTMaxItemSize))
831831
_bt_check_third_page(rel, heapRel, itup_key->heapkeyspace, page,
832832
insertstate->itup);
833833

src/backend/access/nbtree/nbtsort.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup,
829829
* make use of the reserved space. This should never fail on internal
830830
* pages.
831831
*/
832-
if (unlikely(itupsz > BTMaxItemSize(npage)))
832+
if (unlikely(itupsz > BTMaxItemSize))
833833
_bt_check_third_page(wstate->index, wstate->heap, isleaf, npage,
834834
itup);
835835

@@ -1305,7 +1305,7 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
13051305
*/
13061306
dstate->maxpostingsize = MAXALIGN_DOWN((BLCKSZ * 10 / 100)) -
13071307
sizeof(ItemIdData);
1308-
Assert(dstate->maxpostingsize <= BTMaxItemSize((Page) state->btps_buf) &&
1308+
Assert(dstate->maxpostingsize <= BTMaxItemSize &&
13091309
dstate->maxpostingsize <= INDEX_SIZE_MASK);
13101310
dstate->htids = palloc(dstate->maxpostingsize);
13111311

src/backend/access/nbtree/nbtutils.c

+3-4
Original file line numberDiff line numberDiff line change
@@ -3245,15 +3245,15 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace,
32453245
itemsz = MAXALIGN(IndexTupleSize(newtup));
32463246

32473247
/* Double check item size against limit */
3248-
if (itemsz <= BTMaxItemSize(page))
3248+
if (itemsz <= BTMaxItemSize)
32493249
return;
32503250

32513251
/*
32523252
* Tuple is probably too large to fit on page, but it's possible that the
32533253
* index uses version 2 or version 3, or that page is an internal page, in
32543254
* which case a slightly higher limit applies.
32553255
*/
3256-
if (!needheaptidspace && itemsz <= BTMaxItemSizeNoHeapTid(page))
3256+
if (!needheaptidspace && itemsz <= BTMaxItemSizeNoHeapTid)
32573257
return;
32583258

32593259
/*
@@ -3270,8 +3270,7 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace,
32703270
errmsg("index row size %zu exceeds btree version %u maximum %zu for index \"%s\"",
32713271
itemsz,
32723272
needheaptidspace ? BTREE_VERSION : BTREE_NOVAC_VERSION,
3273-
needheaptidspace ? BTMaxItemSize(page) :
3274-
BTMaxItemSizeNoHeapTid(page),
3273+
needheaptidspace ? BTMaxItemSize : BTMaxItemSizeNoHeapTid,
32753274
RelationGetRelationName(rel)),
32763275
errdetail("Index row references tuple (%u,%u) in relation \"%s\".",
32773276
ItemPointerGetBlockNumber(BTreeTupleGetHeapTID(newtup)),

src/backend/access/nbtree/nbtxlog.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ btree_xlog_dedup(XLogReaderState *record)
483483
state->deduplicate = true; /* unused */
484484
state->nmaxitems = 0; /* unused */
485485
/* Conservatively use larger maxpostingsize than primary */
486-
state->maxpostingsize = BTMaxItemSize(page);
486+
state->maxpostingsize = BTMaxItemSize;
487487
state->base = NULL;
488488
state->baseoff = InvalidOffsetNumber;
489489
state->basetupsize = 0;

src/include/access/nbtree.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,13 @@ typedef struct BTMetaPageData
161161
* a heap index tuple to make space for a tiebreaker heap TID
162162
* attribute, which we account for here.
163163
*/
164-
#define BTMaxItemSize(page) \
165-
(MAXALIGN_DOWN((PageGetPageSize(page) - \
164+
#define BTMaxItemSize \
165+
(MAXALIGN_DOWN((BLCKSZ - \
166166
MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
167167
MAXALIGN(sizeof(BTPageOpaqueData))) / 3) - \
168168
MAXALIGN(sizeof(ItemPointerData)))
169-
#define BTMaxItemSizeNoHeapTid(page) \
170-
MAXALIGN_DOWN((PageGetPageSize(page) - \
169+
#define BTMaxItemSizeNoHeapTid \
170+
MAXALIGN_DOWN((BLCKSZ - \
171171
MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
172172
MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
173173

0 commit comments

Comments
 (0)