_omap_fetch(want_dn);
}
-class C_Dir_TMAP_Fetched : public Context {
+class C_IO_Dir_TMAP_Fetched : public Context {
protected:
CDir *dir;
string want_dn;
public:
bufferlist bl;
- C_Dir_TMAP_Fetched(CDir *d, const string& w) : dir(d), want_dn(w) { }
+ C_IO_Dir_TMAP_Fetched(CDir *d, const string& w) : dir(d), want_dn(w) { }
void finish(int r) {
+ Mutex::Locker l(dir->cache->mds->mds_lock);
dir->_tmap_fetched(bl, want_dn, r);
}
};
void CDir::_tmap_fetch(const string& want_dn)
{
// start by reading the first hunk of it
- C_Dir_TMAP_Fetched *fin = new C_Dir_TMAP_Fetched(this, want_dn);
+ C_IO_Dir_TMAP_Fetched *fin = new C_IO_Dir_TMAP_Fetched(this, want_dn);
object_t oid = get_ondisk_object();
object_locator_t oloc(cache->mds->mdsmap->get_metadata_pool());
ObjectOperation rd;
_omap_fetched(header, omap, want_dn, r);
}
-class C_Dir_OMAP_Fetched : public Context {
+class C_IO_Dir_OMAP_Fetched : public Context {
protected:
CDir *dir;
string want_dn;
map<string, bufferlist> omap;
int ret1, ret2;
- C_Dir_OMAP_Fetched(CDir *d, const string& w) : dir(d), want_dn(w) { }
+ C_IO_Dir_OMAP_Fetched(CDir *d, const string& w) : dir(d), want_dn(w) { }
void finish(int r) {
+ Mutex::Locker l(dir->cache->mds->mds_lock);
if (r >= 0) r = ret1;
if (r >= 0) r = ret2;
dir->_omap_fetched(hdrbl, omap, want_dn, r);
void CDir::_omap_fetch(const string& want_dn)
{
- C_Dir_OMAP_Fetched *fin = new C_Dir_OMAP_Fetched(this, want_dn);
+ C_IO_Dir_OMAP_Fetched *fin = new C_IO_Dir_OMAP_Fetched(this, want_dn);
object_t oid = get_ondisk_object();
object_locator_t oloc(cache->mds->mdsmap->get_metadata_pool());
ObjectOperation rd;
_commit(want, op_prio);
}
-class C_Dir_Committed : public Context {
+class C_IO_Dir_Committed : public Context {
CDir *dir;
version_t version;
public:
- C_Dir_Committed(CDir *d, version_t v) : dir(d), version(v) { }
+ C_IO_Dir_Committed(CDir *d, version_t v) : dir(d), version(v) { }
void finish(int r) {
+ Mutex::Locker l(dir->cache->mds->mds_lock);
assert(r == 0);
dir->_committed(version);
}
set<string> to_remove;
map<string, bufferlist> to_set;
- C_GatherBuilder gather(g_ceph_context, new C_Dir_Committed(this, get_version()));
+ C_GatherBuilder gather(g_ceph_context,
+ new C_IO_Dir_Committed(this, get_version()));
SnapContext snapc;
object_t oid = get_ondisk_object();
friend class CDirDiscover;
friend class CDirExport;
- friend class C_Dir_TMAP_Fetched;
- friend class C_Dir_OMAP_Fetched;
- friend class C_Dir_Committed;
+ friend class C_IO_Dir_TMAP_Fetched;
+ friend class C_IO_Dir_OMAP_Fetched;
+ friend class C_IO_Dir_Committed;
bloom_filter *bloom;
/* If you set up the bloom filter, you must keep it accurate!
// per-inode storage
// (currently for root inode only)
-struct C_Inode_Stored : public Context {
+struct C_IO_Inode_Stored : public Context {
CInode *in;
version_t version;
Context *fin;
- C_Inode_Stored(CInode *i, version_t v, Context *f) : in(i), version(v), fin(f) {}
+ C_IO_Inode_Stored(CInode *i, version_t v, Context *f) : in(i), version(v), fin(f) {}
void finish(int r) {
+ Mutex::Locker l(in->mdcache->mds->mds_lock);
assert(r == 0);
in->_stored(version, fin);
}
object_locator_t oloc(mdcache->mds->mdsmap->get_metadata_pool());
mdcache->mds->objecter->mutate(oid, oloc, m, snapc, ceph_clock_now(g_ceph_context), 0,
- NULL, new C_Inode_Stored(this, get_version(), fin) );
+ NULL, new C_IO_Inode_Stored(this, get_version(), fin) );
}
void CInode::_stored(version_t v, Context *fin)
fin->complete(0);
}
-struct C_Inode_Fetched : public Context {
+struct C_IO_Inode_Fetched : public Context {
CInode *in;
bufferlist bl, bl2;
Context *fin;
- C_Inode_Fetched(CInode *i, Context *f) : in(i), fin(f) {}
+ C_IO_Inode_Fetched(CInode *i, Context *f) : in(i), fin(f) {}
void finish(int r) {
+ Mutex::Locker l(in->mdcache->mds->mds_lock);
in->_fetched(bl, bl2, fin);
}
};
{
dout(10) << "fetch" << dendl;
- C_Inode_Fetched *c = new C_Inode_Fetched(this, fin);
+ C_IO_Inode_Fetched *c = new C_IO_Inode_Fetched(this, fin);
C_GatherBuilder gather(g_ceph_context, c);
object_t oid = CInode::get_object_name(ino(), frag_t(), "");
}
}
-struct C_Inode_StoredBacktrace : public Context {
+struct C_IO_Inode_StoredBacktrace : public Context {
CInode *in;
version_t version;
Context *fin;
- C_Inode_StoredBacktrace(CInode *i, version_t v, Context *f) : in(i), version(v), fin(f) {}
+ C_IO_Inode_StoredBacktrace(CInode *i, version_t v, Context *f) : in(i), version(v), fin(f) {}
void finish(int r) {
+ Mutex::Locker l(in->mdcache->mds->mds_lock);
assert(r == 0);
in->_stored_backtrace(version, fin);
}
SnapContext snapc;
object_t oid = get_object_name(ino(), frag_t(), "");
object_locator_t oloc(pool);
- Context *fin2 = new C_Inode_StoredBacktrace(this, inode.backtrace_version, fin);
+ Context *fin2 = new C_IO_Inode_StoredBacktrace(this, inode.backtrace_version, fin);
if (!state_test(STATE_DIRTYPOOL) || inode.old_pools.empty()) {
mdcache->mds->objecter->mutate(oid, oloc, op, snapc, ceph_clock_now(g_ceph_context),
// -------------------------------------------------------------------------------
// Open inode by inode number
-class C_MDC_OpenInoBacktraceFetched : public Context {
+class C_IO_MDC_OpenInoBacktraceFetched : public Context {
MDCache *cache;
inodeno_t ino;
public:
bufferlist bl;
- C_MDC_OpenInoBacktraceFetched(MDCache *c, inodeno_t i) :
+ C_IO_MDC_OpenInoBacktraceFetched(MDCache *c, inodeno_t i) :
cache(c), ino(i) {}
void finish(int r) {
+ Mutex::Locker l(cache->mds->mds_lock);
cache->_open_ino_backtrace_fetched(ino, bl, r);
}
};
dout(10) << " old object in pool " << info.pool
<< ", retrying pool " << backtrace.pool << dendl;
info.pool = backtrace.pool;
- C_MDC_OpenInoBacktraceFetched *fin = new C_MDC_OpenInoBacktraceFetched(this, ino);
+ C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino);
fetch_backtrace(ino, info.pool, fin->bl, fin);
return;
}
dout(10) << " no object in pool " << info.pool
<< ", retrying pool " << meta_pool << dendl;
info.pool = meta_pool;
- C_MDC_OpenInoBacktraceFetched *fin = new C_MDC_OpenInoBacktraceFetched(this, ino);
+ C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino);
fetch_backtrace(ino, info.pool, fin->bl, fin);
return;
}
info.checking = mds->get_nodeid();
info.checked.clear();
info.checked.insert(mds->get_nodeid());
- C_MDC_OpenInoBacktraceFetched *fin = new C_MDC_OpenInoBacktraceFetched(this, ino);
+ C_IO_MDC_OpenInoBacktraceFetched *fin = new C_IO_MDC_OpenInoBacktraceFetched(this, ino);
fetch_backtrace(ino, info.pool, fin->bl, fin);
} else {
assert(!info.ancestors.empty());
mds->objecter->getxattr(oid, object_locator_t(pool), "parent", CEPH_NOSNAP, &bl, 0, fin);
}
-class C_MDC_PurgeStrayPurged : public Context {
+class C_IO_MDC_PurgeStrayPurged : public Context {
MDCache *cache;
CDentry *dn;
public:
- C_MDC_PurgeStrayPurged(MDCache *c, CDentry *d) :
+ C_IO_MDC_PurgeStrayPurged(MDCache *c, CDentry *d) :
cache(c), dn(d) { }
void finish(int r) {
+ Mutex::Locker l(cache->mds->mds_lock);
assert(r == 0 || r == -ENOENT);
cache->_purge_stray_purged(dn, r);
}
// dir. on recovery, we'll need to re-eval all strays anyway.
SnapContext nullsnapc;
- C_GatherBuilder gather(g_ceph_context, new C_MDC_PurgeStrayPurged(this, dn));
+ C_GatherBuilder gather(g_ceph_context, new C_IO_MDC_PurgeStrayPurged(this, dn));
if (in->is_dir()) {
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
}
};
-class C_MDC_FragmentFinish : public Context {
+class C_IO_MDC_FragmentFinish : public Context {
MDCache *mdcache;
dirfrag_t basedirfrag;
list<CDir*> resultfrags;
public:
- C_MDC_FragmentFinish(MDCache *m, dirfrag_t f, list<CDir*>& l) :
+ C_IO_MDC_FragmentFinish(MDCache *m, dirfrag_t f, list<CDir*>& l) :
mdcache(m), basedirfrag(f) {
resultfrags.swap(l);
}
virtual void finish(int r) {
+ Mutex::Locker l(mdcache->mds->mds_lock);
assert(r == 0 || r == -ENOENT);
mdcache->_fragment_finish(basedirfrag, resultfrags);
}
ufragment &uf = it->second;
// remove old frags
- C_GatherBuilder gather(g_ceph_context, new C_MDC_FragmentFinish(this, basedirfrag, resultfrags));
+ C_GatherBuilder gather(g_ceph_context, new C_IO_MDC_FragmentFinish(this, basedirfrag, resultfrags));
SnapContext nullsnapc;
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
void do_open_ino_peer(inodeno_t ino, open_ino_info_t& info);
void handle_open_ino(MMDSOpenIno *m);
void handle_open_ino_reply(MMDSOpenInoReply *m);
- friend class C_MDC_OpenInoBacktraceFetched;
+ friend class C_IO_MDC_OpenInoBacktraceFetched;
friend struct C_MDC_OpenInoTraverseDir;
friend struct C_MDC_OpenInoParentOpened;
void _purge_stray_logged(CDentry *dn, version_t pdv, LogSegment *ls);
void _purge_stray_logged_truncate(CDentry *dn, LogSegment *ls);
friend struct C_MDC_RetryScanStray;
- friend class C_MDC_FetchedBacktrace;
+ friend class C_IO_MDC_FetchedBacktrace;
friend class C_MDC_PurgeStrayLogged;
friend class C_MDC_PurgeStrayLoggedTruncate;
- friend class C_MDC_PurgeStrayPurged;
+ friend class C_IO_MDC_PurgeStrayPurged;
void reintegrate_stray(CDentry *dn, CDentry *rlink);
void migrate_stray(CDentry *dn, int dest);
friend class C_MDC_FragmentPrep;
friend class C_MDC_FragmentStore;
friend class C_MDC_FragmentCommit;
- friend class C_MDC_FragmentFinish;
+ friend class C_IO_MDC_FragmentFinish;
void handle_fragment_notify(MMDSFragmentNotify *m);
#define dout_prefix *_dout << "mds." << (mds ? mds->get_nodeid() : -1) << "." << table_name << ": "
-class C_MT_Save : public Context {
+class C_IO_MT_Save : public Context {
MDSTable *ida;
version_t version;
public:
- C_MT_Save(MDSTable *i, version_t v) : ida(i), version(v) {}
+ C_IO_MT_Save(MDSTable *i, version_t v) : ida(i), version(v) {}
void finish(int r) {
+ Mutex::Locker l(ida->mds->mds_lock);
ida->save_2(r, version);
}
};
mds->objecter->write_full(oid, oloc,
snapc,
bl, ceph_clock_now(g_ceph_context), 0,
- NULL, new C_MT_Save(this, version));
+ NULL, new C_IO_MT_Save(this, version));
}
void MDSTable::save_2(int r, version_t v)
// -----------------------
-class C_MT_Load : public Context {
+class C_IO_MT_Load : public Context {
public:
MDSTable *ida;
Context *onfinish;
bufferlist bl;
- C_MT_Load(MDSTable *i, Context *o) : ida(i), onfinish(o) {}
+ C_IO_MT_Load(MDSTable *i, Context *o) : ida(i), onfinish(o) {}
void finish(int r) {
+ Mutex::Locker l(ida->mds->mds_lock);
ida->load_2(r, bl, onfinish);
}
};
assert(is_undef());
state = STATE_OPENING;
- C_MT_Load *c = new C_MT_Load(this, onfinish);
+ C_IO_MT_Load *c = new C_IO_MT_Load(this, onfinish);
object_t oid = get_object_name();
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, c);
class MDS;
class MDSTable {
- protected:
+public:
MDS *mds;
-
+protected:
const char *table_name;
bool per_mds;
return object_t(s);
}
-class C_SM_Load : public Context {
+class C_IO_SM_Load : public Context {
SessionMap *sessionmap;
public:
bufferlist bl;
- C_SM_Load(SessionMap *cm) : sessionmap(cm) {}
+ C_IO_SM_Load(SessionMap *cm) : sessionmap(cm) {}
void finish(int r) {
+ Mutex::Locker l(sessionmap->mds->mds_lock);
sessionmap->_load_finish(r, bl);
}
};
if (onload)
waiting_for_load.push_back(onload);
- C_SM_Load *c = new C_SM_Load(this);
+ C_IO_SM_Load *c = new C_IO_SM_Load(this);
object_t oid = get_object_name();
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
mds->objecter->read_full(oid, oloc, CEPH_NOSNAP, &c->bl, 0, c);
// ----------------
// SAVE
-class C_SM_Save : public Context {
+class C_IO_SM_Save : public Context {
SessionMap *sessionmap;
version_t version;
public:
- C_SM_Save(SessionMap *cm, version_t v) : sessionmap(cm), version(v) {}
+ C_IO_SM_Save(SessionMap *cm, version_t v) : sessionmap(cm), version(v) {}
void finish(int r) {
+ Mutex::Locker l(sessionmap->mds->mds_lock);
assert(r == 0);
sessionmap->_save_finish(version);
}
mds->objecter->write_full(oid, oloc,
snapc,
bl, ceph_clock_now(g_ceph_context), 0,
- NULL, new C_SM_Save(this, version));
+ NULL, new C_IO_SM_Save(this, version));
}
void SessionMap::_save_finish(version_t v)
class MDS;
class SessionMap {
-private:
+public:
MDS *mds;
+private:
ceph::unordered_map<entity_name_t, Session*> session_map;
public:
map<int,xlist<Session*>* > by_state;