summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2015-12-03 16:15:36 -0500
committerRamon Fernandez <ramon@mongodb.com>2015-12-10 16:14:34 -0500
commit205797cbd42ec4ec29954ee4442f86f7def58107 (patch)
tree2b7ca4b0e174444b9253fcdb32c9ceb52840dc12
parente25bc60bbf7b7373f66be03d5c82c6197d66e83e (diff)
downloadmongo-205797cbd42ec4ec29954ee4442f86f7def58107.tar.gz
SERVER-21644 Invariant failure iter != _lockMap.end() in legacy_dist_lock_manager.cpp
(cherry picked from commit 4fd3712ce592f895cea5aff2209e4d26f5cf3a93)
-rw-r--r--src/mongo/s/catalog/legacy/distlock.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/mongo/s/catalog/legacy/distlock.cpp b/src/mongo/s/catalog/legacy/distlock.cpp
index 39b4768961b..7c6278304eb 100644
--- a/src/mongo/s/catalog/legacy/distlock.cpp
+++ b/src/mongo/s/catalog/legacy/distlock.cpp
@@ -723,7 +723,8 @@ bool DistributedLock::lock_try(const OID& lockID,
}
conn->update(LocksType::ConfigNS,
- BSON(LocksType::name(_name)),
+ BSON(LocksType::name(_name) << LocksType::state()
+ << BSON("$eq" << LocksType::LOCK_PREP)),
BSON("$set" << finalLockDetails.obj()));
BSONObj err = conn->getLastErrorDetailed();
@@ -731,10 +732,11 @@ bool DistributedLock::lock_try(const OID& lockID,
currLock = conn->findOne(LocksType::ConfigNS, BSON(LocksType::name(_name)));
- if (!errMsg.empty() || !err["n"].type() || err["n"].numberInt() < 1) {
+ if (!errMsg.empty() || !err["n"].type() || err["n"].numberInt() < 1 ||
+ currLock[LocksType::lockID()].OID() != lockID) {
warning() << "could not finalize winning lock " << lockName
<< (!errMsg.empty() ? causedBy(errMsg) : " (did not update lock) ")
- << endl;
+ << ", winning lock: " << currLock;
gotLock = false;
} else {
// SUCCESS!