From: Sage Weil Date: Tue, 17 Aug 2010 19:16:02 +0000 (-0700) Subject: mds: drop x/wrlocks before, rdlocks after sending reply X-Git-Tag: v0.21.3~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a6b1a5e495beafe699144ea03bfadbe6af1c5ba0;p=ceph.git mds: drop x/wrlocks before, rdlocks after sending reply This lets us issue the most leases/caps possible. It also ensure we can issue caps in the snapped namespace when we are still on the head inode (previously, releasing the rdlock twiddled the state, the client didn't get say Frc, and hung indefinitely). --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 6bdab93eac3..cf2da389555 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -388,6 +388,14 @@ void Locker::drop_locks(Mutation *mut) wrlock_finish(*mut->wrlocks.begin(), mut); } +void Locker::drop_non_rdlocks(Mutation *mut) +{ + while (!mut->xlocks.empty()) + xlock_finish(*mut->xlocks.begin(), mut); + while (!mut->wrlocks.empty()) + wrlock_finish(*mut->wrlocks.begin(), mut); +} + void Locker::drop_rdlocks(Mutation *mut) { while (!mut->rdlocks.empty()) diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 31ae5ff3e97..1a72f773862 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -87,6 +87,7 @@ public: void drop_locks(Mutation *mut); void set_xlocks_done(Mutation *mut); + void drop_non_rdlocks(Mutation *mut); void drop_rdlocks(Mutation *mut); void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index c3105ff826c..cbe673ce08e 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -855,11 +855,8 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, Connection *client_con = req->get_connection(); client_con->get(); - // clean up request, drop locks, etc. - // do this before replying, so that we can issue leases - mdcache->request_finish(mdr); - mdr = 0; - req = 0; + // drop non-rdlocks before replying, so that we can issue leases + mds->locker->drop_non_rdlocks(mdr); // reply at all? if (client_inst.name.is_mds()) { @@ -883,6 +880,11 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, } client_con->put(); + // clean up request + mdcache->request_finish(mdr); + mdr = 0; + req = 0; + // take a closer look at tracei, if it happens to be a remote link if (tracei && tracei->get_parent_dn() &&