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

Commit7510433

Browse files
committed
Issue#19. Bug in vacuuming.
- Incorrect adjusting of pd_lower in RumPageDeletePostingItem()- Incorrect writing of Generic WAL record in rumDeletePage(). Because of 'goto restart' there was a memoryleak.
1 parent5404e3e commit7510433

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

‎src/rumdatapage.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -764,12 +764,14 @@ RumPageDeletePostingItem(Page page, OffsetNumber offset)
764764
*sourceptr=RumDataPageGetItem(page,offset+1);
765765

766766
memmove(dstptr,sourceptr,sizeof(PostingItem)* (maxoff-offset));
767-
/* Adjust pd_lower */
768-
((PageHeader)page)->pd_lower=sourceptr-page;
769-
Assert(((PageHeader)page)->pd_lower <= ((PageHeader)page)->pd_upper);
770767
}
771768

772769
RumPageGetOpaque(page)->maxoff--;
770+
771+
/* Adjust pd_lower */
772+
((PageHeader)page)->pd_lower=
773+
RumDataPageGetItem(page,RumPageGetOpaque(page)->maxoff+1)-page;
774+
Assert(((PageHeader)page)->pd_lower <= ((PageHeader)page)->pd_upper);
773775
}
774776

775777
/*
@@ -1274,7 +1276,7 @@ dataSplitPageInternal(RumBtree btree, Buffer lbuf, Buffer rbuf,
12741276
/* Adjust pd_lower */
12751277
((PageHeader)rPage)->pd_lower= (ptr+
12761278
(maxoff-separator)*sizeofitem)-
1277-
rPage;
1279+
rPage;
12781280

12791281
PostingItemSetBlockNumber(&(btree->pitem),BufferGetBlockNumber(lbuf));
12801282
if (RumPageIsLeaf(newlPage))

‎src/rumget.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ callAddInfoConsistentFn(RumState * rumstate, RumScanKey key)
5151

5252
key->outerAddInfoIsNull= true;
5353

54-
if (key->addInfoKeys==false&&key->willSort== false)
54+
if (key->addInfoKeys==NULL&&key->willSort== false)
5555
return true;
5656

5757
for (i=0;i<key->nentries;i++)

