SERVER-98980: Lock globally earlier in validation (#30803)
GitOrigin-RevId: f919575e634ec655da1cbafbabd4033593ecbd84
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user