@@ -239,10 +239,6 @@ rumVacuumPostingTreeLeaves(RumVacuumState * gvs, OffsetNumber attnum,
239239 oldMaxOff = RumPageGetOpaque (page )-> maxoff ;
240240 Pointer cleaned = NULL ;
241241 Size newSize ;
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+ Page newPage ;
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 goto restart ;
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+ OffsetNumber dMaxoff = 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 goto restart ;
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 return meDelete ;
492508}
0 commit comments