diff options
Diffstat (limited to 'src/mongo/db/index_builds_coordinator.cpp')
-rw-r--r-- | src/mongo/db/index_builds_coordinator.cpp | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp index d00dcab50d6..5b954baa536 100644 --- a/src/mongo/db/index_builds_coordinator.cpp +++ b/src/mongo/db/index_builds_coordinator.cpp @@ -90,8 +90,9 @@ MONGO_FAIL_POINT_DEFINE(hangBeforeBuildingIndexSecond); MONGO_FAIL_POINT_DEFINE(hangIndexBuildBeforeWaitingUntilMajorityOpTime); MONGO_FAIL_POINT_DEFINE(failSetUpResumeIndexBuild); -IndexBuildsCoordinator::ActiveIndexBuildsSSS::ActiveIndexBuildsSSS() - : ServerStatusSection("activeIndexBuilds"), +IndexBuildsCoordinator::IndexBuildsSSS::IndexBuildsSSS() + : ServerStatusSection("indexBuilds"), + registered(0), scanCollection(0), drainSideWritesTable(0), drainSideWritesTablePreCommit(0), @@ -550,15 +551,15 @@ Status IndexBuildsCoordinator::_startIndexBuildForRecovery(OperationContext* opC // 1) Drop all unfinished indexes. // 2) Start, but do not complete the index build process. WriteUnitOfWork wuow(opCtx); - auto indexCatalog = collection.getWritableCollection()->getIndexCatalog(); + auto indexCatalog = collection.getWritableCollection(opCtx)->getIndexCatalog(); for (size_t i = 0; i < indexNames.size(); i++) { auto descriptor = indexCatalog->findIndexByName( opCtx, indexNames[i], IndexCatalog::InclusionPolicy::kReady); if (descriptor) { - Status s = - indexCatalog->dropIndex(opCtx, collection.getWritableCollection(), descriptor); + Status s = indexCatalog->dropIndex( + opCtx, collection.getWritableCollection(opCtx), descriptor); if (!s.isOK()) { return s; } @@ -598,7 +599,7 @@ Status IndexBuildsCoordinator::_startIndexBuildForRecovery(OperationContext* opC IndexCatalog::InclusionPolicy::kFrozen); if (descriptor) { Status s = indexCatalog->dropUnfinishedIndex( - opCtx, collection.getWritableCollection(), descriptor); + opCtx, collection.getWritableCollection(opCtx), descriptor); if (!s.isOK()) { return s; } @@ -609,7 +610,7 @@ Status IndexBuildsCoordinator::_startIndexBuildForRecovery(OperationContext* opC catalog::removeIndex( opCtx, indexNames[i], - collection.getWritableCollection(), + collection.getWritableCollection(opCtx), nullptr /* ident */, // Unfinished or partially dropped indexes do not need two-phase drop b/c the // incomplete index will never be recovered. This is an optimization that will @@ -621,7 +622,7 @@ Status IndexBuildsCoordinator::_startIndexBuildForRecovery(OperationContext* opC // We need to initialize the collection to rebuild the indexes. The collection may already // be initialized when rebuilding indexes with rollback-via-refetch. if (!collection->isInitialized()) { - collection.getWritableCollection()->init(opCtx); + collection.getWritableCollection(opCtx)->init(opCtx); } auto dbName = nss.db().toString(); @@ -632,6 +633,7 @@ Status IndexBuildsCoordinator::_startIndexBuildForRecovery(OperationContext* opC if (!status.isOK()) { return status; } + indexBuildsSSS.registered.addAndFetch(1); IndexBuildsManager::SetupOptions options; options.protocol = protocol; @@ -703,7 +705,7 @@ Status IndexBuildsCoordinator::_setUpResumeIndexBuild(OperationContext* opCtx, if (!collection->isInitialized()) { WriteUnitOfWork wuow(opCtx); - collection.getWritableCollection()->init(opCtx); + collection.getWritableCollection(opCtx)->init(opCtx); wuow.commit(); } @@ -715,6 +717,7 @@ Status IndexBuildsCoordinator::_setUpResumeIndexBuild(OperationContext* opCtx, if (!status.isOK()) { return status; } + indexBuildsSSS.registered.addAndFetch(1); IndexBuildsManager::SetupOptions options; options.protocol = protocol; @@ -1808,11 +1811,12 @@ void IndexBuildsCoordinator::createIndexesOnEmptyCollection(OperationContext* op auto opObserver = opCtx->getServiceContext()->getOpObserver(); - auto indexCatalog = collection.getWritableCollection()->getIndexCatalog(); + auto indexCatalog = collection.getWritableCollection(opCtx)->getIndexCatalog(); // Always run single phase index build for empty collection. And, will be coordinated using // createIndexes oplog entry. for (const auto& spec : specs) { - if (spec.hasField("clustered") && spec.getBoolField("clustered")) { + if (spec.hasField(IndexDescriptor::kClusteredFieldName) && + spec.getBoolField(IndexDescriptor::kClusteredFieldName)) { // The index is already built implicitly. continue; } @@ -1821,7 +1825,7 @@ void IndexBuildsCoordinator::createIndexesOnEmptyCollection(OperationContext* op // timestamp. opObserver->onCreateIndex(opCtx, nss, collectionUUID, spec, fromMigrate); uassertStatusOK(indexCatalog->createIndexOnEmptyCollection( - opCtx, collection.getWritableCollection(), spec)); + opCtx, collection.getWritableCollection(opCtx), spec)); } } @@ -1963,6 +1967,7 @@ IndexBuildsCoordinator::_filterSpecsAndRegisterBuild(OperationContext* opCtx, if (!status.isOK()) { return status; } + indexBuildsSSS.registered.addAndFetch(1); // The index has been registered on the Coordinator in an unstarted state. Return an // uninitialized Future so that the caller can set up the index build by calling @@ -2519,7 +2524,7 @@ void IndexBuildsCoordinator::_scanCollectionAndInsertSortedKeysIntoIndex( boost::optional<RecordId> resumeAfterRecordId) { // Collection scan and insert into index. { - const ScopedCounter counter{activeIndexBuildsSSS.scanCollection}; + indexBuildsSSS.scanCollection.addAndFetch(1); ScopeGuard scopeGuard([&] { opCtx->recoveryUnit()->setTimestampReadSource(RecoveryUnit::ReadSource::kNoTimestamp); @@ -2585,7 +2590,7 @@ CollectionPtr IndexBuildsCoordinator::_setUpForScanCollectionAndInsertSortedKeys */ void IndexBuildsCoordinator::_insertKeysFromSideTablesWithoutBlockingWrites( OperationContext* opCtx, std::shared_ptr<ReplIndexBuildState> replState) { - const ScopedCounter counter{activeIndexBuildsSSS.drainSideWritesTable}; + indexBuildsSSS.drainSideWritesTable.addAndFetch(1); // Perform the first drain while holding an intent lock. const NamespaceStringOrUUID dbAndUUID(replState->dbName, replState->collectionUUID); @@ -2611,7 +2616,7 @@ void IndexBuildsCoordinator::_insertKeysFromSideTablesBlockingWrites( OperationContext* opCtx, std::shared_ptr<ReplIndexBuildState> replState, const IndexBuildOptions& indexBuildOptions) { - const ScopedCounter counter{activeIndexBuildsSSS.drainSideWritesTablePreCommit}; + indexBuildsSSS.drainSideWritesTablePreCommit.addAndFetch(1); const NamespaceStringOrUUID dbAndUUID(replState->dbName, replState->collectionUUID); // Perform the second drain while stopping writes on the collection. { @@ -2717,7 +2722,7 @@ IndexBuildsCoordinator::CommitResult IndexBuildsCoordinator::_insertKeysFromSide << ", collection UUID: " << replState->collectionUUID); { - const ScopedCounter counter{activeIndexBuildsSSS.drainSideWritesTableOnCommit}; + indexBuildsSSS.drainSideWritesTableOnCommit.addAndFetch(1); // Perform the third and final drain after releasing a shared lock and reacquiring an // exclusive lock on the collection. uassertStatusOK(_indexBuildsManager.drainBackgroundWrites( @@ -2759,8 +2764,7 @@ IndexBuildsCoordinator::CommitResult IndexBuildsCoordinator::_insertKeysFromSide // can be called for two-phase builds in all replication states except during initial sync // when this node is not guaranteed to be consistent. { - const ScopedCounter counter{ - activeIndexBuildsSSS.processConstraintsViolatonTableOnCommit}; + indexBuildsSSS.processConstraintsViolatonTableOnCommit.addAndFetch(1); bool twoPhaseAndNotInitialSyncing = IndexBuildProtocol::kTwoPhase == replState->protocol && !replCoord->getMemberState().startup2(); @@ -2770,7 +2774,7 @@ IndexBuildsCoordinator::CommitResult IndexBuildsCoordinator::_insertKeysFromSide opCtx, collection.get(), replState->buildUUID)); } } - const ScopedCounter counter{activeIndexBuildsSSS.commit}; + indexBuildsSSS.commit.addAndFetch(1); // If two phase index builds is enabled, index build will be coordinated using // startIndexBuild and commitIndexBuild oplog entries. |