diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2012-11-19 10:43:42 +0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-12-01 12:52:22 -0800 |
commit | 4cd8ea927e4fb00fac2c92553e0ce9494b248d2a (patch) | |
tree | 172b4534f5bb640d24ea7d9869d9011022c54cc4 | |
parent | 9bfe540c659e2fcec34aa0a4b981e52f96b14f22 (diff) | |
download | ceph-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.cc | 3 |
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; } |