diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index cf4a6dc..3ae74d1 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -22,6 +22,7 @@ #include "access/relscan.h" #include "access/xlog.h" #include "catalog/index.h" +#include "catalog/pg_namespace.h" #include "commands/vacuum.h" #include "storage/indexfsm.h" #include "storage/ipc.h" @@ -836,6 +837,14 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, vstate.lastBlockVacuumed < vstate.lastBlockLocked) { Buffer buf; + BlockNumber lastBlockVacuumed = InvalidBlockNumber; + + /* + * If we are vacuuming a Toast Index, then set lastBlockVacuumed + * to enable pin scan during Hot Standby. + */ + if (rel->rd_rel->relnamespace == PG_TOAST_NAMESPACE) + lastBlockVacuumed = vstate.lastBlockVacuumed; /* * The page should be valid, but we can't use _bt_getbuf() because we @@ -847,7 +856,7 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, RBM_NORMAL, info->strategy); LockBufferForCleanup(buf); _bt_checkpage(rel, buf); - _bt_delitems_vacuum(rel, buf, NULL, 0, vstate.lastBlockVacuumed); + _bt_delitems_vacuum(rel, buf, NULL, 0, lastBlockVacuumed); _bt_relbuf(rel, buf); } diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index da28e21..f28680c 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -412,7 +412,7 @@ btree_xlog_vacuum(XLogReaderState *record) * isn't yet consistent; so we need not fear reading still-corrupt blocks * here during crash recovery. */ - if (HotStandbyActiveInReplay()) + if (HotStandbyActiveInReplay() && BlockNumberIsValid(xlrec->lastBlockVacuumed)) { RelFileNode thisrnode; BlockNumber thisblkno;