summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2022-06-02 18:59:45 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-06-21 17:23:35 +0000
commit7aaea4fc06a5f83aaa96bd9143e04c5794e0aa6a (patch)
treeb28b9fcf273bb89448575dd9e2b7f66524fa9392
parent699be8f8b3cde2038894f31041c9daaf6db7c032 (diff)
downloadmongo-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.cpp14
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp40
-rw-r--r--src/mongo/db/index_builds_coordinator_mongod_test.cpp25
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)));