From 979ecf1842bb431badd5ad6b6025ac257742c684 Mon Sep 17 00:00:00 2001 From: Pierlauro Sciarelli Date: Fri, 27 Aug 2021 12:48:56 +0000 Subject: SERVER-59500 DDL coordinators must not release dist locks on stepdown --- src/mongo/db/s/dist_lock_manager.h | 4 ++++ src/mongo/db/s/sharding_ddl_coordinator.cpp | 32 ++++++++++++++++++++++------- src/mongo/db/s/sharding_ddl_coordinator.h | 2 +- 3 files changed, 30 insertions(+), 8 deletions(-) (limited to 'src/mongo/db') diff --git a/src/mongo/db/s/dist_lock_manager.h b/src/mongo/db/s/dist_lock_manager.h index dfd0270732e..556cdbd8788 100644 --- a/src/mongo/db/s/dist_lock_manager.h +++ b/src/mongo/db/s/dist_lock_manager.h @@ -76,6 +76,10 @@ public: ScopedLock(ScopedLock&& other); + const StringData getNs() { + return _ns; + } + private: std::string _ns; DistLockManager* _lockManager; diff --git a/src/mongo/db/s/sharding_ddl_coordinator.cpp b/src/mongo/db/s/sharding_ddl_coordinator.cpp index 7285f42d37b..87c4fd2cb34 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.cpp +++ b/src/mongo/db/s/sharding_ddl_coordinator.cpp @@ -117,9 +117,13 @@ ExecutorFuture ShardingDDLCoordinator::_acquireLockAsync( auto distLockManager = DistLockManager::get(opCtx); const auto coorName = DDLCoordinatorType_serializer(_coordId.getOperationType()); - auto distLock = uassertStatusOK(distLockManager->lock( + + auto distLock = distLockManager->lockDirectLocally( + opCtx, resource, DistLockManager::kDefaultLockTimeout); + _scopedLocks.emplace(std::move(distLock)); + + uassertStatusOK(distLockManager->lockDirect( opCtx, resource, coorName, DistLockManager::kDefaultLockTimeout)); - _scopedLocks.emplace(distLock.moveToAnotherThread()); }) .until([this](Status status) { return (!_recoveredFromDisk) || status.isOK(); }) .withBackoffBetweenIterations(kExponentialBackoff) @@ -237,10 +241,12 @@ SemiFuture ShardingDDLCoordinator::run(std::shared_ptr() && - !status.isA()) || - (!status.isOK() && _completeOnError)) { + bool isSteppingDown = status.isA() || + status.isA(); + + // Release the coordinator only in case the node is not stepping down or in case of + // acceptable error + if (!isSteppingDown || (!status.isOK() && _completeOnError)) { try { LOGV2(5565601, "Releasing sharding DDL coordinator", @@ -271,8 +277,20 @@ SemiFuture ShardingDDLCoordinator::run(std::shared_ptrunlock(opCtx, resource); + } _scopedLocks.pop(); } diff --git a/src/mongo/db/s/sharding_ddl_coordinator.h b/src/mongo/db/s/sharding_ddl_coordinator.h index 5077161911e..a3d9fc342a8 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.h +++ b/src/mongo/db/s/sharding_ddl_coordinator.h @@ -200,7 +200,7 @@ private: SharedPromise _constructionCompletionPromise; SharedPromise _completionPromise; - std::stack _scopedLocks; + std::stack _scopedLocks; }; class ShardingDDLCoordinator_NORESILIENT { -- cgit v1.2.1