dout(10) << " dn authpin by " << *r << " on " << *dn << dendl;
// get/create slave mdrequest
- MDRequest *mdr;
+ MDRequestRef mdr;
if (have_request(r->reqid))
mdr = request_get(r->reqid);
else
dout(10) << " inode authpin by " << *r << " on " << *in << dendl;
// get/create slave mdrequest
- MDRequest *mdr;
+ MDRequestRef mdr;
if (have_request(r->reqid))
mdr = request_get(r->reqid);
else
}
/* This function takes over the reference to the passed Message */
-MDRequest *MDCache::request_start(MClientRequest *req)
+MDRequestRef MDCache::request_start(MClientRequest *req)
{
// did we win a forward race against a slave?
if (active_requests.count(req->get_reqid())) {
- MDRequest *mdr = active_requests[req->get_reqid()];
+ MDRequestRef mdr = active_requests[req->get_reqid()];
if (mdr->is_slave()) {
dout(10) << "request_start already had " << *mdr << ", waiting for finish" << dendl;
mdr->more()->waiting_for_finish.push_back(new C_MDS_RetryMessage(mds, req));
dout(10) << "request_start already processing " << *mdr << ", dropping new msg" << dendl;
req->put();
}
- return 0;
+ return MDRequestRef();
}
// register new client request
- MDRequest *mdr = new MDRequest(req->get_reqid(), req->get_num_fwd(), req);
+ MDRequestRef mdr(new MDRequestImpl(req->get_reqid(),
+ req->get_num_fwd(), req));
active_requests[req->get_reqid()] = mdr;
dout(7) << "request_start " << *mdr << dendl;
return mdr;
}
-MDRequest *MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
+MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
{
- MDRequest *mdr = new MDRequest(ri, attempt, by);
+ MDRequestRef mdr(new MDRequestImpl(ri, attempt, by));
assert(active_requests.count(mdr->reqid) == 0);
active_requests[mdr->reqid] = mdr;
dout(7) << "request_start_slave " << *mdr << " by mds." << by << dendl;
return mdr;
}
-MDRequest *MDCache::request_start_internal(int op)
+MDRequestRef MDCache::request_start_internal(int op)
{
- MDRequest *mdr = new MDRequest;
+ MDRequestRef mdr(new MDRequestImpl);
mdr->reqid.name = entity_name_t::MDS(mds->get_nodeid());
mdr->reqid.tid = mds->issue_tid();
mdr->internal_op = op;
}
-MDRequest *MDCache::request_get(metareqid_t rid)
+MDRequestRef MDCache::request_get(metareqid_t rid)
{
assert(active_requests.count(rid));
dout(7) << "request_get " << rid << " " << *active_requests[rid] << dendl;
- return active_requests[rid];
+ return active_requests[rid].lock();
}
-void MDCache::request_finish(MDRequest *mdr)
+void MDCache::request_finish(MDRequestRef mdr)
{
dout(7) << "request_finish " << *mdr << dendl;
// remove from map
active_requests.erase(mdr->reqid);
- mdr->put();
// fail-safe!
if (was_replay && active_requests.empty()) {
info.has_frozen = true;
- MDRequest *mdr = request_start_internal(CEPH_MDS_OP_FRAGMENTDIR);
+ MDRequestRef mdr = request_start_internal(CEPH_MDS_OP_FRAGMENTDIR);
mdr->more()->fragment_base = basedirfrag;
dispatch_fragment_dir(mdr);
}
class ESubtreeMap;
struct Mutation;
-struct MDRequest;
+struct MDRequestImpl;
struct MDSlaveUpdate;
// -- requests --
protected:
- ceph::unordered_map<metareqid_t, MDRequest*> active_requests;
+ ceph::unordered_map<metareqid_t,ceph::weak_ptr<MDRequestImpl> > active_requests;
public:
int get_num_client_requests();
- MDRequest* request_start(MClientRequest *req);
- MDRequest* request_start_slave(metareqid_t rid, __u32 attempt, int by);
- MDRequest* request_start_internal(int op);
+ MDRequestRef request_start(MClientRequest *req);
+ MDRequestRef request_start_slave(metareqid_t rid, __u32 attempt, int by);
+ MDRequestRef request_start_internal(int op);
bool have_request(metareqid_t rid) {
return active_requests.count(rid);
}
}
// register + dispatch
- MDRequest *mdr = mdcache->request_start(req);
- if (mdr) {
+ MDRequestRef mdr = mdcache->request_start(req);
+ if (mdr.get()) {
if (session) {
mdr->session = session;
session->requests.push_back(&mdr->item_session_request);
req->releases.clear();
}
- if (mdr)
+ if (mdr.get())
dispatch_client_request(mdr);
return;
}
}
// am i a new slave?
- MDRequest *mdr = NULL;
+ MDRequestRef mdr;
if (mdcache->have_request(m->get_reqid())) {
// existing?
mdr = mdcache->request_get(m->get_reqid());
dout(10) << "local request " << *mdr << " attempt " << mdr->attempt << " < " << m->get_attempt()
<< ", closing out" << dendl;
mdcache->request_finish(mdr);
- mdr = NULL;
+ mdr.reset();
} else if (mdr->slave_to_mds != from) {
dout(10) << "local request " << *mdr << " not slave to mds." << from << dendl;
m->put();
return;
}
}
- if (!mdr) {
+ if (!mdr.get()) {
// new?
if (m->get_op() == MMDSSlaveRequest::OP_FINISH) {
dout(10) << "missing slave request for " << m->get_reqid()