summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorTommaso Tocci <tommaso.tocci@mongodb.com>2022-07-21 21:14:34 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-07-22 10:28:04 +0000
commit80eda720e188dc8d4847a3a5adfb7fd04d4be8cd (patch)
tree9ec25331567b6bb0dddcad88c0df296c8f12099a /src/mongo
parent65c4a53719c5f0dc19a1d1749d733f439155f957 (diff)
downloadmongo-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.cpp16
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);
}