Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit309765f

Browse files
committed
Fix handling of empty uncompressed posting list pages in GIN
PostgreSQL 9.4 introduces posting list compression in GIN. This featuresupports online upgrade, so that after pg_upgrade uncompressed postinglists are compressed on-the-fly. Underlying code appears to alwaysexpect at least one item on uncompressed posting list page. But therecould be completely empty pages, because VACUUM never deletes leftmostand rightmost pages from posting trees. This commit fixes that.Reported-by: Sivasubramanian RamasubramanianDiscussion:https://postgr.es/m/1531867212836.63354%40amazon.comAuthor: Sivasubramanian Ramasubramanian, Alexander KorotkovBackpatch-through: 9.4
1 parentb90d97e commit309765f

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

‎src/backend/access/gin/gindatapage.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,23 +1394,27 @@ disassembleLeaf(Page page)
13941394
{
13951395
/*
13961396
* A pre-9.4 format uncompressed page is represented by a single
1397-
* segment, with an array of items.
1397+
* segment, with an array of items. The corner case is uncompressed
1398+
* page containing no items, which is represented as no segments.
13981399
*/
13991400
ItemPointeruncompressed;
14001401
intnuncompressed;
14011402
leafSegmentInfo*seginfo;
14021403

14031404
uncompressed=dataLeafPageGetUncompressed(page,&nuncompressed);
14041405

1405-
seginfo=palloc(sizeof(leafSegmentInfo));
1406+
if (nuncompressed>0)
1407+
{
1408+
seginfo=palloc(sizeof(leafSegmentInfo));
14061409

1407-
seginfo->action=GIN_SEGMENT_REPLACE;
1408-
seginfo->seg=NULL;
1409-
seginfo->items=palloc(nuncompressed*sizeof(ItemPointerData));
1410-
memcpy(seginfo->items,uncompressed,nuncompressed*sizeof(ItemPointerData));
1411-
seginfo->nitems=nuncompressed;
1410+
seginfo->action=GIN_SEGMENT_REPLACE;
1411+
seginfo->seg=NULL;
1412+
seginfo->items=palloc(nuncompressed*sizeof(ItemPointerData));
1413+
memcpy(seginfo->items,uncompressed,nuncompressed*sizeof(ItemPointerData));
1414+
seginfo->nitems=nuncompressed;
14121415

1413-
dlist_push_tail(&leaf->segments,&seginfo->node);
1416+
dlist_push_tail(&leaf->segments,&seginfo->node);
1417+
}
14141418

14151419
leaf->oldformat= true;
14161420
}

‎src/backend/access/gin/ginxlog.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,30 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
153153
ItemPointeruncompressed= (ItemPointer)GinDataPageGetData(page);
154154
intnuncompressed=GinPageGetOpaque(page)->maxoff;
155155
intnpacked;
156-
GinPostingList*plist;
157156

158-
plist=ginCompressPostingList(uncompressed,nuncompressed,
159-
BLCKSZ,&npacked);
160-
Assert(npacked==nuncompressed);
157+
/*
158+
* Empty leaf pages are deleted as part of vacuum, but leftmost and
159+
* rightmost pages are never deleted. So, pg_upgrade'd from pre-9.4
160+
* instances might contain empty leaf pages, and we need to handle
161+
* them correctly.
162+
*/
163+
if (nuncompressed>0)
164+
{
165+
GinPostingList*plist;
166+
167+
plist=ginCompressPostingList(uncompressed,nuncompressed,
168+
BLCKSZ,&npacked);
169+
totalsize=SizeOfGinPostingList(plist);
170+
171+
Assert(npacked==nuncompressed);
161172

162-
totalsize=SizeOfGinPostingList(plist);
173+
memcpy(GinDataLeafPageGetPostingList(page),plist,totalsize);
174+
}
175+
else
176+
{
177+
totalsize=0;
178+
}
163179

164-
memcpy(GinDataLeafPageGetPostingList(page),plist,totalsize);
165180
GinDataPageSetDataSize(page,totalsize);
166181
GinPageSetCompressed(page);
167182
GinPageGetOpaque(page)->maxoff=InvalidOffsetNumber;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp