diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtree.c')
-rw-r--r-- | src/backend/access/nbtree/nbtree.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index 712385b3bfc..752e3b5dd12 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" @@ -823,6 +824,11 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, } /* + * Check to see if we need to issue one final WAL record for this index, + * which may be needed for correctness on a hot standby node when + * non-MVCC index scans could take place. This now only occurs when we + * perform a TOAST scan, so only occurs for TOAST indexes. + * * If the WAL is replayed in hot standby, the replay process needs to get * cleanup locks on all index leaf pages, just as we've been doing here. * However, we won't issue any WAL records about pages that have no items @@ -833,6 +839,7 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, * against the last leaf page in the index, if that one wasn't vacuumed. */ if (XLogStandbyInfoActive() && + rel->rd_rel->relnamespace == PG_TOAST_NAMESPACE && vstate.lastBlockVacuumed < vstate.lastBlockLocked) { Buffer buf; @@ -1031,6 +1038,20 @@ restart: */ if (ndeletable > 0) { + BlockNumber lastBlockVacuumed = InvalidBlockNumber; + + /* + * We may need to record the lastBlockVacuumed for use when + * non-MVCC scans might be performed on the index on a + * hot standby. See explanation in btree_xlog_vacuum(). + * + * On a hot standby, a non-MVCC scan can only take place + * when we access a Toast Index, so we need only record + * the lastBlockVacuumed if we are vacuuming a Toast Index. + */ + if (rel->rd_rel->relnamespace == PG_TOAST_NAMESPACE) + lastBlockVacuumed = vstate->lastBlockVacuumed; + /* * Notice that the issued XLOG_BTREE_VACUUM WAL record includes an * instruction to the replay code to get cleanup lock on all pages @@ -1043,7 +1064,7 @@ restart: * that. */ _bt_delitems_vacuum(rel, buf, deletable, ndeletable, - vstate->lastBlockVacuumed); + lastBlockVacuumed); /* * Remember highest leaf page number we've issued a |