summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2013-01-21 22:05:42 +0800
committerYan, Zheng <zheng.z.yan@intel.com>2013-01-29 10:17:36 +0800
commit4fc68a48113557392e9f1b00eb0f921163036a98 (patch)
tree8bd2d315e5403c710da86276d701a9931218dcb7
parent9a0cfcc56d24b91cf22f04d91b756261c1b4e410 (diff)
downloadceph-4fc68a48113557392e9f1b00eb0f921163036a98.tar.gz
mds: properly clear CDir::STATE_COMPLETE when replaying EImportStart
when replaying EImportStart, we should set/clear directory's COMPLETE flag according with the flag in the journal entry. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
-rw-r--r--src/mds/MDCache.cc5
-rw-r--r--src/mds/Migrator.cc4
-rw-r--r--src/mds/Server.cc2
-rw-r--r--src/mds/events/EMetaBlob.h20
-rw-r--r--src/mds/journal.cc2
5 files changed, 24 insertions, 9 deletions
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
index e75e87d5554..466779bc59c 100644
--- a/src/mds/MDCache.cc
+++ b/src/mds/MDCache.cc
@@ -466,7 +466,7 @@ void MDCache::_create_system_file(CDir *dir, const char *name, CInode *in, Conte
le->metablob.add_root(true, in);
}
if (mdir)
- le->metablob.add_dir(mdir, true, true, true); // dirty AND complete AND new
+ le->metablob.add_new_dir(mdir); // dirty AND complete AND new
mds->mdlog->submit_entry(le);
mds->mdlog->wait_for_safe(new C_MDC_CreateSystemFile(this, mut, dn, dpv, fin));
@@ -3281,6 +3281,7 @@ void MDCache::recalc_auth_bits()
else {
dir->state_set(CDir::STATE_REJOINING);
dir->state_clear(CDir::STATE_AUTH);
+ dir->state_clear(CDir::STATE_COMPLETE);
if (dir->is_dirty())
dir->mark_clean();
}
@@ -8385,7 +8386,7 @@ void MDCache::_purge_stray_purged(CDentry *dn, int r)
pf->rstat.sub(in->inode.accounted_rstat);
le->metablob.add_dir_context(dn->dir);
- EMetaBlob::dirlump& dl = le->metablob.add_dir(dn->dir, true, false, false);
+ EMetaBlob::dirlump& dl = le->metablob.add_dir(dn->dir, true);
le->metablob.add_null_dentry(dl, dn, true);
le->metablob.add_destroyed_inode(in->ino());
diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc
index 453cfafef43..3449306d64a 100644
--- a/src/mds/Migrator.cc
+++ b/src/mds/Migrator.cc
@@ -2391,9 +2391,7 @@ int Migrator::decode_import_dir(bufferlist::iterator& blp,
// add to journal entry
if (le)
- le->metablob.add_dir(dir,
- true, // Hmm: dirty=false would be okay in some cases
- dir->is_complete());
+ le->metablob.add_import_dir(dir);
int num_imported = 0;
diff --git a/src/mds/Server.cc b/src/mds/Server.cc
index 7a459324283..c0b41056738 100644
--- a/src/mds/Server.cc
+++ b/src/mds/Server.cc
@@ -3823,7 +3823,7 @@ void Server::handle_client_mkdir(MDRequest *mdr)
journal_allocated_inos(mdr, &le->metablob);
mdcache->predirty_journal_parents(mdr, &le->metablob, newi, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1);
le->metablob.add_primary_dentry(dn, true, newi);
- le->metablob.add_dir(newdir, true, true, true); // dirty AND complete AND new
+ le->metablob.add_new_dir(newdir); // dirty AND complete AND new
// issue a cap on the directory
int cmode = CEPH_FILE_MODE_RDWR;
diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h
index 77ceb9458ba..bd0a8f7b4db 100644
--- a/src/mds/events/EMetaBlob.h
+++ b/src/mds/events/EMetaBlob.h
@@ -283,6 +283,7 @@ public:
static const int STATE_COMPLETE = (1<<1);
static const int STATE_DIRTY = (1<<2); // dirty due to THIS journal item, that is!
static const int STATE_NEW = (1<<3); // new directory
+ static const int STATE_IMPORTING = (1<<4); // importing directory
//version_t dirv;
fnode_t fnode;
@@ -305,6 +306,8 @@ public:
void mark_dirty() { state |= STATE_DIRTY; }
bool is_new() { return state & STATE_NEW; }
void mark_new() { state |= STATE_NEW; }
+ bool is_importing() { return state & STATE_IMPORTING; }
+ void mark_importing() { state |= STATE_IMPORTING; }
list<std::tr1::shared_ptr<fullbit> > &get_dfull() { return dfull; }
list<remotebit> &get_dremote() { return dremote; }
@@ -634,11 +637,21 @@ private:
&in->old_inodes)));
}
- dirlump& add_dir(CDir *dir, bool dirty, bool complete=false, bool isnew=false) {
+ dirlump& add_dir(CDir *dir, bool dirty, bool complete=false) {
return add_dir(dir->dirfrag(), dir->get_projected_fnode(), dir->get_projected_version(),
- dirty, complete, isnew);
+ dirty, complete);
}
- dirlump& add_dir(dirfrag_t df, fnode_t *pf, version_t pv, bool dirty, bool complete=false, bool isnew=false) {
+ dirlump& add_new_dir(CDir *dir) {
+ return add_dir(dir->dirfrag(), dir->get_projected_fnode(), dir->get_projected_version(),
+ true, true, true); // dirty AND complete AND new
+ }
+ dirlump& add_import_dir(CDir *dir) {
+ // dirty=false would be okay in some cases
+ return add_dir(dir->dirfrag(), dir->get_projected_fnode(), dir->get_projected_version(),
+ true, dir->is_complete(), false, true);
+ }
+ dirlump& add_dir(dirfrag_t df, fnode_t *pf, version_t pv, bool dirty,
+ bool complete=false, bool isnew=false, bool importing=false) {
if (lump_map.count(df) == 0)
lump_order.push_back(df);
@@ -648,6 +661,7 @@ private:
if (complete) l.mark_complete();
if (dirty) l.mark_dirty();
if (isnew) l.mark_new();
+ if (importing) l.mark_importing();
return l;
}
diff --git a/src/mds/journal.cc b/src/mds/journal.cc
index ff09e15d9f8..12f488c0cf1 100644
--- a/src/mds/journal.cc
+++ b/src/mds/journal.cc
@@ -516,6 +516,8 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg, MDSlaveUpdate *slaveup)
dir->mark_new(logseg);
if (lump.is_complete())
dir->mark_complete();
+ else if (lump.is_importing())
+ dir->state_clear(CDir::STATE_COMPLETE);
dout(10) << "EMetaBlob.replay updated dir " << *dir << dendl;