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())
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);
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()) {
}
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() &&