From 565b2c8938286f6671ad52f3f9503185f9b50073 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 7 Mar 2014 16:37:25 -0800 Subject: [PATCH] Server: Use MDRequestRef instead of raw pointers Signed-off-by: Greg Farnum --- src/mds/MDCache.cc | 3 + src/mds/Server.cc | 278 ++++++++++++++++++++++----------------------- src/mds/Server.h | 179 +++++++++++++++-------------- 3 files changed, 231 insertions(+), 229 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index b61808adc3289..bc2985def98f5 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8856,6 +8856,7 @@ MDRequestRef MDCache::request_start(MClientRequest *req) // register new client request MDRequestRef mdr(new MDRequestImpl(req->get_reqid(), req->get_num_fwd(), req)); + mdr->set_self_ref(mdr); active_requests[req->get_reqid()] = mdr; dout(7) << "request_start " << *mdr << dendl; return mdr; @@ -8864,6 +8865,7 @@ MDRequestRef MDCache::request_start(MClientRequest *req) MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by) { MDRequestRef mdr(new MDRequestImpl(ri, attempt, by)); + mdr->set_self_ref(mdr); assert(active_requests.count(mdr->reqid) == 0); active_requests[mdr->reqid] = mdr; dout(7) << "request_start_slave " << *mdr << " by mds." << by << dendl; @@ -8873,6 +8875,7 @@ MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by) MDRequestRef MDCache::request_start_internal(int op) { MDRequestRef mdr(new MDRequestImpl); + mdr->set_self_ref(mdr); mdr->reqid.name = entity_name_t::MDS(mds->get_nodeid()); mdr->reqid.tid = mds->issue_tid(); mdr->internal_op = op; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 6c7da2389231c..2521b60046125 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -548,7 +548,8 @@ void Server::journal_close_session(Session *session, int state) session->requests.begin(member_offset(MDRequestImpl, item_session_request)); while (!p.end()) { - MDRequestImpl *mdr = *p; + MDRequestRef mdrp = (*p)->self_ref.lock(); + assert(mdr); ++p; mdcache->request_kill(mdr); } @@ -780,8 +781,7 @@ void Server::recall_client_state(float ratio) /******* * some generic stuff for finishing off requests */ -/* This function takes responsibility for the passed mdr*/ -void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin) +void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin) { dout(10) << "journal_and_reply tracei " << in << " tracedn " << dn << dendl; @@ -815,12 +815,12 @@ void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent /* * send generic response (just an error code), clean up mdr */ -void Server::reply_request(MDRequest *mdr, int r, CInode *tracei, CDentry *tracedn) +void Server::reply_request(MDRequestRef& mdr, int r, CInode *tracei, CDentry *tracedn) { reply_request(mdr, new MClientReply(mdr->client_request, r), tracei, tracedn); } -void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn) +void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn) { if (!g_conf->mds_early_reply) return; @@ -890,9 +890,9 @@ void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn) * include a trace to tracei * Clean up mdr */ -void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn) +void Server::reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn) { - assert(mdr); + assert(mdr.get()); MClientRequest *req = mdr->client_request; char buf[80]; @@ -964,8 +964,6 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, // clean up request mdcache->request_finish(mdr); - mdr = 0; - req = 0; // take a closer look at tracei, if it happens to be a remote link if (tracei && @@ -1011,7 +1009,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn, snapid_t snapid, int dentry_wanted, - MDRequest *mdr) + MDRequestRef& mdr) { // skip doing this for debugging purposes? if (g_conf->mds_inject_traceless_reply_probability && @@ -1176,8 +1174,7 @@ void Server::handle_client_request(MClientRequest *req) return; } -/* This function takes responsibility for the passed mdr*/ -void Server::dispatch_client_request(MDRequest *mdr) +void Server::dispatch_client_request(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; @@ -1404,8 +1401,8 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m) return; } - MDRequest *mdr = mdcache->request_get(m->get_reqid()); - if (!mdr) { + MDRequestRef mdr = mdcache->request_get(m->get_reqid()); + if (!mdr.get()) { dout(10) << "handle_slave_request_reply ignoring reply from unknown reqid " << m->get_reqid() << dendl; m->put(); return; @@ -1484,7 +1481,7 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m) } /* This function DOES put the mdr->slave_request before returning*/ -void Server::dispatch_slave_request(MDRequest *mdr) +void Server::dispatch_slave_request(MDRequestRef& mdr) { dout(7) << "dispatch_slave_request " << *mdr << " " << *mdr->slave_request << dendl; @@ -1607,7 +1604,7 @@ void Server::dispatch_slave_request(MDRequest *mdr) } /* This function DOES put the mdr->slave_request before returning*/ -void Server::handle_slave_auth_pin(MDRequest *mdr) +void Server::handle_slave_auth_pin(MDRequestRef& mdr) { dout(10) << "handle_slave_auth_pin " << *mdr << dendl; @@ -1736,7 +1733,7 @@ void Server::handle_slave_auth_pin(MDRequest *mdr) } /* This function DOES NOT put the passed ack before returning*/ -void Server::handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack) +void Server::handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack) { dout(10) << "handle_slave_auth_pin_ack on " << *mdr << " " << *ack << dendl; int from = ack->get_source().num(); @@ -1797,7 +1794,7 @@ void Server::handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack) * verify that the dir exists and would own the dname. * do not check if the dentry exists. */ -CDir *Server::validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname) +CDir *Server::validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname) { // make sure parent is a dir? if (!diri->is_dir()) { @@ -1827,7 +1824,7 @@ CDir *Server::validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dn * prepare a null (or existing) dentry in given dir. * wait for any dn lock. */ -CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist) +CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist) { dout(10) << "prepare_null_dentry " << dname << " in " << *dir << dendl; assert(dir->is_auth()); @@ -1870,7 +1867,7 @@ CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dn return dn; } -CDentry* Server::prepare_stray_dentry(MDRequest *mdr, CInode *in) +CDentry* Server::prepare_stray_dentry(MDRequestRef& mdr, CInode *in) { CDentry *straydn = mdr->straydn; if (straydn) { @@ -1893,7 +1890,7 @@ CDentry* Server::prepare_stray_dentry(MDRequest *mdr, CInode *in) * * create a new inode. set c/m/atime. hit dir pop. */ -CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode, +CInode* Server::prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode, ceph_file_layout *layout) { CInode *in = new CInode(mdcache); @@ -1988,7 +1985,7 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, u return in; } -void Server::journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob) +void Server::journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob) { dout(20) << "journal_allocated_inos sessionmapv " << mds->sessionmap.projected << " inotablev " << mds->inotable->get_projected_version() @@ -2001,7 +1998,7 @@ void Server::journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob) mds->inotable->get_projected_version()); } -void Server::apply_allocated_inos(MDRequest *mdr) +void Server::apply_allocated_inos(MDRequestRef& mdr) { Session *session = mdr->session; dout(10) << "apply_allocated_inos " << mdr->alloc_ino @@ -2027,7 +2024,7 @@ void Server::apply_allocated_inos(MDRequest *mdr) -CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector &trace, filepath refpath) +CDir *Server::traverse_to_auth_dir(MDRequestRef& mdr, vector &trace, filepath refpath) { // figure parent dir vs dname if (refpath.depth() == 0) { @@ -2060,23 +2057,20 @@ CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector &trace, file class C_MDS_TryFindInode : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; public: - C_MDS_TryFindInode(Server *s, MDRequest *r) : server(s), mdr(r) { - mdr->get(); - } + C_MDS_TryFindInode(Server *s, MDRequestRef& r) : server(s), mdr(r) {} virtual void finish(int r) { if (r == -ESTALE) // :( find_ino_peers failed server->reply_request(mdr, r); else server->dispatch_client_request(mdr); - mdr->put(); } }; /* If this returns null, the request has been handled * as appropriate: forwarded on, or the client's been replied to */ -CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n, +CInode* Server::rdlock_path_pin_ref(MDRequestRef& mdr, int n, set &rdlocks, bool want_auth, bool no_want_auth, /* for readdir, who doesn't want auth _even_if_ it's @@ -2172,7 +2166,7 @@ CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n, * create null dentry in place (or use existing if okexist). * get rdlocks on traversed dentries, xlock on new dentry. */ -CDentry* Server::rdlock_path_xlock_dentry(MDRequest *mdr, int n, +CDentry* Server::rdlock_path_xlock_dentry(MDRequestRef& mdr, int n, set& rdlocks, set& wrlocks, set& xlocks, bool okexist, bool mustexist, bool alwaysxlock, ceph_file_layout **layout) @@ -2276,7 +2270,7 @@ CDentry* Server::rdlock_path_xlock_dentry(MDRequest *mdr, int n, * @param mdr request * @returns the pointer, or NULL if it had to be delayed (but mdr is taken care of) */ -CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr) +CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr) { CDir *dir = diri->get_dirfrag(fg); @@ -2316,7 +2310,7 @@ CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr) // =============================================================================== // STAT -void Server::handle_client_getattr(MDRequest *mdr, bool is_lookup) +void Server::handle_client_getattr(MDRequestRef& mdr, bool is_lookup) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -2370,8 +2364,8 @@ void Server::handle_client_getattr(MDRequest *mdr, bool is_lookup) struct C_MDS_LookupIno2 : public Context { Server *server; - MDRequest *mdr; - C_MDS_LookupIno2(Server *s, MDRequest *r) : server(s), mdr(r) {} + MDRequestRef mdr; + C_MDS_LookupIno2(Server *s, MDRequestRef& r) : server(s), mdr(r) {} void finish(int r) { server->_lookup_ino_2(mdr, r); } @@ -2381,7 +2375,8 @@ struct C_MDS_LookupIno2 : public Context { /* * filepath: ino */ -void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry) +void Server::handle_client_lookup_ino(MDRequestRef& mdr, + bool want_parent, bool want_dentry) { MClientRequest *req = mdr->client_request; @@ -2432,10 +2427,10 @@ void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool wan } } -void Server::_lookup_ino_2(MDRequest *mdr, int r) +void Server::_lookup_ino_2(MDRequestRef& mdr, int r) { inodeno_t ino = mdr->client_request->get_filepath().get_ino(); - dout(10) << "_lookup_ino_2 " << mdr << " ino " << ino << " r=" << r << dendl; + dout(10) << "_lookup_ino_2 " << mdr.get() << " ino " << ino << " r=" << r << dendl; if (r >= 0) { if (r == mds->get_nodeid()) dispatch_client_request(mdr); @@ -2452,7 +2447,7 @@ void Server::_lookup_ino_2(MDRequest *mdr, int r) /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_open(MDRequest *mdr) +void Server::handle_client_open(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; @@ -2610,12 +2605,12 @@ void Server::handle_client_open(MDRequest *mdr) class C_MDS_openc_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CDentry *dn; CInode *newi; snapid_t follows; public: - C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) : + C_MDS_openc_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) : mds(m), mdr(r), dn(d), newi(ni), follows(f) {} void finish(int r) { assert(r == 0); @@ -2644,7 +2639,7 @@ public: }; /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_openc(MDRequest *mdr) +void Server::handle_client_openc(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; client_t client = mdr->get_client(); @@ -2803,7 +2798,7 @@ void Server::handle_client_openc(MDRequest *mdr) -void Server::handle_client_readdir(MDRequest *mdr) +void Server::handle_client_readdir(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; client_t client = req->get_source().num(); @@ -3031,11 +3026,11 @@ void Server::handle_client_readdir(MDRequest *mdr) */ class C_MDS_inode_update_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CInode *in; bool truncating_smaller, changed_ranges; public: - C_MDS_inode_update_finish(MDS *m, MDRequest *r, CInode *i, + C_MDS_inode_update_finish(MDS *m, MDRequestRef& r, CInode *i, bool sm=false, bool cr=false) : mds(m), mdr(r), in(i), truncating_smaller(sm), changed_ranges(cr) { } void finish(int r) { @@ -3060,7 +3055,7 @@ public: } }; -void Server::handle_client_file_setlock(MDRequest *mdr) +void Server::handle_client_file_setlock(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -3151,7 +3146,7 @@ void Server::handle_client_file_setlock(MDRequest *mdr) dout(10) << " state after lock change: " << *lock_state << dendl; } -void Server::handle_client_file_readlock(MDRequest *mdr) +void Server::handle_client_file_readlock(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -3205,7 +3200,7 @@ void Server::handle_client_file_readlock(MDRequest *mdr) reply_request(mdr, reply); } -void Server::handle_client_setattr(MDRequest *mdr) +void Server::handle_client_setattr(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -3311,7 +3306,7 @@ void Server::handle_client_setattr(MDRequest *mdr) } /* Takes responsibility for mdr */ -void Server::do_open_truncate(MDRequest *mdr, int cmode) +void Server::do_open_truncate(MDRequestRef& mdr, int cmode) { CInode *in = mdr->in[0]; client_t client = mdr->get_client(); @@ -3370,7 +3365,7 @@ void Server::do_open_truncate(MDRequest *mdr, int cmode) /* This function cleans up the passed mdr */ -void Server::handle_client_setlayout(MDRequest *mdr) +void Server::handle_client_setlayout(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -3449,7 +3444,7 @@ void Server::handle_client_setlayout(MDRequest *mdr) journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } -void Server::handle_client_setdirlayout(MDRequest *mdr) +void Server::handle_client_setdirlayout(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -3608,7 +3603,7 @@ int Server::parse_layout_vxattr(string name, string value, ceph_file_layout *lay return 0; } -void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur, +void Server::handle_set_vxattr(MDRequestRef& mdr, CInode *cur, ceph_file_layout *dir_layout, set rdlocks, set wrlocks, @@ -3719,7 +3714,7 @@ void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur, reply_request(mdr, -EINVAL); } -void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur, +void Server::handle_remove_vxattr(MDRequestRef& mdr, CInode *cur, set rdlocks, set wrlocks, set xlocks) @@ -3767,11 +3762,11 @@ void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur, class C_MDS_inode_xattr_update_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CInode *in; public: - C_MDS_inode_xattr_update_finish(MDS *m, MDRequest *r, CInode *i) : + C_MDS_inode_xattr_update_finish(MDS *m, MDRequestRef& r, CInode *i) : mds(m), mdr(r), in(i) { } void finish(int r) { assert(r == 0); @@ -3787,7 +3782,7 @@ public: } }; -void Server::handle_client_setxattr(MDRequest *mdr) +void Server::handle_client_setxattr(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; string name(req->get_path2()); @@ -3858,7 +3853,7 @@ void Server::handle_client_setxattr(MDRequest *mdr) journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur)); } -void Server::handle_client_removexattr(MDRequest *mdr) +void Server::handle_client_removexattr(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; string name(req->get_path2()); @@ -3925,12 +3920,12 @@ void Server::handle_client_removexattr(MDRequest *mdr) class C_MDS_mknod_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CDentry *dn; CInode *newi; snapid_t follows; public: - C_MDS_mknod_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) : + C_MDS_mknod_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) : mds(m), mdr(r), dn(d), newi(ni), follows(f) {} void finish(int r) { assert(r == 0); @@ -3972,7 +3967,7 @@ public: }; -void Server::handle_client_mknod(MDRequest *mdr) +void Server::handle_client_mknod(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; client_t client = mdr->get_client(); @@ -4066,7 +4061,7 @@ void Server::handle_client_mknod(MDRequest *mdr) // MKDIR /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_mkdir(MDRequest *mdr) +void Server::handle_client_mkdir(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -4144,7 +4139,7 @@ void Server::handle_client_mkdir(MDRequest *mdr) // SYMLINK -void Server::handle_client_symlink(MDRequest *mdr) +void Server::handle_client_symlink(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; set rdlocks, wrlocks, xlocks; @@ -4198,7 +4193,7 @@ void Server::handle_client_symlink(MDRequest *mdr) // LINK -void Server::handle_client_link(MDRequest *mdr) +void Server::handle_client_link(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; @@ -4271,13 +4266,13 @@ void Server::handle_client_link(MDRequest *mdr) class C_MDS_link_local_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CDentry *dn; CInode *targeti; version_t dnpv; version_t tipv; public: - C_MDS_link_local_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ti, + C_MDS_link_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ti, version_t dnpv_, version_t tipv_) : mds(m), mdr(r), dn(d), targeti(ti), dnpv(dnpv_), tipv(tipv_) { } @@ -4288,7 +4283,7 @@ public: }; -void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti) +void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) { dout(10) << "_link_local " << *dn << " to " << *targeti << dendl; @@ -4323,7 +4318,7 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti) journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_local_finish(mds, mdr, dn, targeti, dnpv, tipv)); } -void Server::_link_local_finish(MDRequest *mdr, CDentry *dn, CInode *targeti, +void Server::_link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti, version_t dnpv, version_t tipv) { dout(10) << "_link_local_finish " << *dn << " to " << *targeti << dendl; @@ -4353,13 +4348,13 @@ void Server::_link_local_finish(MDRequest *mdr, CDentry *dn, CInode *targeti, class C_MDS_link_remote_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; bool inc; CDentry *dn; CInode *targeti; version_t dpv; public: - C_MDS_link_remote_finish(MDS *m, MDRequest *r, bool i, CDentry *d, CInode *ti) : + C_MDS_link_remote_finish(MDS *m, MDRequestRef& r, bool i, CDentry *d, CInode *ti) : mds(m), mdr(r), inc(i), dn(d), targeti(ti), dpv(d->get_projected_version()) {} void finish(int r) { @@ -4368,7 +4363,7 @@ public: } }; -void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti) +void Server::_link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti) { dout(10) << "_link_remote " << (inc ? "link ":"unlink ") @@ -4433,7 +4428,7 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_remote_finish(mds, mdr, inc, dn, targeti)); } -void Server::_link_remote_finish(MDRequest *mdr, bool inc, +void Server::_link_remote_finish(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, version_t dpv) { @@ -4485,10 +4480,10 @@ void Server::_link_remote_finish(MDRequest *mdr, bool inc, class C_MDS_SlaveLinkPrep : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; CInode *targeti; public: - C_MDS_SlaveLinkPrep(Server *s, MDRequest *r, CInode *t) : + C_MDS_SlaveLinkPrep(Server *s, MDRequestRef& r, CInode *t) : server(s), mdr(r), targeti(t) { } void finish(int r) { assert(r == 0); @@ -4498,10 +4493,10 @@ public: class C_MDS_SlaveLinkCommit : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; CInode *targeti; public: - C_MDS_SlaveLinkCommit(Server *s, MDRequest *r, CInode *t) : + C_MDS_SlaveLinkCommit(Server *s, MDRequestRef& r, CInode *t) : server(s), mdr(r), targeti(t) { } void finish(int r) { server->_commit_slave_link(mdr, r, targeti); @@ -4509,7 +4504,7 @@ public: }; /* This function DOES put the mdr->slave_request before returning*/ -void Server::handle_slave_link_prep(MDRequest *mdr) +void Server::handle_slave_link_prep(MDRequestRef& mdr) { dout(10) << "handle_slave_link_prep " << *mdr << " on " << mdr->slave_request->get_object_info() @@ -4593,7 +4588,7 @@ void Server::handle_slave_link_prep(MDRequest *mdr) mdlog->flush(); } -void Server::_logged_slave_link(MDRequest *mdr, CInode *targeti) +void Server::_logged_slave_link(MDRequestRef& mdr, CInode *targeti) { dout(10) << "_logged_slave_link " << *mdr << " " << *targeti << dendl; @@ -4625,14 +4620,14 @@ void Server::_logged_slave_link(MDRequest *mdr, CInode *targeti) struct C_MDS_CommittedSlave : public Context { Server *server; - MDRequest *mdr; - C_MDS_CommittedSlave(Server *s, MDRequest *m) : server(s), mdr(m) {} + MDRequestRef mdr; + C_MDS_CommittedSlave(Server *s, MDRequestRef& m) : server(s), mdr(m) {} void finish(int r) { server->_committed_slave(mdr); } }; -void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti) +void Server::_commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti) { dout(10) << "_commit_slave_link " << *mdr << " r=" << r @@ -4654,7 +4649,7 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti) } } -void Server::_committed_slave(MDRequest *mdr) +void Server::_committed_slave(MDRequestRef& mdr) { dout(10) << "_committed_slave " << *mdr << dendl; @@ -4669,14 +4664,14 @@ void Server::_committed_slave(MDRequest *mdr) struct C_MDS_LoggedLinkRollback : public Context { Server *server; Mutation *mut; - MDRequest *mdr; - C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequest *r) : server(s), mut(m), mdr(r) {} + MDRequestRef mdr; + C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequestRef& r) : server(s), mut(m), mdr(r) {} void finish(int r) { server->_link_rollback_finish(mut, mdr); } }; -void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr) +void Server::do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr) { link_rollback rollback; bufferlist::iterator p = rbl.begin(); @@ -4736,7 +4731,7 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr) mdlog->flush(); } -void Server::_link_rollback_finish(Mutation *mut, MDRequest *mdr) +void Server::_link_rollback_finish(Mutation *mut, MDRequestRef& mdr) { dout(10) << "_link_rollback_finish" << dendl; @@ -4754,7 +4749,7 @@ void Server::_link_rollback_finish(Mutation *mut, MDRequest *mdr) /* This function DOES NOT put the passed message before returning*/ -void Server::handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m) +void Server::handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m) { dout(10) << "handle_slave_link_prep_ack " << *mdr << " " << *m << dendl; @@ -4784,7 +4779,7 @@ void Server::handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m) // UNLINK -void Server::handle_client_unlink(MDRequest *mdr) +void Server::handle_client_unlink(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; client_t client = mdr->get_client(); @@ -4962,12 +4957,12 @@ void Server::handle_client_unlink(MDRequest *mdr) class C_MDS_unlink_local_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CDentry *dn; CDentry *straydn; version_t dnpv; // deleted dentry public: - C_MDS_unlink_local_finish(MDS *m, MDRequest *r, CDentry *d, CDentry *sd) : + C_MDS_unlink_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CDentry *sd) : mds(m), mdr(r), dn(d), straydn(sd), dnpv(d->get_projected_version()) {} void finish(int r) { @@ -4976,7 +4971,7 @@ public: } }; -void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn) +void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn) { dout(10) << "_unlink_local " << *dn << dendl; @@ -5057,7 +5052,7 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn) journal_and_reply(mdr, 0, dn, le, new C_MDS_unlink_local_finish(mds, mdr, dn, straydn)); } -void Server::_unlink_local_finish(MDRequest *mdr, +void Server::_unlink_local_finish(MDRequestRef& mdr, CDentry *dn, CDentry *straydn, version_t dnpv) { @@ -5113,7 +5108,7 @@ void Server::_unlink_local_finish(MDRequest *mdr, dn->get_dir()->try_remove_unlinked_dn(dn); } -bool Server::_rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn) +bool Server::_rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn) { if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) { dout(10) << "_rmdir_prepare_witness mds." << who << " is not active" << dendl; @@ -5140,9 +5135,9 @@ bool Server::_rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentr struct C_MDS_SlaveRmdirPrep : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; CDentry *dn, *straydn; - C_MDS_SlaveRmdirPrep(Server *s, MDRequest *r, CDentry *d, CDentry *st) + C_MDS_SlaveRmdirPrep(Server *s, MDRequestRef& r, CDentry *d, CDentry *st) : server(s), mdr(r), dn(d), straydn(st) {} void finish(int r) { server->_logged_slave_rmdir(mdr, dn, straydn); @@ -5151,15 +5146,15 @@ struct C_MDS_SlaveRmdirPrep : public Context { struct C_MDS_SlaveRmdirCommit : public Context { Server *server; - MDRequest *mdr; - C_MDS_SlaveRmdirCommit(Server *s, MDRequest *r) + MDRequestRef mdr; + C_MDS_SlaveRmdirCommit(Server *s, MDRequestRef& r) : server(s), mdr(r) { } void finish(int r) { server->_commit_slave_rmdir(mdr, r); } }; -void Server::handle_slave_rmdir_prep(MDRequest *mdr) +void Server::handle_slave_rmdir_prep(MDRequestRef& mdr) { dout(10) << "handle_slave_rmdir_prep " << *mdr << " " << mdr->slave_request->srcdnpath @@ -5215,7 +5210,7 @@ void Server::handle_slave_rmdir_prep(MDRequest *mdr) mdlog->flush(); } -void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn) +void Server::_logged_slave_rmdir(MDRequestRef& mdr, CDentry *dn, CDentry *straydn) { dout(10) << "_logged_slave_rmdir " << *mdr << " on " << *dn << dendl; @@ -5242,7 +5237,7 @@ void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn) } } -void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack) +void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack) { dout(10) << "handle_slave_rmdir_prep_ack " << *mdr << " " << *ack << dendl; @@ -5262,7 +5257,7 @@ void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack) dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl; } -void Server::_commit_slave_rmdir(MDRequest *mdr, int r) +void Server::_commit_slave_rmdir(MDRequestRef& mdr, int r) { dout(10) << "_commit_slave_rmdir " << *mdr << " r=" << r << dendl; @@ -5283,18 +5278,18 @@ void Server::_commit_slave_rmdir(MDRequest *mdr, int r) struct C_MDS_LoggedRmdirRollback : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; metareqid_t reqid; CDentry *dn; CDentry *straydn; - C_MDS_LoggedRmdirRollback(Server *s, MDRequest *m, metareqid_t mr, CDentry *d, CDentry *st) + C_MDS_LoggedRmdirRollback(Server *s, MDRequestRef& m, metareqid_t mr, CDentry *d, CDentry *st) : server(s), mdr(m), reqid(mr), dn(d), straydn(st) {} void finish(int r) { server->_rmdir_rollback_finish(mdr, reqid, dn, straydn); } }; -void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr) +void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr) { // unlink the other rollback methods, the rmdir rollback is only // needed to record the subtree changes in the journal for inode @@ -5343,7 +5338,7 @@ void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr) mdlog->flush(); } -void Server::_rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn) +void Server::_rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn) { dout(10) << "_rmdir_rollback_finish " << reqid << dendl; @@ -5372,7 +5367,7 @@ void Server::_rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry * * the unlocked varient this is a fastpath check. we can't really be * sure until we rdlock the filelock. */ -bool Server::_dir_is_nonempty_unlocked(MDRequest *mdr, CInode *in) +bool Server::_dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *in) { dout(10) << "dir_is_nonempty_unlocked " << *in << dendl; assert(in->is_auth()); @@ -5397,7 +5392,7 @@ bool Server::_dir_is_nonempty_unlocked(MDRequest *mdr, CInode *in) return false; } -bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in) +bool Server::_dir_is_nonempty(MDRequestRef& mdr, CInode *in) { dout(10) << "dir_is_nonempty " << *in << dendl; assert(in->is_auth()); @@ -5432,12 +5427,12 @@ bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in) class C_MDS_rename_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CDentry *srcdn; CDentry *destdn; CDentry *straydn; public: - C_MDS_rename_finish(MDS *m, MDRequest *r, + C_MDS_rename_finish(MDS *m, MDRequestRef& r, CDentry *sdn, CDentry *ddn, CDentry *stdn) : mds(m), mdr(r), srcdn(sdn), destdn(ddn), straydn(stdn) { } @@ -5462,7 +5457,7 @@ public: * * This function takes responsibility for the passed mdr. */ -void Server::handle_client_rename(MDRequest *mdr) +void Server::handle_client_rename(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; dout(7) << "handle_client_rename " << *req << dendl; @@ -5895,7 +5890,7 @@ void Server::handle_client_rename(MDRequest *mdr) } -void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn) +void Server::_rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { dout(10) << "_rename_finish " << *mdr << dendl; @@ -5946,7 +5941,7 @@ void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDe // helpers -bool Server::_rename_prepare_witness(MDRequest *mdr, int who, set &witnesse, +bool Server::_rename_prepare_witness(MDRequestRef& mdr, int who, set &witnesse, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) { @@ -5976,7 +5971,7 @@ bool Server::_rename_prepare_witness(MDRequest *mdr, int who, set &witnesse return true; } -version_t Server::_rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl) +version_t Server::_rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl) { version_t oldpv = mdr->more()->inode_import_v; @@ -6046,7 +6041,7 @@ bool Server::_need_force_journal(CInode *diri, bool empty) return force_journal; } -void Server::_rename_prepare(MDRequest *mdr, +void Server::_rename_prepare(MDRequestRef& mdr, EMetaBlob *metablob, bufferlist *client_map_bl, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { @@ -6332,7 +6327,7 @@ void Server::_rename_prepare(MDRequest *mdr, } -void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn) +void Server::_rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { dout(10) << "_rename_apply " << *mdr << " " << *srcdn << " " << *destdn << dendl; dout(10) << " pvs " << mdr->more()->pvmap << dendl; @@ -6477,10 +6472,10 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen class C_MDS_SlaveRenamePrep : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; CDentry *srcdn, *destdn, *straydn; public: - C_MDS_SlaveRenamePrep(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) : + C_MDS_SlaveRenamePrep(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) : server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {} void finish(int r) { server->_logged_slave_rename(mdr, srcdn, destdn, straydn); @@ -6489,10 +6484,10 @@ public: class C_MDS_SlaveRenameCommit : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; CDentry *srcdn, *destdn, *straydn; public: - C_MDS_SlaveRenameCommit(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) : + C_MDS_SlaveRenameCommit(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) : server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {} void finish(int r) { server->_commit_slave_rename(mdr, r, srcdn, destdn, straydn); @@ -6501,20 +6496,17 @@ public: class C_MDS_SlaveRenameSessionsFlushed : public Context { Server *server; - MDRequest *mdr; + MDRequestRef mdr; public: - C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequest *r) : - server(s), mdr(r) { - mdr->get(); - } + C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequestRef& r) : + server(s), mdr(r) {} void finish(int r) { server->_slave_rename_sessions_flushed(mdr); - mdr->put(); } }; /* This function DOES put the mdr->slave_request before returning*/ -void Server::handle_slave_rename_prep(MDRequest *mdr) +void Server::handle_slave_rename_prep(MDRequestRef& mdr) { dout(10) << "handle_slave_rename_prep " << *mdr << " " << mdr->slave_request->srcdnpath @@ -6708,7 +6700,7 @@ void Server::handle_slave_rename_prep(MDRequest *mdr) mdlog->flush(); } -void Server::_logged_slave_rename(MDRequest *mdr, +void Server::_logged_slave_rename(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { dout(10) << "_logged_slave_rename " << *mdr << dendl; @@ -6780,7 +6772,7 @@ void Server::_logged_slave_rename(MDRequest *mdr, } } -void Server::_commit_slave_rename(MDRequest *mdr, int r, +void Server::_commit_slave_rename(MDRequestRef& mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn) { dout(10) << "_commit_slave_rename " << *mdr << " r=" << r << dendl; @@ -6905,13 +6897,13 @@ void _rollback_repair_dir(Mutation *mut, CDir *dir, rename_rollback::drec &r, ut struct C_MDS_LoggedRenameRollback : public Context { Server *server; Mutation *mut; - MDRequest *mdr; + MDRequestRef mdr; CDentry *srcdn; version_t srcdnpv; CDentry *destdn; CDentry *straydn; bool finish_mdr; - C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequest *r, + C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequestRef& r, CDentry *sd, version_t pv, CDentry *dd, CDentry *st, bool f) : server(s), mut(m), mdr(r), srcdn(sd), srcdnpv(pv), destdn(dd), @@ -6922,7 +6914,7 @@ struct C_MDS_LoggedRenameRollback : public Context { } }; -void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr, +void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr, bool finish_mdr) { rename_rollback rollback; @@ -7138,7 +7130,7 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr, mdlog->flush(); } -void Server::_rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn, +void Server::_rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn, version_t srcdnpv, CDentry *destdn, CDentry *straydn, bool finish_mdr) { @@ -7209,7 +7201,7 @@ void Server::_rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *src } /* This function DOES put the passed message before returning*/ -void Server::handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack) +void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack) { dout(10) << "handle_slave_rename_prep_ack " << *mdr << " witnessed by " << ack->get_source() @@ -7246,7 +7238,7 @@ void Server::handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack) dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl; } -void Server::handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *ack) +void Server::handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack) { dout(10) << "handle_slave_rename_notify_ack " << *mdr << " from mds." << ack->get_source() << dendl; @@ -7265,7 +7257,7 @@ void Server::handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *ac } } -void Server::_slave_rename_sessions_flushed(MDRequest *mdr) +void Server::_slave_rename_sessions_flushed(MDRequestRef& mdr) { dout(10) << "_slave_rename_sessions_flushed " << *mdr << dendl; @@ -7283,7 +7275,7 @@ void Server::_slave_rename_sessions_flushed(MDRequest *mdr) // snaps /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_lssnap(MDRequest *mdr) +void Server::handle_client_lssnap(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; @@ -7348,10 +7340,10 @@ void Server::handle_client_lssnap(MDRequest *mdr) struct C_MDS_mksnap_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CInode *diri; SnapInfo info; - C_MDS_mksnap_finish(MDS *m, MDRequest *r, CInode *di, SnapInfo &i) : + C_MDS_mksnap_finish(MDS *m, MDRequestRef& r, CInode *di, SnapInfo &i) : mds(m), mdr(r), diri(di), info(i) {} void finish(int r) { mds->server->_mksnap_finish(mdr, diri, info); @@ -7359,7 +7351,7 @@ struct C_MDS_mksnap_finish : public Context { }; /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_mksnap(MDRequest *mdr) +void Server::handle_client_mksnap(MDRequestRef& mdr) { if (!mds->mdsmap->allows_snaps()) { // you can't make snapshots until you set an option right now @@ -7474,7 +7466,7 @@ void Server::handle_client_mksnap(MDRequest *mdr) mdlog->flush(); } -void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) +void Server::_mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info) { dout(10) << "_mksnap_finish " << *mdr << " " << info << dendl; @@ -7503,10 +7495,10 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) struct C_MDS_rmsnap_finish : public Context { MDS *mds; - MDRequest *mdr; + MDRequestRef mdr; CInode *diri; snapid_t snapid; - C_MDS_rmsnap_finish(MDS *m, MDRequest *r, CInode *di, snapid_t sn) : + C_MDS_rmsnap_finish(MDS *m, MDRequestRef& r, CInode *di, snapid_t sn) : mds(m), mdr(r), diri(di), snapid(sn) {} void finish(int r) { mds->server->_rmsnap_finish(mdr, diri, snapid); @@ -7514,7 +7506,7 @@ struct C_MDS_rmsnap_finish : public Context { }; /* This function takes responsibility for the passed mdr*/ -void Server::handle_client_rmsnap(MDRequest *mdr) +void Server::handle_client_rmsnap(MDRequestRef& mdr) { MClientRequest *req = mdr->client_request; @@ -7592,7 +7584,7 @@ void Server::handle_client_rmsnap(MDRequest *mdr) mdlog->flush(); } -void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid) +void Server::_rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid) { dout(10) << "_rmsnap_finish " << *mdr << " " << snapid << dendl; snapid_t stid = mdr->more()->stid; diff --git a/src/mds/Server.h b/src/mds/Server.h index 6ae9f5956757f..f4bdc582fecfa 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -19,13 +19,16 @@ class PerfCounters; class LogEvent; -struct MDRequest; -struct Mutation; class EMetaBlob; class EUpdate; class MMDSSlaveRequest; struct SnapInfo; +struct MutationImpl; +struct MDRequestImpl; +typedef ceph::shared_ptr MutationRef; +typedef ceph::shared_ptr MDRequestRef; + enum { l_mdss_first = 1000, l_mdss_hcreq, @@ -98,16 +101,16 @@ public: // -- requests -- void handle_client_request(MClientRequest *m); - void journal_and_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn, + void journal_and_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn, LogEvent *le, Context *fin); - void dispatch_client_request(MDRequest *mdr); - void early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn); - void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0); - void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0); + void dispatch_client_request(MDRequestRef& mdr); + void early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn); + void reply_request(MDRequestRef& mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0); + void reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0); void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn, snapid_t snapid, int num_dentries_wanted, - MDRequest *mdr); + MDRequestRef& mdr); void encode_empty_dirstat(bufferlist& bl); void encode_infinite_lease(bufferlist& bl); @@ -115,136 +118,140 @@ public: void handle_slave_request(MMDSSlaveRequest *m); void handle_slave_request_reply(MMDSSlaveRequest *m); - void dispatch_slave_request(MDRequest *mdr); - void handle_slave_auth_pin(MDRequest *mdr); - void handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack); + void dispatch_slave_request(MDRequestRef& mdr); + void handle_slave_auth_pin(MDRequestRef& mdr); + void handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack); // some helpers - CDir *validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname); - CDir *traverse_to_auth_dir(MDRequest *mdr, vector &trace, filepath refpath); - CDentry *prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist=false); - CDentry *prepare_stray_dentry(MDRequest *mdr, CInode *in); - CInode* prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode, + CDir *validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname); + CDir *traverse_to_auth_dir(MDRequestRef& mdr, vector &trace, filepath refpath); + CDentry *prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist=false); + CDentry *prepare_stray_dentry(MDRequestRef& mdr, CInode *in); + CInode* prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode, ceph_file_layout *layout=NULL); - void journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob); - void apply_allocated_inos(MDRequest *mdr); + void journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob); + void apply_allocated_inos(MDRequestRef& mdr); - CInode* rdlock_path_pin_ref(MDRequest *mdr, int n, set& rdlocks, bool want_auth, + CInode* rdlock_path_pin_ref(MDRequestRef& mdr, int n, set& rdlocks, bool want_auth, bool no_want_auth=false, ceph_file_layout **layout=NULL, bool no_lookup=false); - CDentry* rdlock_path_xlock_dentry(MDRequest *mdr, int n, set& rdlocks, set& wrlocks, - set& xlocks, bool okexist, bool mustexist, bool alwaysxlock, + CDentry* rdlock_path_xlock_dentry(MDRequestRef& mdr, int n, + set& rdlocks, + set& wrlocks, + set& xlocks, bool okexist, + bool mustexist, bool alwaysxlock, ceph_file_layout **layout=NULL); - CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr); + CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr); // requests on existing inodes. - void handle_client_getattr(MDRequest *mdr, bool is_lookup); - void handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry); - void _lookup_ino_2(MDRequest *mdr, int r); - void handle_client_readdir(MDRequest *mdr); - void handle_client_file_setlock(MDRequest *mdr); - void handle_client_file_readlock(MDRequest *mdr); - - void handle_client_setattr(MDRequest *mdr); - void handle_client_setlayout(MDRequest *mdr); - void handle_client_setdirlayout(MDRequest *mdr); + void handle_client_getattr(MDRequestRef& mdr, bool is_lookup); + void handle_client_lookup_ino(MDRequestRef& mdr, + bool want_parent, bool want_dentry); + void _lookup_ino_2(MDRequestRef& mdr, int r); + void handle_client_readdir(MDRequestRef& mdr); + void handle_client_file_setlock(MDRequestRef& mdr); + void handle_client_file_readlock(MDRequestRef& mdr); + + void handle_client_setattr(MDRequestRef& mdr); + void handle_client_setlayout(MDRequestRef& mdr); + void handle_client_setdirlayout(MDRequestRef& mdr); int parse_layout_vxattr(string name, string value, ceph_file_layout *layout); - void handle_set_vxattr(MDRequest *mdr, CInode *cur, + void handle_set_vxattr(MDRequestRef& mdr, CInode *cur, ceph_file_layout *dir_layout, set rdlocks, set wrlocks, set xlocks); - void handle_remove_vxattr(MDRequest *mdr, CInode *cur, + void handle_remove_vxattr(MDRequestRef& mdr, CInode *cur, set rdlocks, set wrlocks, set xlocks); - void handle_client_setxattr(MDRequest *mdr); - void handle_client_removexattr(MDRequest *mdr); + void handle_client_setxattr(MDRequestRef& mdr); + void handle_client_removexattr(MDRequestRef& mdr); - void handle_client_fsync(MDRequest *mdr); + void handle_client_fsync(MDRequestRef& mdr); // open - void handle_client_open(MDRequest *mdr); - void handle_client_openc(MDRequest *mdr); // O_CREAT variant. - void do_open_truncate(MDRequest *mdr, int cmode); // O_TRUNC variant. + void handle_client_open(MDRequestRef& mdr); + void handle_client_openc(MDRequestRef& mdr); // O_CREAT variant. + void do_open_truncate(MDRequestRef& mdr, int cmode); // O_TRUNC variant. // namespace changes - void handle_client_mknod(MDRequest *mdr); - void handle_client_mkdir(MDRequest *mdr); - void handle_client_symlink(MDRequest *mdr); + void handle_client_mknod(MDRequestRef& mdr); + void handle_client_mkdir(MDRequestRef& mdr); + void handle_client_symlink(MDRequestRef& mdr); // link - void handle_client_link(MDRequest *mdr); - void _link_local(MDRequest *mdr, CDentry *dn, CInode *targeti); - void _link_local_finish(MDRequest *mdr, + void handle_client_link(MDRequestRef& mdr); + void _link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti); + void _link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti, version_t, version_t); - void _link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti); - void _link_remote_finish(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti, + void _link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti); + void _link_remote_finish(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, version_t); - void handle_slave_link_prep(MDRequest *mdr); - void _logged_slave_link(MDRequest *mdr, CInode *targeti); - void _commit_slave_link(MDRequest *mdr, int r, CInode *targeti); - void _committed_slave(MDRequest *mdr); // use for rename, too - void handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m); - void do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr); - void _link_rollback_finish(Mutation *mut, MDRequest *mdr); + void handle_slave_link_prep(MDRequestRef& mdr); + void _logged_slave_link(MDRequestRef& mdr, CInode *targeti); + void _commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti); + void _committed_slave(MDRequestRef& mdr); // use for rename, too + void handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m); + void do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr); + void _link_rollback_finish(Mutation *mut, MDRequestRef& mdr); // unlink - void handle_client_unlink(MDRequest *mdr); - bool _dir_is_nonempty_unlocked(MDRequest *mdr, CInode *rmdiri); - bool _dir_is_nonempty(MDRequest *mdr, CInode *rmdiri); - void _unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn); - void _unlink_local_finish(MDRequest *mdr, + void handle_client_unlink(MDRequestRef& mdr); + bool _dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *rmdiri); + bool _dir_is_nonempty(MDRequestRef& mdr, CInode *rmdiri); + void _unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn); + void _unlink_local_finish(MDRequestRef& mdr, CDentry *dn, CDentry *straydn, version_t); - bool _rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn); - void handle_slave_rmdir_prep(MDRequest *mdr); - void _logged_slave_rmdir(MDRequest *mdr, CDentry *srcdn, CDentry *straydn); - void _commit_slave_rmdir(MDRequest *mdr, int r); - void handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack); - void do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr); - void _rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn); + bool _rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn); + void handle_slave_rmdir_prep(MDRequestRef& mdr); + void _logged_slave_rmdir(MDRequestRef& mdr, CDentry *srcdn, CDentry *straydn); + void _commit_slave_rmdir(MDRequestRef& mdr, int r); + void handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack); + void do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr); + void _rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn); // rename - void handle_client_rename(MDRequest *mdr); - void _rename_finish(MDRequest *mdr, + void handle_client_rename(MDRequestRef& mdr); + void _rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); - void handle_client_lssnap(MDRequest *mdr); - void handle_client_mksnap(MDRequest *mdr); - void _mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info); - void handle_client_rmsnap(MDRequest *mdr); - void _rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid); + void handle_client_lssnap(MDRequestRef& mdr); + void handle_client_mksnap(MDRequestRef& mdr); + void _mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info); + void handle_client_rmsnap(MDRequestRef& mdr); + void _rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid); // helpers - bool _rename_prepare_witness(MDRequest *mdr, int who, set &witnesse, + bool _rename_prepare_witness(MDRequestRef& mdr, int who, set &witnesse, CDentry *srcdn, CDentry *destdn, CDentry *straydn); - version_t _rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl); + version_t _rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl); bool _need_force_journal(CInode *diri, bool empty); - void _rename_prepare(MDRequest *mdr, + void _rename_prepare(MDRequestRef& mdr, EMetaBlob *metablob, bufferlist *client_map_bl, CDentry *srcdn, CDentry *destdn, CDentry *straydn); /* set not_journaling=true if you're going to discard the results -- * this bypasses the asserts to make sure we're journaling the right * things on the right nodes */ - void _rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); + void _rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); // slaving - void handle_slave_rename_prep(MDRequest *mdr); - void handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m); - void handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *m); - void _slave_rename_sessions_flushed(MDRequest *mdr); - void _logged_slave_rename(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); - void _commit_slave_rename(MDRequest *mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn); - void do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr, bool finish_mdr=false); - void _rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn, version_t srcdnpv, + void handle_slave_rename_prep(MDRequestRef& mdr); + void handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m); + void handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *m); + void _slave_rename_sessions_flushed(MDRequestRef& mdr); + void _logged_slave_rename(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); + void _commit_slave_rename(MDRequestRef& mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn); + void do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr, bool finish_mdr=false); + void _rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn, version_t srcdnpv, CDentry *destdn, CDentry *staydn, bool finish_mdr); }; -- 2.39.5