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.12 2007/02/01 04:16:08 neilc Exp $
11+ *$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.13 2007/05/31 14:03:09 teodor Exp $
1212 *-------------------------------------------------------------------------
1313 */
1414
@@ -28,6 +28,7 @@ typedef struct
2828IndexBulkDeleteCallback callback ;
2929void * callback_state ;
3030GinState ginstate ;
31+ BufferAccessStrategy strategy ;
3132}GinVacuumState ;
3233
3334
@@ -152,7 +153,7 @@ xlogVacuumPage(Relation index, Buffer buffer)
152153static bool
153154ginVacuumPostingTreeLeaves (GinVacuumState * gvs ,BlockNumber blkno ,bool isRoot ,Buffer * rootBuffer )
154155{
155- Buffer buffer = ReadBuffer (gvs -> index ,blkno );
156+ Buffer buffer = ReadBufferWithStrategy (gvs -> index ,blkno , gvs -> strategy );
156157Page page = BufferGetPage (buffer );
157158bool hasVoidPage = FALSE;
158159
@@ -238,9 +239,10 @@ static void
238239ginDeletePage (GinVacuumState * gvs ,BlockNumber deleteBlkno ,BlockNumber leftBlkno ,
239240BlockNumber parentBlkno ,OffsetNumber myoff ,bool isParentRoot )
240241{
241- Buffer dBuffer = ReadBuffer (gvs -> index ,deleteBlkno );
242- Buffer lBuffer = (leftBlkno == InvalidBlockNumber ) ?InvalidBuffer :ReadBuffer (gvs -> index ,leftBlkno );
243- Buffer pBuffer = ReadBuffer (gvs -> index ,parentBlkno );
242+ Buffer dBuffer = ReadBufferWithStrategy (gvs -> index ,deleteBlkno ,gvs -> strategy );
243+ Buffer lBuffer = (leftBlkno == InvalidBlockNumber ) ?
244+ InvalidBuffer :ReadBufferWithStrategy (gvs -> index ,leftBlkno ,gvs -> strategy );
245+ Buffer pBuffer = ReadBufferWithStrategy (gvs -> index ,parentBlkno ,gvs -> strategy );
244246Page page ,
245247parentPage ;
246248
@@ -390,7 +392,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
390392me = parent -> child ;
391393}
392394
393- buffer = ReadBuffer (gvs -> index ,blkno );
395+ buffer = ReadBufferWithStrategy (gvs -> index ,blkno , gvs -> strategy );
394396page = BufferGetPage (buffer );
395397
396398Assert (GinPageIsData (page ));
@@ -574,9 +576,10 @@ ginbulkdelete(PG_FUNCTION_ARGS)
574576gvs .result = stats ;
575577gvs .callback = callback ;
576578gvs .callback_state = callback_state ;
579+ gvs .strategy = info -> strategy ;
577580initGinState (& gvs .ginstate ,index );
578581
579- buffer = ReadBuffer (index ,blkno );
582+ buffer = ReadBufferWithStrategy (index ,blkno , info -> strategy );
580583
581584/* find leaf page */
582585for (;;)
@@ -607,8 +610,8 @@ ginbulkdelete(PG_FUNCTION_ARGS)
607610blkno = GinItemPointerGetBlockNumber (& (itup )-> t_tid );
608611Assert (blkno != InvalidBlockNumber );
609612
610- LockBuffer (buffer , GIN_UNLOCK );
611- buffer = ReleaseAndReadBuffer ( buffer , index ,blkno );
613+ UnlockReleaseBuffer (buffer );
614+ buffer = ReadBufferWithStrategy ( index ,blkno , info -> strategy );
612615}
613616
614617/* right now we found leftmost page in entry's BTree */
@@ -650,7 +653,7 @@ ginbulkdelete(PG_FUNCTION_ARGS)
650653if (blkno == InvalidBlockNumber )/* rightmost page */
651654break ;
652655
653- buffer = ReadBuffer (index ,blkno );
656+ buffer = ReadBufferWithStrategy (index ,blkno , info -> strategy );
654657LockBuffer (buffer ,GIN_EXCLUSIVE );
655658}
656659
@@ -713,7 +716,7 @@ ginvacuumcleanup(PG_FUNCTION_ARGS)
713716
714717vacuum_delay_point ();
715718
716- buffer = ReadBuffer (index ,blkno );
719+ buffer = ReadBufferWithStrategy (index ,blkno , info -> strategy );
717720LockBuffer (buffer ,GIN_SHARE );
718721page = (Page )BufferGetPage (buffer );
719722