summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2012-11-19 10:43:42 +0800
committerSage Weil <sage@inktank.com>2012-12-01 12:52:22 -0800
commit4cd8ea927e4fb00fac2c92553e0ce9494b248d2a (patch)
tree172b4534f5bb640d24ea7d9869d9011022c54cc4
parent9bfe540c659e2fcec34aa0a4b981e52f96b14f22 (diff)
downloadceph-4cd8ea927e4fb00fac2c92553e0ce9494b248d2a.tar.gz
mds: drop locks if requiring auth pinning new objects.
Locker::acquire_locks() skip auth pinning replica object if we only request a rdlock and the lock is read-lockable. To get all locks, we may call Locker::acquire_locks() several times, locks in replca objects may become not read-lockable between calls. So it is possible we need auth pin new objects after already take some locks. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
-rw-r--r--src/mds/Locker.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc
index c500be5f457..63f83116fe1 100644
--- a/src/mds/Locker.cc
+++ b/src/mds/Locker.cc
@@ -286,11 +286,12 @@ bool Locker::acquire_locks(MDRequest *mdr,
continue;
if (!object->is_auth()) {
+ if (!mdr->locks.empty())
+ mds->locker->drop_locks(mdr);
if (object->is_ambiguous_auth()) {
// wait
dout(10) << " ambiguous auth, waiting to authpin " << *object << dendl;
object->add_waiter(MDSCacheObject::WAIT_SINGLEAUTH, new C_MDS_RetryRequest(mdcache, mdr));
- mds->locker->drop_locks(mdr);
mdr->drop_local_auth_pins();
return false;
}