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

Commitef148d6

Browse files
committed
Fix bug with page deletion. If inner page is removed and it tries to
remove page on next level linked from next inner page, ginScanToDelete()wrongly sets parent page. Bug reveals when many item pointers from indexwas deleted ( several hundred thousands).Bug is discovered by hubert depesz lubaczewski <depesz@gmail.com>Suppose, we need rc2 before release...
1 parentcf06c2e commitef148d6

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
*$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.8 2006/11/12 06:55:53 neilc Exp $
11+
*$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.9 2006/11/30 16:22:32 teodor Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -265,6 +265,12 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
265265
}
266266

267267
parentPage=BufferGetPage(pBuffer);
268+
#ifdefUSE_ASSERT_CHECKING
269+
do {
270+
PostingItem*tod=(PostingItem*)GinDataPageGetItem(parentPage,myoff);
271+
Assert(PostingItemGetBlockNumber(tod)==deleteBlkno );
272+
}while(0);
273+
#endif
268274
PageDeletePostingItem(parentPage,myoff);
269275

270276
page=BufferGetPage(dBuffer);
@@ -351,7 +357,8 @@ typedef struct DataPageDeleteStack
351357
structDataPageDeleteStack*child;
352358
structDataPageDeleteStack*parent;
353359

354-
BlockNumberblkno;
360+
BlockNumberblkno;/* current block number */
361+
BlockNumberleftBlkno;/* rightest non-deleted page on left */
355362
boolisRoot;
356363
}DataPageDeleteStack;
357364

@@ -377,7 +384,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
377384
me= (DataPageDeleteStack*)palloc0(sizeof(DataPageDeleteStack));
378385
me->parent=parent;
379386
parent->child=me;
380-
me->blkno=InvalidBlockNumber;
387+
me->leftBlkno=InvalidBlockNumber;
381388
}
382389
else
383390
me=parent->child;
@@ -392,6 +399,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
392399
{
393400
OffsetNumberi;
394401

402+
me->blkno=blkno;
395403
for (i=FirstOffsetNumber;i <=GinPageGetOpaque(page)->maxoff;i++)
396404
{
397405
PostingItem*pitem= (PostingItem*)GinDataPageGetItem(page,i);
@@ -403,13 +411,13 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
403411

404412
if (GinPageGetOpaque(page)->maxoff<FirstOffsetNumber)
405413
{
406-
if (!(me->blkno==InvalidBlockNumber&&GinPageRightMost(page)))
414+
if (!(me->leftBlkno==InvalidBlockNumber&&GinPageRightMost(page)))
407415
{
408416
/* we never delete right most branch */
409417
Assert(!isRoot);
410418
if (GinPageGetOpaque(page)->maxoff<FirstOffsetNumber)
411419
{
412-
ginDeletePage(gvs,blkno,me->blkno,me->parent->blkno,myoff,me->parent->isRoot);
420+
ginDeletePage(gvs,blkno,me->leftBlkno,me->parent->blkno,myoff,me->parent->isRoot);
413421
meDelete= TRUE;
414422
}
415423
}
@@ -418,7 +426,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
418426
ReleaseBuffer(buffer);
419427

420428
if (!meDelete)
421-
me->blkno=blkno;
429+
me->leftBlkno=blkno;
422430

423431
returnmeDelete;
424432
}
@@ -438,7 +446,7 @@ ginVacuumPostingTree(GinVacuumState *gvs, BlockNumber rootBlkno)
438446
}
439447

440448
memset(&root,0,sizeof(DataPageDeleteStack));
441-
root.blkno=rootBlkno;
449+
root.leftBlkno=InvalidBlockNumber;
442450
root.isRoot= TRUE;
443451

444452
vacuum_delay_point();

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp