SERVER-98980: Lock globally earlier in validation (#30803)

GitOrigin-RevId: f919575e634ec655da1cbafbabd4033593ecbd84
This commit is contained in:
Nic 2025-01-07 09:09:42 +11:00 committed by MongoDB Bot
parent d3f1e1732d
commit 85e6352649
2 changed files with 4 additions and 5 deletions

View File

@ -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<ErrorCodes::SnapshotTooOld>&) {
@ -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);

View File

@ -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<Lock::GlobalLock> _globalLock;
// Locks for foreground validation only.
boost::optional<AutoGetDb> _databaseLock;