From 85e6352649e734eb0fb9bcbf72fe76ca14a0cbce Mon Sep 17 00:00:00 2001 From: Nic Date: Tue, 7 Jan 2025 09:09:42 +1100 Subject: [PATCH] SERVER-98980: Lock globally earlier in validation (#30803) GitOrigin-RevId: f919575e634ec655da1cbafbabd4033593ecbd84 --- src/mongo/db/catalog/validate/validate_state.cpp | 4 +--- src/mongo/db/catalog/validate/validate_state.h | 5 +++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mongo/db/catalog/validate/validate_state.cpp b/src/mongo/db/catalog/validate/validate_state.cpp index 194fb0421ff..40430acec20 100644 --- a/src/mongo/db/catalog/validate/validate_state.cpp +++ b/src/mongo/db/catalog/validate/validate_state.cpp @@ -71,6 +71,7 @@ ValidateState::ValidateState(OperationContext* opCtx, const NamespaceString& nss, ValidationOptions options) : ValidationOptions(std::move(options)), + _globalLock(opCtx, isBackground() ? MODE_IS : MODE_IX), _nss(nss), _dataThrottle(opCtx, [&]() { return gMaxValidateMBperSec.load(); }) { @@ -158,8 +159,6 @@ Status ValidateState::initializeCollection(OperationContext* opCtx) { shard_role_details::getRecoveryUnit(opCtx)->setTimestampReadSource( RecoveryUnit::ReadSource::kProvided, *_validateTs); - _globalLock.emplace(opCtx, MODE_IS); - try { shard_role_details::getRecoveryUnit(opCtx)->preallocateSnapshot(); } catch (const ExceptionFor&) { @@ -177,7 +176,6 @@ Status ValidateState::initializeCollection(OperationContext* opCtx) { _collection = CollectionPtr(_catalog->establishConsistentCollection(opCtx, _nss, _validateTs)); } else { - _globalLock.emplace(opCtx, MODE_IX); _databaseLock.emplace(opCtx, _nss.dbName(), MODE_IX); _collectionLock.emplace(opCtx, _nss, MODE_X); _catalog = CollectionCatalog::get(opCtx); diff --git a/src/mongo/db/catalog/validate/validate_state.h b/src/mongo/db/catalog/validate/validate_state.h index 095a25d6d79..a9cfaf12838 100644 --- a/src/mongo/db/catalog/validate/validate_state.h +++ b/src/mongo/db/catalog/validate/validate_state.h @@ -144,9 +144,10 @@ public: private: ValidateState() = delete; + // To avoid racing with shutdown/rollback, this lock must be initialized early. + Lock::GlobalLock _globalLock; + NamespaceString _nss; - // To avoid racing with shutdown. - boost::optional _globalLock; // Locks for foreground validation only. boost::optional _databaseLock;