}
-// ==============================
-// Object locking
-
-//
-// If the target object of the operation op is locked for writing by another client, the function puts op to the waiting queue waiting_for_wr_unlock
-// returns true if object was locked, otherwise returns false
-//
-bool PG::block_if_wrlocked(MOSDOp* op, object_info_t& oi)
-{
- sobject_t soid(op->get_oid(), CEPH_NOSNAP);
-
- if (oi.wrlock_by.tid &&
- oi.wrlock_by.name != op->get_orig_source()) {
- //the object is locked for writing by someone else -- add the op to the waiting queue
- dout(10) << "blocked on wrlock on " << oi << dendl;
- waiting_for_wr_unlock[soid].push_back(op);
- return true;
- }
-
- return false; //the object wasn't locked, so the operation can be handled right away
-}
-
void PG::take_object_waiters(map<sobject_t, list<Message*> >& m)
{
for (map<sobject_t, list<Message*> >::iterator it = m.begin();
void take_object_waiters(map<sobject_t, list<Message*> >& m);
- hash_map<sobject_t, list<Message*> > waiting_for_wr_unlock;
-
bool block_if_wrlocked(MOSDOp* op, object_info_t& oi);
}
update_stats();
-#if 0
- // any completion stuff to do here?
- if (repop->ctx->ops.size()) {
- const sobject_t& soid = repop->ctx->obs->oi.soid;
- OSDOp& first = repop->ctx->ops[0];
-
- switch (first.op.op) {
- case CEPH_OSD_OP_UNBALANCEREADS:
- dout(0) << "op_applied completed unbalance-reads on " << oid << dendl;
- unbalancing_reads.erase(oid);
- if (waiting_for_unbalanced_reads.count(oid)) {
- osd->take_waiters(waiting_for_unbalanced_reads[oid]);
- waiting_for_unbalanced_reads.erase(oid);
- }
- break;
-
- case CEPH_OSD_OP_BALANCEREADS:
- dout(0) << "op_applied completed balance-reads on " << oid << dendl;
- /*
- if (waiting_for_balanced_reads.count(oid)) {
- osd->take_waiters(waiting_for_balanced_reads[oid]);
- waiting_for_balanced_reads.erase(oid);
- }
- */
- break;
-
- case CEPH_OSD_OP_WRUNLOCK:
- dout(0) << "op_applied completed wrunlock on " << soid << dendl;
- if (waiting_for_wr_unlock.count(soid)) {
- osd->take_waiters(waiting_for_wr_unlock[soid]);
- waiting_for_wr_unlock.erase(soid);
- }
- break;
- }
- }
-#endif
-
if (!repop->aborted)
eval_repop(repop);
return !object_contexts.empty();
}
- // load balancing
- set<sobject_t> balancing_reads;
- set<sobject_t> unbalancing_reads;
- hash_map<sobject_t, list<Message*> > waiting_for_unbalanced_reads; // i.e. primary-lock
// pull