set<SimpleLock*> &wrlocks,
set<SimpleLock*> &xlocks,
map<SimpleLock*,int> *remote_wrlocks,
- CInode *auth_pin_freeze)
+ CInode *auth_pin_freeze,
+ bool auth_pin_nonblock)
{
if (mdr->done_locking &&
!mdr->is_slave()) { // not on slaves! master requests locks piecemeal.
}
if (!object->can_auth_pin()) {
// wait
- dout(10) << " can't auth_pin (freezing?), waiting to authpin " << *object << dendl;
- object->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_MDS_RetryRequest(mdcache, mdr));
mds->locker->drop_locks(mdr);
mdr->drop_local_auth_pins();
+ if (auth_pin_nonblock) {
+ dout(10) << " can't auth_pin (freezing?) " << *object << ", nonblocking" << dendl;
+ mdr->aborted = true;
+ return false;
+ }
+ dout(10) << " can't auth_pin (freezing?), waiting to authpin " << *object << dendl;
+ object->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_MDS_RetryRequest(mdcache, mdr));
return false;
}
}
(*q)->set_object_info(req->get_authpin_freeze());
mdr->pin(*q);
}
+ if (auth_pin_nonblock)
+ req->mark_nonblock();
mds->send_message_mds(req, p->first);
// put in waiting list
set<SimpleLock*> &wrlocks,
set<SimpleLock*> &xlocks,
map<SimpleLock*,int> *remote_wrlocks=NULL,
- CInode *auth_pin_freeze=NULL);
+ CInode *auth_pin_freeze=NULL,
+ bool auth_pin_nonblock=false);
void cancel_locking(Mutation *mut, set<CInode*> *pneed_issue);
void drop_locks(Mutation *mut, set<CInode*> *pneed_issue=0);
// build list of objects
list<MDSCacheObject*> objects;
CInode *auth_pin_freeze = NULL;
- bool fail = false;
+ bool fail = false, wouldblock = false;
for (vector<MDSCacheObjectInfo>::iterator p = mdr->slave_request->get_authpins().begin();
p != mdr->slave_request->get_authpins().end();
break;
}
if (!mdr->can_auth_pin(*p)) {
+ if (mdr->slave_request->is_nonblock()) {
+ dout(10) << " can't auth_pin (freezing?) " << **p << " nonblocking" << dendl;
+ fail = true;
+ wouldblock = true;
+ break;
+ }
// wait
dout(10) << " waiting for authpinnable on " << **p << dendl;
(*p)->add_waiter(CDir::WAIT_UNFREEZE, new C_MDS_RetryRequest(mdcache, mdr));
if (auth_pin_freeze)
auth_pin_freeze->set_object_info(reply->get_authpin_freeze());
+ if (wouldblock)
+ reply->mark_error_wouldblock();
+
mds->send_message_mds(reply, mdr->slave_to_mds);
// clean up this request
++p;
}
}
+
+ if (ack->is_error_wouldblock())
+ mdr->aborted = true;
// note slave
mdr->more()->slaves.insert(from);
metareqid_t reqid;
__u32 attempt;
__s16 op;
+ __u16 flags;
+
+ static const unsigned FLAG_NONBLOCK = 1;
+ static const unsigned FLAG_WOULDBLOCK = 2;
// for locking
__u16 lock_type; // lock object type
MDSCacheObjectInfo &get_authpin_freeze() { return object_info; }
vector<MDSCacheObjectInfo>& get_authpins() { return authpins; }
+ void mark_nonblock() { flags |= FLAG_NONBLOCK; }
+ bool is_nonblock() { return (flags & FLAG_NONBLOCK); }
+ void mark_error_wouldblock() { flags |= FLAG_WOULDBLOCK; }
+ bool is_error_wouldblock() { return (flags & FLAG_WOULDBLOCK); }
void set_lock_type(int t) { lock_type = t; }
MMDSSlaveRequest() : Message(MSG_MDS_SLAVE_REQUEST) { }
MMDSSlaveRequest(metareqid_t ri, __u32 att, int o) :
Message(MSG_MDS_SLAVE_REQUEST),
- reqid(ri), attempt(att), op(o) { }
+ reqid(ri), attempt(att), op(o), flags(0) { }
private:
~MMDSSlaveRequest() {}
::encode(reqid, payload);
::encode(attempt, payload);
::encode(op, payload);
+ ::encode(flags, payload);
::encode(lock_type, payload);
::encode(object_info, payload);
::encode(authpins, payload);
::decode(reqid, p);
::decode(attempt, p);
::decode(op, p);
+ ::decode(flags, p);
::decode(lock_type, p);
::decode(object_info, p);
::decode(authpins, p);