Skip to content

Commit 346d333

Browse files
committed
add check page function for debug. Correctly adjust pd_upper
1 parent 575d311 commit 346d333

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

rum.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ extern IndexTuple rumPageGetLinkItup(Buffer buf, Page page);
489489
extern void rumReadTuple(RumState *rumstate, OffsetNumber attnum,
490490
IndexTuple itup, ItemPointerData *ipd, Datum *addInfo, bool *addInfoIsNull);
491491
extern ItemPointerData updateItemIndexes(Page page, OffsetNumber attnum, RumState *rumstate);
492+
extern void checkLeafDataPage(RumState *rumstate, AttrNumber attrnum, Page page);
492493

493494
/* rumdatapage.c */
494495
extern int rumCompareItemPointers(ItemPointer a, ItemPointer b);

rumdatapage.c

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,8 @@ findInLeafPage(RumBtree btree, Page page, OffsetNumber *offset,
431431
*/
432432
for (i = 0; i < RumDataLeafIndexCount; i++)
433433
{
434-
RumDataLeafItemIndex *index = &RumPageGetIndexes(page)[i];
434+
RumDataLeafItemIndex *index = RumPageGetIndexes(page) + i;
435+
435436
if (index->offsetNumer == InvalidOffsetNumber)
436437
break;
437438

@@ -1196,11 +1197,62 @@ updateItemIndexes(Page page, OffsetNumber attnum, RumState *rumstate)
11961197
}
11971198
/* Update freespace of page */
11981199
RumPageGetOpaque(page)->freespace = RumDataPageFreeSpacePre(page, ptr);
1199-
/* Adjust pd_lower */
1200+
/* Adjust pd_lower and pd_upper */
12001201
((PageHeader) page)->pd_lower = ptr - page;
1202+
((PageHeader) page)->pd_upper = ((char*)RumPageGetIndexes(page)) - page;
1203+
12011204
return iptr;
12021205
}
12031206

1207+
void
1208+
checkLeafDataPage(RumState *rumstate, AttrNumber attnum, Page page)
1209+
{
1210+
Offset maxoff, i;
1211+
char *ptr;
1212+
ItemPointerData iptr;
1213+
RumDataLeafItemIndex *index, *previndex = NULL;
1214+
1215+
if (!(RumPageGetOpaque(page)->flags & RUM_DATA))
1216+
return;
1217+
1218+
maxoff = RumPageGetOpaque(page)->maxoff;
1219+
ptr = RumDataPageGetData(page);
1220+
iptr.ip_blkid.bi_lo = 0;
1221+
iptr.ip_blkid.bi_hi = 0;
1222+
iptr.ip_posid = 0;
1223+
1224+
Assert(RumPageGetOpaque(page)->flags & RUM_LEAF);
1225+
1226+
for(i = FirstOffsetNumber; i <= maxoff; i++)
1227+
ptr = rumDataPageLeafRead(ptr, attnum, &iptr, NULL, NULL, rumstate);
1228+
1229+
Assert((char*)RumPageGetIndexes(page) == page + ((PageHeader)page)->pd_upper);
1230+
1231+
for(i = 0; i <RumDataLeafIndexCount; i++)
1232+
{
1233+
index = RumPageGetIndexes(page) + i;
1234+
1235+
if (index->offsetNumer == InvalidOffsetNumber)
1236+
break;
1237+
1238+
Assert(index->pageOffset < ((PageHeader)page)->pd_lower);
1239+
1240+
if (previndex)
1241+
{
1242+
Assert(previndex->offsetNumer < index->offsetNumer);
1243+
Assert(previndex->pageOffset < index->pageOffset);
1244+
Assert(rumCompareItemPointers(&index->iptr, &previndex->iptr) > 0);
1245+
}
1246+
1247+
if (i != RumDataLeafIndexCount - 1)
1248+
{
1249+
iptr = index->iptr;
1250+
rumDataPageLeafRead(RumDataPageGetData(page) + index->pageOffset,
1251+
attnum, &iptr, NULL, NULL, rumstate);
1252+
}
1253+
}
1254+
}
1255+
12041256
/*
12051257
* Fills new root by right bound values from child.
12061258
* Also called from rumxlog, should not use btree

0 commit comments

Comments
 (0)