} else {
set<int> resolve_set;
mds->mdsmap->get_mds_set(resolve_set, MDSMap::STATE_RESOLVE);
- for (ceph::unordered_map<metareqid_t, MDRequest*>::iterator p = active_requests.begin();
+ for (ceph::unordered_map<metareqid_t, ceph::weak_ptr<MDRequestImpl> >::iterator p = active_requests.begin();
p != active_requests.end();
++p) {
if (!p->second->is_slave() || !p->second->slave_did_prepare())
migrator->handle_mds_failure_or_stop(who);
// clean up any requests slave to/from this node
- list<MDRequest*> finish;
- for (ceph::unordered_map<metareqid_t, MDRequest*>::iterator p = active_requests.begin();
+ list<MDRequestRef> finish;
+ for (ceph::unordered_map<metareqid_t, ceph::weak_ptr<MDRequestImpl> >::iterator p = active_requests.begin();
p != active_requests.end();
++p) {
// slave to the failed node?
if (p->second->slave_request)
p->second->aborted = true;
else
- finish.push_back(p->second);
+ finish.push_back(p->second.lock());
}
}
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);
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 ?
if (!mds->is_rejoin()) {
// i am survivor. send strong rejoin.
// note request remote_auth_pins, xlocks
- for (ceph::unordered_map<metareqid_t, MDRequest*>::iterator p = active_requests.begin();
+ for (ceph::unordered_map<metareqid_t, ceph::weak_ptr<MDRequestImpl> >::iterator p = active_requests.begin();
p != active_requests.end();
++p) {
if ( p->second->is_slave())
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());
++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());
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);
}
}
-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;
}
}
-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<CDentry*> *pdnvec, // result
CInode **pin,
* 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)
int MDCache::get_num_client_requests()
{
int count = 0;
- for (ceph::unordered_map<metareqid_t, MDRequest*>::iterator p = active_requests.begin();
+ for (ceph::unordered_map<metareqid_t, ceph::weak_ptr<MDRequestImpl> >::iterator p = active_requests.begin();
p != active_requests.end();
++p) {
if (p->second->reqid.name.is_client() && !p->second->is_slave())
}
-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 "
}
-void MDCache::dispatch_request(MDRequest *mdr)
+void MDCache::dispatch_request(MDRequestRef& mdr)
{
if (mdr->killed) {
dout(10) << "request " << *mdr << " was killed" << dendl;
}
-void MDCache::request_drop_foreign_locks(MDRequest *mdr)
+void MDCache::request_drop_foreign_locks(MDRequestRef& mdr)
{
if (!mdr->has_more())
return;
* 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;
log_stat();
}
-void MDCache::request_kill(MDRequest *mdr)
+void MDCache::request_kill(MDRequestRef& mdr)
{
mdr->killed = true;
if (!mdr->committing) {
}
};
-void MDCache::anchor_create_prep_locks(MDRequest *mdr, CInode *in,
+void MDCache::anchor_create_prep_locks(MDRequestRef& mdr, CInode *in,
set<SimpleLock*>& rdlocks, set<SimpleLock*>& xlocks)
{
dout(10) << "anchor_create_prep_locks " << *in << dendl;
}
}
-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;
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);
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;
// 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
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);
}
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);
}
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<dirfrag_t,fragment_info_t>::iterator it = fragments.find(basedirfrag);
mds->mdlog->flush();
}
-void MDCache::_fragment_logged(MDRequest *mdr)
+void MDCache::_fragment_logged(MDRequestRef& mdr)
{
dirfrag_t basedirfrag = mdr->more()->fragment_base;
map<dirfrag_t,fragment_info_t>::iterator it = fragments.find(basedirfrag);
gather.activate();
}
-void MDCache::_fragment_stored(MDRequest *mdr)
+void MDCache::_fragment_stored(MDRequestRef& mdr)
{
dirfrag_t basedirfrag = mdr->more()->fragment_base;
map<dirfrag_t,fragment_info_t>::iterator it = fragments.find(basedirfrag);
-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();
}
struct Mutation;
struct MDRequestImpl;
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
struct MDSlaveUpdate;
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<CDentry*>& 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<CDentry*>& 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);
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,
* 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<CDentry*> *pdnvec, CInode **pin, int onfail);
bool path_is_mine(filepath& path);
bool path_is_mine(string& p) {
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,
// -- anchors --
public:
- void anchor_create_prep_locks(MDRequest *mdr, CInode *in, set<SimpleLock*>& rdlocks,
+ void anchor_create_prep_locks(MDRequestRef& mdr, CInode *in, set<SimpleLock*>& rdlocks,
set<SimpleLock*>& 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);
// -- 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:
// -- 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);
int bits;
list<CDir*> dirs;
list<CDir*> resultfrags;
- MDRequest *mdr;
+ MDRequestRef mdr;
// for deadlock detection
bool has_frozen;
utime_t last_cum_auth_pins_change;
void fragment_mark_and_complete(list<CDir*>& dirs);
void fragment_frozen(dirfrag_t basedirfrag, int r);
void fragment_unmark_unfreeze_dirs(list<CDir*>& 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<CDir*>& resultfrags);
void _fragment_finish(dirfrag_t f, list<CDir*>& resultfrags);
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);
};