if (need_issue)
pneed_issue->insert(static_cast<CInode *>(lock->get_parent()));
}
- } else {
- lock->finish_waiters(SimpleLock::WAIT_REMOTEXLOCK);
}
mut->finish_locking(lock);
}
}
// send lock request
- if (!lock->is_waiter_for(SimpleLock::WAIT_REMOTEXLOCK)) {
- mut->start_locking(lock, target);
- mut->more()->slaves.insert(target);
- MMDSSlaveRequest *r = new MMDSSlaveRequest(mut->reqid, mut->attempt,
- MMDSSlaveRequest::OP_WRLOCK);
- r->set_lock_type(lock->get_type());
- lock->get_parent()->set_object_info(r->get_object_info());
- mds->send_message_mds(r, target);
- }
-
- // wait
- lock->add_waiter(SimpleLock::WAIT_REMOTEXLOCK, new C_MDS_RetryRequest(mdcache, mut));
+ mut->start_locking(lock, target);
+ mut->more()->slaves.insert(target);
+ MMDSSlaveRequest *r = new MMDSSlaveRequest(mut->reqid, mut->attempt,
+ MMDSSlaveRequest::OP_WRLOCK);
+ r->set_lock_type(lock->get_type());
+ lock->get_parent()->set_object_info(r->get_object_info());
+ mds->send_message_mds(r, target);
+
+ assert(mut->more()->waiting_on_slave.count(target) == 0);
+ mut->more()->waiting_on_slave.insert(target);
}
void Locker::remote_wrlock_finish(SimpleLock *lock, int target, Mutation *mut)
}
// send lock request
- if (!lock->is_waiter_for(SimpleLock::WAIT_REMOTEXLOCK)) {
- int auth = lock->get_parent()->authority().first;
- mut->more()->slaves.insert(auth);
- mut->start_locking(lock, auth);
- MMDSSlaveRequest *r = new MMDSSlaveRequest(mut->reqid, mut->attempt,
- MMDSSlaveRequest::OP_XLOCK);
- r->set_lock_type(lock->get_type());
- lock->get_parent()->set_object_info(r->get_object_info());
- mds->send_message_mds(r, auth);
- }
-
- // wait
- lock->add_waiter(SimpleLock::WAIT_REMOTEXLOCK, new C_MDS_RetryRequest(mdcache, mut));
+ int auth = lock->get_parent()->authority().first;
+ mut->more()->slaves.insert(auth);
+ mut->start_locking(lock, auth);
+ MMDSSlaveRequest *r = new MMDSSlaveRequest(mut->reqid, mut->attempt,
+ MMDSSlaveRequest::OP_XLOCK);
+ r->set_lock_type(lock->get_type());
+ lock->get_parent()->set_object_info(r->get_object_info());
+ mds->send_message_mds(r, auth);
+
+ assert(mut->more()->waiting_on_slave.count(auth) == 0);
+ mut->more()->waiting_on_slave.insert(auth);
+
return false;
}
}
mdr->locks.insert(lock);
mdr->finish_locking(lock);
lock->get_xlock(mdr, mdr->get_client());
- lock->finish_waiters(SimpleLock::WAIT_REMOTEXLOCK);
+
+ assert(mdr->more()->waiting_on_slave.count(from));
+ mdr->more()->waiting_on_slave.erase(from);
+ assert(mdr->more()->waiting_on_slave.empty());
+ dispatch_client_request(mdr);
}
break;
mdr->remote_wrlocks[lock] = from;
mdr->locks.insert(lock);
mdr->finish_locking(lock);
- lock->finish_waiters(SimpleLock::WAIT_REMOTEXLOCK);
+
+ assert(mdr->more()->waiting_on_slave.count(from));
+ mdr->more()->waiting_on_slave.erase(from);
+ assert(mdr->more()->waiting_on_slave.empty());
+ dispatch_client_request(mdr);
}
break;