summaryrefslogtreecommitdiff
path: root/src/mongo/db/index_builds_coordinator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/index_builds_coordinator.cpp')
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp42
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.