@@ -108,21 +108,6 @@ typedef struct GistBDItem
108108 struct GistBDItem * next ;
109109} GistBDItem ;
110110
111- typedef enum
112- {
113- NOT_NEED_TO_PROCESS , /* without action */
114- PROCESSED , /* action is done */
115- NEED_TO_PROCESS ,
116- NEED_TO_DELETE
117- } GistBlockInfoFlag ;
118-
119- typedef struct GistBlockInfo {
120- BlockNumber parent ;
121- BlockNumber leftblock ; /* block that has rightlink on blkno */
122- GistBlockInfoFlag flag ;
123- bool hasRightLink ;
124- } GistBlockInfo ;
125-
126111static void
127112pushStackIfSplited (Page page , GistBDItem * stack )
128113{
@@ -296,8 +281,6 @@ gistbulkdelete(IndexVacuumInfo * info, IndexBulkDeleteResult * stats, IndexBulkD
296281 vacuum_delay_point ();
297282 }
298283
299-
300- elog (NOTICE ,"Rescan list length %d" , length (rescanList ));
301284 /* rescan inner pages that had empty child pages */
302285 foreach (cell ,rescanList )
303286 {
@@ -311,7 +294,6 @@ gistbulkdelete(IndexVacuumInfo * info, IndexBulkDeleteResult * stats, IndexBulkD
311294 Buffer buftodelete [MaxOffsetNumber ];
312295 int ntodelete = 0 ;
313296
314- elog (NOTICE ,"Deleting for inner %d" ,(BlockNumber )lfirst_int (cell ));
315297 buffer = ReadBufferExtended (rel , MAIN_FORKNUM , (BlockNumber )lfirst_int (cell ),
316298 RBM_NORMAL , info -> strategy );
317299 LockBuffer (buffer , GIST_EXCLUSIVE );
@@ -322,7 +304,7 @@ gistbulkdelete(IndexVacuumInfo * info, IndexBulkDeleteResult * stats, IndexBulkD
322304
323305 maxoff = PageGetMaxOffsetNumber (page );
324306
325- for (i = FirstOffsetNumber ; i <= maxoff ; i = OffsetNumberNext (i ))
307+ for (i = OffsetNumberNext ( FirstOffsetNumber ) ; i <= maxoff ; i = OffsetNumberNext (i ))
326308 {
327309 Buffer leafBuffer ;
328310 Page leafPage ;
@@ -335,9 +317,11 @@ gistbulkdelete(IndexVacuumInfo * info, IndexBulkDeleteResult * stats, IndexBulkD
335317 LockBuffer (leafBuffer , GIST_EXCLUSIVE );
336318 gistcheckpage (rel , leafBuffer );
337319 leafPage = (Page ) BufferGetPage (leafBuffer );
320+ Assert (GistPageIsLeaf (leafPage ));
338321
339- if (PageGetMaxOffsetNumber (leafPage ) == InvalidOffsetNumber
340- && !(GistFollowRight (leafPage ) || GistPageGetNSN (page ) < GistPageGetNSN (leafPage )))
322+ if (PageGetMaxOffsetNumber (leafPage ) == InvalidOffsetNumber /* Nothing left to split */
323+ && !(GistFollowRight (leafPage ) || GistPageGetNSN (page ) < GistPageGetNSN (leafPage )) /* No follow-right */
324+ && ntodelete < maxoff - 1 ) /* We must keep at leaf one leaf page per each */
341325 {
342326 buftodelete [ntodelete ] = leafBuffer ;
343327 todelete [ntodelete ++ ] = i ;
@@ -347,51 +331,48 @@ gistbulkdelete(IndexVacuumInfo * info, IndexBulkDeleteResult * stats, IndexBulkD
347331 }
348332
349333 if (ntodelete )
350- {
351- START_CRIT_SECTION ();
352-
353- MarkBufferDirty ( buffer );
334+ {
335+ /* Drop references from internal page */
336+ TransactionId txid = GetCurrentTransactionId ();
337+ START_CRIT_SECTION ( );
354338
339+ MarkBufferDirty (buffer );
355340 PageIndexMultiDelete (page , todelete , ntodelete );
356- GistMarkTuplesDeleted (page );
357341
358- if (RelationNeedsWAL (rel ))
359- {
360- XLogRecPtr recptr ;
342+ if (RelationNeedsWAL (rel ))
343+ {
344+ XLogRecPtr recptr ;
361345
362- recptr = gistXLogUpdate (buffer ,
363- todelete , ntodelete ,
364- NULL , 0 , InvalidBuffer );
346+ recptr = gistXLogUpdate (buffer , todelete , ntodelete , NULL , 0 , InvalidBuffer );
365347 PageSetLSN (page , recptr );
366- }
367- else
368- PageSetLSN (page , gistGetFakeLSN (rel ));
369-
370- END_CRIT_SECTION ();
371-
372- for (i = 0 ; i < ntodelete ; i ++ )
373- {
374- Page leafPage = (Page )BufferGetPage (buftodelete [i ]);
375- PageHeader header = (PageHeader )leafPage ;
348+ }
349+ else
350+ PageSetLSN (page , gistGetFakeLSN (rel ));
376351
377- header -> pd_prune_xid = GetCurrentTransactionId ();
352+ /* Mark pages as deleted */
353+ for (i = 0 ; i < ntodelete ; i ++ )
354+ {
355+ Page leafPage = (Page )BufferGetPage (buftodelete [i ]);
356+ PageHeader header = (PageHeader )leafPage ;
378357
379- GistPageSetDeleted (leafPage );
380- stats -> pages_deleted ++ ;
358+ header -> pd_prune_xid = txid ;
381359
382- if ( RelationNeedsWAL ( rel ))
383- {
384- XLogRecPtr recptr ;
360+ GistPageSetDeleted ( leafPage );
361+ MarkBufferDirty ( buftodelete [ i ]);
362+ stats -> pages_deleted ++ ;
385363
386- recptr = gistXLogSetDeleted (rel -> rd_node , buftodelete [i ], header -> pd_prune_xid );
387- PageSetLSN (leafPage , recptr );
388- }
389- else
390- PageSetLSN (leafPage , gistGetFakeLSN (rel ));
364+ if (RelationNeedsWAL (rel ))
365+ {
366+ XLogRecPtr recptr = gistXLogSetDeleted (rel -> rd_node , buftodelete [i ], header -> pd_prune_xid );
367+ PageSetLSN (leafPage , recptr );
368+ }
369+ else
370+ PageSetLSN (leafPage , gistGetFakeLSN (rel ));
391371
392- UnlockReleaseBuffer (buftodelete [i ]);
393- }
372+ UnlockReleaseBuffer (buftodelete [i ]);
394373 }
374+ END_CRIT_SECTION ();
375+ }
395376
396377 UnlockReleaseBuffer (buffer );
397378 }
0 commit comments