diff options
author | Tommaso Tocci <tommaso.tocci@mongodb.com> | 2022-07-21 21:14:34 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-07-22 10:28:04 +0000 |
commit | 80eda720e188dc8d4847a3a5adfb7fd04d4be8cd (patch) | |
tree | 9ec25331567b6bb0dddcad88c0df296c8f12099a /src/mongo | |
parent | 65c4a53719c5f0dc19a1d1749d733f439155f957 (diff) | |
download | mongo-80eda720e188dc8d4847a3a5adfb7fd04d4be8cd.tar.gz |
SERVER-68193 Sharding DDL coordinator can lock itself out in distlock retry loop
(cherry picked from commit 8293cd56410cb005b1f26d2102668aec66539be6)
(cherry picked from commit aa7554e81cfc33887df92676eea4b91740bd9759)
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/s/sharding_ddl_coordinator.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/mongo/db/s/sharding_ddl_coordinator.cpp b/src/mongo/db/s/sharding_ddl_coordinator.cpp index 9ce509fe4b6..ad95f58fef4 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.cpp +++ b/src/mongo/db/s/sharding_ddl_coordinator.cpp @@ -139,12 +139,24 @@ ExecutorFuture<void> ShardingDDLCoordinator::_acquireLockAsync( auto distLock = distLockManager->lockDirectLocally( opCtx, resource, DistLockManager::kDefaultLockTimeout); - _scopedLocks.emplace(std::move(distLock)); uassertStatusOK(distLockManager->lockDirect( opCtx, resource, coorName, DistLockManager::kDefaultLockTimeout)); + _scopedLocks.emplace(std::move(distLock)); }) - .until([this](Status status) { return (!_recoveredFromDisk) || status.isOK(); }) + .until([this, resource = resource.toString()](Status status) { + if (!status.isOK()) { + LOGV2_WARNING(6819300, + "DDL lock acquisition attempt failed", + "coordinatorId"_attr = _coordId, + "resource"_attr = resource, + "error"_attr = redact(status)); + } + // Sharding DDL operations are not rollbackable so in case we recovered a coordinator + // from disk we need to ensure eventual completion of the DDL operation, so we must + // retry until we manage to acquire the lock. + return (!_recoveredFromDisk) || status.isOK(); + }) .withBackoffBetweenIterations(kExponentialBackoff) .on(**executor, token); } |