summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/index_build_block.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/catalog/index_build_block.cpp')
-rw-r--r--src/mongo/db/catalog/index_build_block.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/mongo/db/catalog/index_build_block.cpp b/src/mongo/db/catalog/index_build_block.cpp
index a5645e9de72..34dbf0c49ad 100644
--- a/src/mongo/db/catalog/index_build_block.cpp
+++ b/src/mongo/db/catalog/index_build_block.cpp
@@ -75,6 +75,11 @@ void IndexBuildBlock::_completeInit(OperationContext* opCtx, Collection* collect
.registerIndex(desc->indexName(),
desc->keyPattern(),
IndexFeatures::make(desc, collection->ns().isOnInternalDb()));
+ opCtx->recoveryUnit()->onRollback(
+ [collectionDecorations = collection->getSharedDecorations(), indexName = _indexName] {
+ CollectionIndexUsageTrackerDecoration::get(collectionDecorations)
+ .unregisterIndex(indexName);
+ });
}
Status IndexBuildBlock::initForResume(OperationContext* opCtx,
@@ -122,7 +127,7 @@ Status IndexBuildBlock::initForResume(OperationContext* opCtx,
return Status::OK();
}
-Status IndexBuildBlock::init(OperationContext* opCtx, Collection* collection) {
+Status IndexBuildBlock::init(OperationContext* opCtx, Collection* collection, bool forRecovery) {
// Being in a WUOW means all timestamping responsibility can be pushed up to the caller.
invariant(opCtx->lockState()->inAWriteUnitOfWork());
@@ -150,14 +155,25 @@ Status IndexBuildBlock::init(OperationContext* opCtx, Collection* collection) {
!replCoord->getMemberState().primary() && isBackgroundIndex;
}
- // Setup on-disk structures.
- Status status = collection->prepareForIndexBuild(
- opCtx, descriptor.get(), _buildUUID, isBackgroundSecondaryBuild);
- if (!status.isOK())
- return status;
+ if (!forRecovery) {
+ // Setup on-disk structures. We skip this during startup recovery for unfinished indexes as
+ // everything is already in-place.
+ Status status = collection->prepareForIndexBuild(
+ opCtx, descriptor.get(), _buildUUID, isBackgroundSecondaryBuild);
+ if (!status.isOK())
+ return status;
+ }
- auto indexCatalogEntry = collection->getIndexCatalog()->createIndexEntry(
- opCtx, collection, std::move(descriptor), CreateIndexEntryFlags::kNone);
+ auto indexCatalog = collection->getIndexCatalog();
+ IndexCatalogEntry* indexCatalogEntry = nullptr;
+ if (forRecovery) {
+ auto desc = indexCatalog->findIndexByName(
+ opCtx, _indexName, IndexCatalog::InclusionPolicy::kUnfinished);
+ indexCatalogEntry = desc->getEntry();
+ } else {
+ indexCatalogEntry = indexCatalog->createIndexEntry(
+ opCtx, collection, std::move(descriptor), CreateIndexEntryFlags::kNone);
+ }
if (_method == IndexBuildMethod::kHybrid) {
_indexBuildInterceptor = std::make_unique<IndexBuildInterceptor>(opCtx, indexCatalogEntry);