diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-09-20 17:05:09 +0800 |
---|---|---|
committer | Yan, Zheng <zheng.z.yan@intel.com> | 2013-09-24 08:45:55 +0800 |
commit | 8ea2c72a403cc21a52bb7118a92b08153beae760 (patch) | |
tree | 8ace76fd06a61f05eeea14eb24c147f33825fc23 | |
parent | ba9cec2f96153324f02600c354a3cea943a784f2 (diff) | |
download | ceph-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.cc | 13 | ||||
-rw-r--r-- | src/mds/journal.cc | 8 |
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; |