}
-void MDCache::request_forget_foreign_locks(MDRequest *mdr)
+void MDCache::request_drop_foreign_locks(MDRequest *mdr)
{
- // xlocks
+ // clean up slaves
+ // (will implicitly drop remote dn pins)
+ for (set<int>::iterator p = mdr->more()->slaves.begin();
+ p != mdr->more()->slaves.end();
+ ++p) {
+ MMDSSlaveRequest *r = new MMDSSlaveRequest(mdr->reqid, MMDSSlaveRequest::OP_FINISH);
+ mds->send_message_mds(r, *p);
+ }
+
+ /* strip foreign xlocks out of lock lists, since the OP_FINISH drops them
+ * implicitly. Note that we don't call the finishers -- there shouldn't
+ * be any on a remote lock and the request finish wakes up all
+ * the waiters anyway! */
set<SimpleLock*>::iterator p = mdr->xlocks.begin();
while (p != mdr->xlocks.end()) {
if ((*p)->get_parent()->is_auth())
p++;
else {
- dout(10) << "request_forget_foreign_locks " << **p
+ dout(10) << "request_drop_foreign_locks forgetting lock " << **p
<< " on " << *(*p)->get_parent() << dendl;
(*p)->put_xlock();
mdr->locks.erase(*p);
mdr->xlocks.erase(p++);
}
}
+
+ mdr->more()->slaves.clear(); /* we no longer have requests out to them, and
+ * leaving them in can cause double-notifies as
+ * this function can get called more than once */
}
+void MDCache::request_drop_non_rdlocks(MDRequest *mdr)
+{
+ request_drop_foreign_locks(mdr);
+ mds->locker->drop_non_rdlocks(mdr);
+}
void MDCache::request_drop_locks(MDRequest *mdr)
{
- // clean up slaves
- // (will implicitly drop remote dn pins)
- for (set<int>::iterator p = mdr->more()->slaves.begin();
- p != mdr->more()->slaves.end();
- ++p) {
- MMDSSlaveRequest *r = new MMDSSlaveRequest(mdr->reqid, MMDSSlaveRequest::OP_FINISH);
- mds->send_message_mds(r, *p);
- }
-
- // strip foreign xlocks out of lock lists, since the OP_FINISH drops them implicitly.
- request_forget_foreign_locks(mdr);
-
-
- // drop locks
+ request_drop_foreign_locks(mdr);
mds->locker->drop_locks(mdr);
}
void request_finish(MDRequest *mdr);
void request_forward(MDRequest *mdr, int mds, int port=0);
void dispatch_request(MDRequest *mdr);
- void request_forget_foreign_locks(MDRequest *mdr);
+ void request_drop_foreign_locks(MDRequest *mdr);
+ void request_drop_non_rdlocks(MDRequest *r);
void request_drop_locks(MDRequest *r);
void request_cleanup(MDRequest *r);