‎src/rumvacuum.c

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,6 @@ rumVacuumPostingTreeLeaves(RumVacuumState * gvs, OffsetNumber attnum,
239239
oldMaxOff=RumPageGetOpaque(page)->maxoff;
240240
Pointercleaned=NULL;
241241
SizenewSize;
242-
GenericXLogState*state;
243-
244-
state=GenericXLogStart(gvs->index);
245-
page=GenericXLogRegisterBuffer(state,buffer,0);
246242

247243
newMaxOff=rumVacuumPostingList(gvs,attnum,
248244
RumDataPageGetData(page),oldMaxOff,&cleaned,
@@ -251,21 +247,26 @@ rumVacuumPostingTreeLeaves(RumVacuumState * gvs, OffsetNumber attnum,
251247
/* saves changes about deleted tuple ... */
252248
if (oldMaxOff!=newMaxOff)
253249
{
250+
GenericXLogState*state;
251+
PagenewPage;
252+
253+
state=GenericXLogStart(gvs->index);
254+
255+
newPage=GenericXLogRegisterBuffer(state,buffer,0);
256+
254257
if (newMaxOff>0)
255-
memcpy(RumDataPageGetData(page),cleaned,newSize);
258+
memcpy(RumDataPageGetData(newPage),cleaned,newSize);
256259

257260
pfree(cleaned);
258-
RumPageGetOpaque(page)->maxoff=newMaxOff;
259-
updateItemIndexes(page,attnum,&gvs->rumstate);
261+
RumPageGetOpaque(newPage)->maxoff=newMaxOff;
262+
updateItemIndexes(newPage,attnum,&gvs->rumstate);
260263

261264
/* if root is a leaf page, we don't desire further processing */
262-
if (!isRoot&&RumPageGetOpaque(page)->maxoff<FirstOffsetNumber)
265+
if (!isRoot&&RumPageGetOpaque(newPage)->maxoff<FirstOffsetNumber)
263266
hasVoidPage= TRUE;
264267

265268
GenericXLogFinish(state);
266269
}
267-
else
268-
GenericXLogAbort(state);
269270
}
270271
else
271272
{
@@ -341,8 +342,6 @@ rumDeletePage(RumVacuumState * gvs, BlockNumber deleteBlkno,
341342

342343
LockBuffer(dBuffer,RUM_UNLOCK);
343344

344-
state=GenericXLogStart(gvs->index);
345-
346345
/*
347346
* Lock the pages in the same order as an insertion would, to avoid
348347
* deadlocks: left, then right, then parent.
@@ -360,16 +359,16 @@ rumDeletePage(RumVacuumState * gvs, BlockNumber deleteBlkno,
360359
UnlockReleaseBuffer(lBuffer);
361360
ReleaseBuffer(dBuffer);
362361
ReleaseBuffer(rBuffer);
362+
ReleaseBuffer(pBuffer);
363363
gotorestart;
364364
}
365365
LockBuffer(rBuffer,RUM_EXCLUSIVE);
366366
if (!isParentRoot)/* parent is already locked by
367367
* LockBufferForCleanup() */
368368
LockBuffer(pBuffer,RUM_EXCLUSIVE);
369369

370-
dPage=GenericXLogRegisterBuffer(state,dBuffer,0);
371-
lPage=GenericXLogRegisterBuffer(state,lBuffer,0);
372-
rPage=GenericXLogRegisterBuffer(state,rBuffer,0);
370+
lPage=BufferGetPage(lBuffer);
371+
rPage=BufferGetPage(rBuffer);
373372

374373
/*
375374
* last chance to check
@@ -378,19 +377,29 @@ rumDeletePage(RumVacuumState * gvs, BlockNumber deleteBlkno,
378377
RumPageGetOpaque(rPage)->leftlink==deleteBlkno&&
379378
RumPageGetOpaque(dPage)->maxoff<FirstOffsetNumber))
380379
{
380+
OffsetNumberdMaxoff=RumPageGetOpaque(dPage)->maxoff;
381+
381382
if (!isParentRoot)
382383
LockBuffer(pBuffer,RUM_UNLOCK);
383384
ReleaseBuffer(pBuffer);
384385
UnlockReleaseBuffer(lBuffer);
385386
UnlockReleaseBuffer(dBuffer);
386387
UnlockReleaseBuffer(rBuffer);
387388

388-
if (RumPageGetOpaque(dPage)->maxoff >=FirstOffsetNumber)
389+
if (dMaxoff >=FirstOffsetNumber)
389390
return false;
390391

391392
gotorestart;
392393
}
393394

395+
/* At least make the WAL record */
396+
397+
state=GenericXLogStart(gvs->index);
398+
399+
dPage=GenericXLogRegisterBuffer(state,dBuffer,0);
400+
lPage=GenericXLogRegisterBuffer(state,lBuffer,0);
401+
rPage=GenericXLogRegisterBuffer(state,rBuffer,0);
402+
394403
RumPageGetOpaque(lPage)->rightlink=rightBlkno;
395404
RumPageGetOpaque(rPage)->leftlink=leftBlkno;
396405

@@ -484,9 +493,16 @@ rumScanToDelete(RumVacuumState * gvs, BlockNumber blkno, bool isRoot,
484493
}
485494

486495
if (RumPageGetOpaque(page)->maxoff<FirstOffsetNumber&& !isRoot)
496+
{
497+
/*
498+
* Release the buffer because in rumDeletePage() we need to pin it again
499+
* and call ConditionalLockBufferForCleanup().
500+
*/
501+
ReleaseBuffer(buffer);
487502
meDelete=rumDeletePage(gvs,blkno,me->parent->blkno,myoff,me->parent->isRoot);
488-
489-
ReleaseBuffer(buffer);
503+
}
504+
else
505+
ReleaseBuffer(buffer);
490506

491507
returnmeDelete;
492508
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp