summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2013-09-20 17:05:09 +0800
committerYan, Zheng <zheng.z.yan@intel.com>2013-09-24 08:45:55 +0800
commit8ea2c72a403cc21a52bb7118a92b08153beae760 (patch)
tree8ace76fd06a61f05eeea14eb24c147f33825fc23
parentba9cec2f96153324f02600c354a3cea943a784f2 (diff)
downloadceph-8ea2c72a403cc21a52bb7118a92b08153beae760.tar.gz
mds: use MDCache::force_dir_fragment() to rollback fragment
We may merge dirfrags with different frag bits into one dirfrag. When rollback a merging operation, dirfrags should go back to their orgin. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
-rw-r--r--src/mds/MDCache.cc13
-rw-r--r--src/mds/journal.cc8
2 files changed, 18 insertions, 3 deletions
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
index 6a45cf14b03..f973ec7b731 100644
--- a/src/mds/MDCache.cc
+++ b/src/mds/MDCache.cc
@@ -11429,8 +11429,17 @@ void MDCache::rollback_uncommitted_fragments()
diri->dirfragtree.get_leaves_under(p->first.frag, old_frags);
list<CDir*> resultfrags;
- list<Context*> waiters;
- adjust_dir_fragments(diri, p->first.frag, -uf.bits, resultfrags, waiters, true);
+ if (uf.old_frags.empty()) {
+ // created by old format EFragment
+ list<Context*> waiters;
+ adjust_dir_fragments(diri, p->first.frag, -uf.bits, resultfrags, waiters, true);
+ } else {
+ for (list<frag_t>::iterator p = uf.old_frags.begin(); p != uf.old_frags.end(); ++p) {
+ CDir *dir = force_dir_fragment(diri, *p);
+ resultfrags.push_back(dir);
+ }
+ }
+
if (g_conf->mds_debug_frag)
diri->verify_dirfrags();
diff --git a/src/mds/journal.cc b/src/mds/journal.cc
index f36087f49d8..df730db4d5c 100644
--- a/src/mds/journal.cc
+++ b/src/mds/journal.cc
@@ -2400,7 +2400,13 @@ void EFragment::replay(MDS *mds)
case OP_ROLLBACK:
if (in) {
in->dirfragtree.get_leaves_under(basefrag, old_frags);
- mds->mdcache->adjust_dir_fragments(in, basefrag, -bits, resultfrags, waiters, true);
+ if (orig_frags.empty()) {
+ // old format EFragment
+ mds->mdcache->adjust_dir_fragments(in, basefrag, -bits, resultfrags, waiters, true);
+ } else {
+ for (list<frag_t>::iterator p = orig_frags.begin(); p != orig_frags.end(); ++p)
+ mds->mdcache->force_dir_fragment(in, *p);
+ }
}
mds->mdcache->rollback_uncommitted_fragment(dirfrag_t(ino, basefrag), old_frags);
break;