diff options
author | Benety Goh <benety@mongodb.com> | 2022-06-02 18:59:45 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-06-21 17:23:35 +0000 |
commit | 7aaea4fc06a5f83aaa96bd9143e04c5794e0aa6a (patch) | |
tree | b28b9fcf273bb89448575dd9e2b7f66524fa9392 | |
parent | 699be8f8b3cde2038894f31041c9daaf6db7c032 (diff) | |
download | mongo-7aaea4fc06a5f83aaa96bd9143e04c5794e0aa6a.tar.gz |
SERVER-66520 add index build UUID to BackgroundOperationInProgress message
(cherry picked from commit d6a12bacdc9ebee0f4813d3f0a81252aa4f519bb)
-rw-r--r-- | src/mongo/db/active_index_builds.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/index_builds_coordinator.cpp | 40 | ||||
-rw-r--r-- | src/mongo/db/index_builds_coordinator_mongod_test.cpp | 25 |
3 files changed, 57 insertions, 22 deletions
diff --git a/src/mongo/db/active_index_builds.cpp b/src/mongo/db/active_index_builds.cpp index 017ca49ecc8..d6a7f5afabf 100644 --- a/src/mongo/db/active_index_builds.cpp +++ b/src/mongo/db/active_index_builds.cpp @@ -28,6 +28,8 @@ */ #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kStorage +#include <fmt/format.h> + #include "mongo/db/active_index_builds.h" #include "mongo/db/catalog/index_builds_manager.h" #include "mongo/logv2/log.h" @@ -63,10 +65,14 @@ void ActiveIndexBuilds::waitForAllIndexBuildsToStopForShutdown(OperationContext* void ActiveIndexBuilds::assertNoIndexBuildInProgress() const { stdx::unique_lock<Latch> lk(_mutex); - uassert(ErrorCodes::BackgroundOperationInProgressForDatabase, - str::stream() << "cannot perform operation: there are currently " - << _allIndexBuilds.size() << " index builds running.", - _allIndexBuilds.size() == 0); + if (!_allIndexBuilds.empty()) { + auto firstIndexBuild = _allIndexBuilds.cbegin()->second; + uasserted(ErrorCodes::BackgroundOperationInProgressForDatabase, + fmt::format("cannot perform operation: there are currently {} index builds " + "running. Found index build: {}", + _allIndexBuilds.size(), + firstIndexBuild->buildUUID.toString())); + } } void ActiveIndexBuilds::waitUntilAnIndexBuildFinishes(OperationContext* opCtx) { diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp index 1e06ec2932a..45c1afefdae 100644 --- a/src/mongo/db/index_builds_coordinator.cpp +++ b/src/mongo/db/index_builds_coordinator.cpp @@ -29,10 +29,10 @@ #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kStorage -#include "mongo/platform/basic.h" - #include "mongo/db/index_builds_coordinator.h" +#include <fmt/format.h> + #include "mongo/db/catalog/clustered_collection_util.h" #include "mongo/db/catalog/collection_catalog.h" #include "mongo/db/catalog/commit_quorum_options.h" @@ -1659,19 +1659,39 @@ void IndexBuildsCoordinator::assertNoIndexBuildInProgress() const { void IndexBuildsCoordinator::assertNoIndexBuildInProgForCollection( const UUID& collectionUUID) const { + boost::optional<UUID> firstIndexBuildUUID; + auto indexBuilds = activeIndexBuilds.filterIndexBuilds([&](const auto& replState) { + auto isIndexBuildForCollection = (collectionUUID == replState.collectionUUID); + if (isIndexBuildForCollection && !firstIndexBuildUUID) { + firstIndexBuildUUID = replState.buildUUID; + }; + return isIndexBuildForCollection; + }); + uassert(ErrorCodes::BackgroundOperationInProgressForNamespace, - str::stream() << "cannot perform operation: an index build is currently running for " - "collection with UUID: " - << collectionUUID, - !inProgForCollection(collectionUUID)); + fmt::format("cannot perform operation: an index build is currently running for " + "collection with UUID: {}. Found index build: {}", + collectionUUID.toString(), + firstIndexBuildUUID->toString()), + indexBuilds.empty()); } void IndexBuildsCoordinator::assertNoBgOpInProgForDb(StringData db) const { + boost::optional<UUID> firstIndexBuildUUID; + auto indexBuilds = activeIndexBuilds.filterIndexBuilds([&](const auto& replState) { + auto isIndexBuildForCollection = (db == replState.dbName); + if (isIndexBuildForCollection && !firstIndexBuildUUID) { + firstIndexBuildUUID = replState.buildUUID; + }; + return isIndexBuildForCollection; + }); + uassert(ErrorCodes::BackgroundOperationInProgressForDatabase, - str::stream() << "cannot perform operation: an index build is currently running for " - "database " - << db, - !inProgForDb(db)); + fmt::format("cannot perform operation: an index build is currently running for " + "database {}. Found index build: {}", + db, + firstIndexBuildUUID->toString()), + indexBuilds.empty()); } void IndexBuildsCoordinator::awaitNoIndexBuildInProgressForCollection(OperationContext* opCtx, diff --git a/src/mongo/db/index_builds_coordinator_mongod_test.cpp b/src/mongo/db/index_builds_coordinator_mongod_test.cpp index 28e09af1ef7..ecca38a9d94 100644 --- a/src/mongo/db/index_builds_coordinator_mongod_test.cpp +++ b/src/mongo/db/index_builds_coordinator_mongod_test.cpp @@ -86,6 +86,9 @@ void IndexBuildsCoordinatorMongodTest::setUp() { } void IndexBuildsCoordinatorMongodTest::tearDown() { + // Resume index builds left running by test failures so that shutdown() will not block. + _indexBuildsCoord->sleepIndexBuilds_forTestOnly(false); + _indexBuildsCoord->shutdown(operationContext()); _indexBuildsCoord.reset(); // All databases are dropped during tear down. @@ -155,24 +158,27 @@ TEST_F(IndexBuildsCoordinatorMongodTest, Registration) { _indexBuildsCoord->sleepIndexBuilds_forTestOnly(true); // Register an index build on _testFooNss. + auto testFoo1BuildUUID = UUID::gen(); auto testFoo1Future = assertGet(_indexBuildsCoord->startIndexBuild(operationContext(), _testFooNss.db().toString(), _testFooUUID, makeSpecs(_testFooNss, {"a", "b"}), - UUID::gen(), + testFoo1BuildUUID, IndexBuildProtocol::kTwoPhase, _indexBuildOptions)); ASSERT_EQ(_indexBuildsCoord->numInProgForDb(_testFooNss.db()), 1); ASSERT(_indexBuildsCoord->inProgForCollection(_testFooUUID)); ASSERT(_indexBuildsCoord->inProgForDb(_testFooNss.db())); - ASSERT_THROWS_CODE(_indexBuildsCoord->assertNoIndexBuildInProgForCollection(_testFooUUID), - AssertionException, - ErrorCodes::BackgroundOperationInProgressForNamespace); - ASSERT_THROWS_CODE(_indexBuildsCoord->assertNoBgOpInProgForDb(_testFooNss.db()), - AssertionException, - ErrorCodes::BackgroundOperationInProgressForDatabase); + ASSERT_THROWS_WITH_CHECK( + _indexBuildsCoord->assertNoIndexBuildInProgForCollection(_testFooUUID), + ExceptionFor<ErrorCodes::BackgroundOperationInProgressForNamespace>, + [&](const auto& ex) { ASSERT_STRING_CONTAINS(ex.reason(), testFoo1BuildUUID.toString()); }); + ASSERT_THROWS_WITH_CHECK( + _indexBuildsCoord->assertNoBgOpInProgForDb(_testFooNss.db()), + ExceptionFor<ErrorCodes::BackgroundOperationInProgressForDatabase>, + [&](const auto& ex) { ASSERT_STRING_CONTAINS(ex.reason(), testFoo1BuildUUID.toString()); }); // Register a second index build on _testFooNss. auto testFoo2Future = @@ -382,7 +388,10 @@ TEST_F(IndexBuildsCoordinatorMongodTest, AbortBuildIndexDueToTenantMigration) { // we currently have one index build in progress. ASSERT_EQ(1, _indexBuildsCoord->getActiveIndexBuildCount(operationContext())); - ASSERT_THROWS(_indexBuildsCoord->assertNoIndexBuildInProgress(), mongo::DBException); + ASSERT_THROWS_WITH_CHECK( + _indexBuildsCoord->assertNoIndexBuildInProgress(), + ExceptionFor<ErrorCodes::BackgroundOperationInProgressForDatabase>, + [&](const auto& ex) { ASSERT_STRING_CONTAINS(ex.reason(), buildUUID.toString()); }); ASSERT_OK(_indexBuildsCoord->voteCommitIndexBuild( operationContext(), buildUUID, HostAndPort("test1", 1234))); |