From: Greg Farnum Date: Mon, 10 Mar 2014 23:07:00 +0000 (-0700) Subject: MDCache: use MDRequestRef instead of MDRequest* X-Git-Tag: v0.80-rc1~84^2~17 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5872c2d873dca8bc4eb2974ba9b8be02ceeb28b5;p=ceph.git MDCache: use MDRequestRef instead of MDRequest* Signed-off-by: Greg Farnum --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index bc2985def98f..1a34c4bb8ac7 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2491,7 +2491,7 @@ void MDCache::send_slave_resolves() } else { set resolve_set; mds->mdsmap->get_mds_set(resolve_set, MDSMap::STATE_RESOLVE); - for (ceph::unordered_map::iterator p = active_requests.begin(); + for (ceph::unordered_map >::iterator p = active_requests.begin(); p != active_requests.end(); ++p) { if (!p->second->is_slave() || !p->second->slave_did_prepare()) @@ -2644,8 +2644,8 @@ void MDCache::handle_mds_failure(int who) migrator->handle_mds_failure_or_stop(who); // clean up any requests slave to/from this node - list finish; - for (ceph::unordered_map::iterator p = active_requests.begin(); + list finish; + for (ceph::unordered_map >::iterator p = active_requests.begin(); p != active_requests.end(); ++p) { // slave to the failed node? @@ -2666,7 +2666,7 @@ void MDCache::handle_mds_failure(int who) if (p->second->slave_request) p->second->aborted = true; else - finish.push_back(p->second); + finish.push_back(p->second.lock()); } } @@ -3088,7 +3088,7 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack) finish_uncommitted_slave_update(p->first, from); } else { - MDRequest *mdr = request_get(p->first); + MDRequestRef mdr = request_get(p->first); // information about master imported caps if (p->second.length() > 0) mdr->more()->inode_import.claim(p->second); @@ -3123,7 +3123,7 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack) assert(0); } } else { - MDRequest *mdr = request_get(*p); + MDRequestRef mdr = request_get(*p); mdr->aborted = true; if (mdr->slave_request) { if (mdr->more()->slave_commit) // journaling slave prepare ? @@ -3694,7 +3694,7 @@ void MDCache::rejoin_send_rejoins() if (!mds->is_rejoin()) { // i am survivor. send strong rejoin. // note request remote_auth_pins, xlocks - for (ceph::unordered_map::iterator p = active_requests.begin(); + for (ceph::unordered_map >::iterator p = active_requests.begin(); p != active_requests.end(); ++p) { if ( p->second->is_slave()) @@ -4488,7 +4488,7 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong) strong->xlocked_dentries[p->first].count(q->first)) { MMDSCacheRejoin::slave_reqid r = strong->xlocked_dentries[p->first][q->first]; dout(10) << " dn xlock by " << r << " on " << *dn << dendl; - MDRequest *mdr = request_get(r.reqid); // should have this from auth_pin above. + MDRequestRef mdr = request_get(r.reqid); // should have this from auth_pin above. assert(mdr->is_auth_pinned(dn)); if (!mdr->xlocks.count(&dn->versionlock)) { assert(dn->versionlock.can_xlock_local()); @@ -4590,7 +4590,7 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong) ++q) { SimpleLock *lock = in->get_lock(q->first); dout(10) << " inode xlock by " << q->second << " on " << *lock << " on " << *in << dendl; - MDRequest *mdr = request_get(q->second.reqid); // should have this from auth_pin above. + MDRequestRef mdr = request_get(q->second.reqid); // should have this from auth_pin above. assert(mdr->is_auth_pinned(in)); if (!mdr->xlocks.count(&in->versionlock)) { assert(in->versionlock.can_xlock_local()); @@ -4622,7 +4622,7 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong) r != q->second.end(); ++r) { dout(10) << " inode wrlock by " << *r << " on " << *lock << " on " << *in << dendl; - MDRequest *mdr = request_get(r->reqid); // should have this from auth_pin above. + MDRequestRef mdr = request_get(r->reqid); // should have this from auth_pin above. if (in->is_auth()) assert(mdr->is_auth_pinned(in)); lock->set_state(LOCK_MIX); @@ -7509,7 +7509,7 @@ void MDCache::dispatch(Message *m) } } -Context *MDCache::_get_waiter(MDRequest *mdr, Message *req, Context *fin) +Context *MDCache::_get_waiter(MDRequestRef& mdr, Message *req, Context *fin) { if (mdr) { dout(20) << "_get_waiter retryrequest" << dendl; @@ -7522,7 +7522,7 @@ Context *MDCache::_get_waiter(MDRequest *mdr, Message *req, Context *fin) } } -int MDCache::path_traverse(MDRequest *mdr, Message *req, Context *fin, // who +int MDCache::path_traverse(MDRequestRef& mdr, Message *req, Context *fin, // who const filepath& path, // what vector *pdnvec, // result CInode **pin, @@ -7969,7 +7969,7 @@ void MDCache::open_remote_dirfrag(CInode *diri, frag_t approxfg, Context *fin) * will return inode for primary, or link up/open up remote link's inode as necessary. * If it's not available right now, puts mdr on wait list and returns null. */ -CInode *MDCache::get_dentry_inode(CDentry *dn, MDRequest *mdr, bool projected) +CInode *MDCache::get_dentry_inode(CDentry *dn, MDRequestRef& mdr, bool projected) { CDentry::linkage_t *dnl; if (projected) @@ -8828,7 +8828,7 @@ void MDCache::kick_find_ino_peers(int who) int MDCache::get_num_client_requests() { int count = 0; - for (ceph::unordered_map::iterator p = active_requests.begin(); + for (ceph::unordered_map >::iterator p = active_requests.begin(); p != active_requests.end(); ++p) { if (p->second->reqid.name.is_client() && !p->second->is_slave()) @@ -8910,7 +8910,7 @@ void MDCache::request_finish(MDRequestRef mdr) } -void MDCache::request_forward(MDRequest *mdr, int who, int port) +void MDCache::request_forward(MDRequestRef& mdr, int who, int port) { if (mdr->client_request->get_source().is_client()) { dout(7) << "request_forward " << *mdr << " to mds." << who << " req " @@ -8926,7 +8926,7 @@ void MDCache::request_forward(MDRequest *mdr, int who, int port) } -void MDCache::dispatch_request(MDRequest *mdr) +void MDCache::dispatch_request(MDRequestRef& mdr) { if (mdr->killed) { dout(10) << "request " << *mdr << " was killed" << dendl; @@ -8951,7 +8951,7 @@ void MDCache::dispatch_request(MDRequest *mdr) } -void MDCache::request_drop_foreign_locks(MDRequest *mdr) +void MDCache::request_drop_foreign_locks(MDRequestRef& mdr) { if (!mdr->has_more()) return; @@ -9003,19 +9003,19 @@ void MDCache::request_drop_foreign_locks(MDRequest *mdr) * this function can get called more than once */ } -void MDCache::request_drop_non_rdlocks(MDRequest *mdr) +void MDCache::request_drop_non_rdlocks(MDRequestRef& mdr) { request_drop_foreign_locks(mdr); mds->locker->drop_non_rdlocks(mdr); } -void MDCache::request_drop_locks(MDRequest *mdr) +void MDCache::request_drop_locks(MDRequestRef& mdr) { request_drop_foreign_locks(mdr); mds->locker->drop_locks(mdr); } -void MDCache::request_cleanup(MDRequest *mdr) +void MDCache::request_cleanup(MDRequestRef& mdr) { dout(15) << "request_cleanup " << *mdr << dendl; @@ -9060,7 +9060,7 @@ void MDCache::request_cleanup(MDRequest *mdr) log_stat(); } -void MDCache::request_kill(MDRequest *mdr) +void MDCache::request_kill(MDRequestRef& mdr) { mdr->killed = true; if (!mdr->committing) { @@ -9087,7 +9087,7 @@ public: } }; -void MDCache::anchor_create_prep_locks(MDRequest *mdr, CInode *in, +void MDCache::anchor_create_prep_locks(MDRequestRef& mdr, CInode *in, set& rdlocks, set& xlocks) { dout(10) << "anchor_create_prep_locks " << *in << dendl; @@ -9108,7 +9108,7 @@ void MDCache::anchor_create_prep_locks(MDRequest *mdr, CInode *in, } } -void MDCache::anchor_create(MDRequest *mdr, CInode *in, Context *onfinish) +void MDCache::anchor_create(MDRequestRef& mdr, CInode *in, Context *onfinish) { assert(in->is_auth()); dout(10) << "anchor_create " << *in << dendl; @@ -9266,17 +9266,17 @@ void MDCache::_anchor_logged(CInode *in, version_t atid, Mutation *mut) struct C_MDC_snaprealm_create_finish : public Context { MDCache *cache; - MDRequest *mdr; + MDRequestRef mdr; Mutation *mut; CInode *in; - C_MDC_snaprealm_create_finish(MDCache *c, MDRequest *m, Mutation *mu, CInode *i) : + C_MDC_snaprealm_create_finish(MDCache *c, MDRequestRef& m, Mutation *mu, CInode *i) : cache(c), mdr(m), mut(mu), in(i) {} void finish(int r) { cache->_snaprealm_create_finish(mdr, mut, in); } }; -void MDCache::snaprealm_create(MDRequest *mdr, CInode *in) +void MDCache::snaprealm_create(MDRequestRef& mdr, CInode *in) { dout(10) << "snaprealm_create " << *in << dendl; assert(!in->snaprealm); @@ -9379,7 +9379,7 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop, bool send_snaps(updates); } -void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in) +void MDCache::_snaprealm_create_finish(MDRequestRef& mdr, Mutation *mut, CInode *in) { dout(10) << "_snaprealm_create_finish " << *in << dendl; @@ -10879,7 +10879,7 @@ void MDCache::handle_dentry_link(MDentryLink *m) // UNLINK -void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequest *mdr) +void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr) { dout(10) << "send_dentry_unlink " << *dn << dendl; // share unlink news with replicas @@ -11459,9 +11459,9 @@ void MDCache::find_stale_fragment_freeze() class C_MDC_FragmentPrep : public Context { MDCache *mdcache; - MDRequest *mdr; + MDRequestRef mdr; public: - C_MDC_FragmentPrep(MDCache *m, MDRequest *r) : mdcache(m), mdr(r) {} + C_MDC_FragmentPrep(MDCache *m, MDRequestRef& r) : mdcache(m), mdr(r) {} virtual void finish(int r) { mdcache->_fragment_logged(mdr); } @@ -11469,9 +11469,9 @@ public: class C_MDC_FragmentStore : public Context { MDCache *mdcache; - MDRequest *mdr; + MDRequestRef mdr; public: - C_MDC_FragmentStore(MDCache *m, MDRequest *r) : mdcache(m), mdr(r) {} + C_MDC_FragmentStore(MDCache *m, MDRequestRef& r) : mdcache(m), mdr(r) {} virtual void finish(int r) { mdcache->_fragment_stored(mdr); } @@ -11525,7 +11525,7 @@ void MDCache::fragment_frozen(dirfrag_t basedirfrag, int r) dispatch_fragment_dir(mdr); } -void MDCache::dispatch_fragment_dir(MDRequest *mdr) +void MDCache::dispatch_fragment_dir(MDRequestRef& mdr) { dirfrag_t basedirfrag = mdr->more()->fragment_base; map::iterator it = fragments.find(basedirfrag); @@ -11622,7 +11622,7 @@ void MDCache::dispatch_fragment_dir(MDRequest *mdr) mds->mdlog->flush(); } -void MDCache::_fragment_logged(MDRequest *mdr) +void MDCache::_fragment_logged(MDRequestRef& mdr) { dirfrag_t basedirfrag = mdr->more()->fragment_base; map::iterator it = fragments.find(basedirfrag); @@ -11656,7 +11656,7 @@ void MDCache::_fragment_logged(MDRequest *mdr) gather.activate(); } -void MDCache::_fragment_stored(MDRequest *mdr) +void MDCache::_fragment_stored(MDRequestRef& mdr) { dirfrag_t basedirfrag = mdr->more()->fragment_base; map::iterator it = fragments.find(basedirfrag); @@ -12201,15 +12201,12 @@ void MDCache::dump_cache(const char *fn) -C_MDS_RetryRequest::C_MDS_RetryRequest(MDCache *c, MDRequest *r) +C_MDS_RetryRequest::C_MDS_RetryRequest(MDCache *c, MDRequestRef& r) : cache(c), mdr(r) -{ - mdr->get(); -} +{} void C_MDS_RetryRequest::finish(int r) { mdr->retry++; cache->dispatch_request(mdr); - mdr->put(); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 0a7f0dbe3f73..a82be6a44750 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -68,6 +68,7 @@ class ESubtreeMap; struct Mutation; struct MDRequestImpl; +typedef ceph::shared_ptr MDRequestRef; struct MDSlaveUpdate; @@ -251,17 +252,17 @@ public: bool have_request(metareqid_t rid) { return active_requests.count(rid); } - MDRequest* request_get(metareqid_t rid); - void request_pin_ref(MDRequest *r, CInode *ref, vector& trace); - void request_finish(MDRequest *mdr); - void request_forward(MDRequest *mdr, int mds, int port=0); - void dispatch_request(MDRequest *mdr); - void request_drop_foreign_locks(MDRequest *mdr); - void request_drop_non_rdlocks(MDRequest *r); - void request_drop_locks(MDRequest *r); - void request_cleanup(MDRequest *r); + MDRequestRef request_get(metareqid_t rid); + void request_pin_ref(MDRequestRef& r, CInode *ref, vector& trace); + void request_finish(MDRequestRef& mdr); + void request_forward(MDRequestRef& mdr, int mds, int port=0); + void dispatch_request(MDRequestRef& mdr); + void request_drop_foreign_locks(MDRequestRef& mdr); + void request_drop_non_rdlocks(MDRequestRef& r); + void request_drop_locks(MDRequestRef& r); + void request_cleanup(MDRequestRef& r); - void request_kill(MDRequest *r); // called when session closes + void request_kill(MDRequestRef& r); // called when session closes // journal/snap helpers CInode *pick_inode_snap(CInode *in, snapid_t follows); @@ -730,7 +731,7 @@ public: void open_foreign_mdsdir(inodeno_t ino, Context *c); CDentry *get_or_create_stray_dentry(CInode *in); - Context *_get_waiter(MDRequest *mdr, Message *req, Context *fin); + Context *_get_waiter(MDRequestRef& mdr, Message *req, Context *fin); /** * Find the given dentry (and whether it exists or not), its ancestors, @@ -766,7 +767,7 @@ public: * If it returns 2 the request has been forwarded, and again the requester * should unwind itself and back out. */ - int path_traverse(MDRequest *mdr, Message *req, Context *fin, const filepath& path, + int path_traverse(MDRequestRef& mdr, Message *req, Context *fin, const filepath& path, vector *pdnvec, CInode **pin, int onfail); bool path_is_mine(filepath& path); bool path_is_mine(string& p) { @@ -777,7 +778,7 @@ public: CInode *cache_traverse(const filepath& path); void open_remote_dirfrag(CInode *diri, frag_t fg, Context *fin); - CInode *get_dentry_inode(CDentry *dn, MDRequest *mdr, bool projected=false); + CInode *get_dentry_inode(CDentry *dn, MDRequestRef& mdr, bool projected=false); void open_remote_ino(inodeno_t ino, Context *fin, bool want_xlocked=false, inodeno_t hadino=0, version_t hadv=0); void open_remote_ino_2(inodeno_t ino, @@ -861,9 +862,9 @@ public: // -- anchors -- public: - void anchor_create_prep_locks(MDRequest *mdr, CInode *in, set& rdlocks, + void anchor_create_prep_locks(MDRequestRef& mdr, CInode *in, set& rdlocks, set& xlocks); - void anchor_create(MDRequest *mdr, CInode *in, Context *onfinish); + void anchor_create(MDRequestRef& mdr, CInode *in, Context *onfinish); void anchor_destroy(CInode *in, Context *onfinish); protected: void _anchor_prepared(CInode *in, version_t atid, bool add); @@ -873,8 +874,8 @@ protected: // -- snaprealms -- public: - void snaprealm_create(MDRequest *mdr, CInode *in); - void _snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in); + void snaprealm_create(MDRequestRef& mdr, CInode *in); + void _snaprealm_create_finish(MDRequestRef& mdr, Mutation *mut, CInode *in); // -- stray -- public: @@ -946,7 +947,7 @@ public: // -- namespace -- public: void send_dentry_link(CDentry *dn); - void send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequest *mdr); + void send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr); protected: void handle_dentry_link(MDentryLink *m); void handle_dentry_unlink(MDentryUnlink *m); @@ -969,7 +970,7 @@ private: int bits; list dirs; list resultfrags; - MDRequest *mdr; + MDRequestRef mdr; // for deadlock detection bool has_frozen; utime_t last_cum_auth_pins_change; @@ -995,9 +996,9 @@ private: void fragment_mark_and_complete(list& dirs); void fragment_frozen(dirfrag_t basedirfrag, int r); void fragment_unmark_unfreeze_dirs(list& dirs); - void dispatch_fragment_dir(MDRequest *mdr); - void _fragment_logged(MDRequest *mdr); - void _fragment_stored(MDRequest *mdr); + void dispatch_fragment_dir(MDRequestRef& mdr); + void _fragment_logged(MDRequestRef& mdr); + void _fragment_stored(MDRequestRef& mdr); void _fragment_committed(dirfrag_t f, list& resultfrags); void _fragment_finish(dirfrag_t f, list& resultfrags); @@ -1060,9 +1061,9 @@ public: class C_MDS_RetryRequest : public Context { MDCache *cache; - MDRequest *mdr; + MDRequestRef mdr; public: - C_MDS_RetryRequest(MDCache *c, MDRequest *r); + C_MDS_RetryRequest(MDCache *c, MDRequestRef& r); virtual void finish(int r); };