diff options
Diffstat (limited to 'src/mds/journal.cc')
-rw-r--r-- | src/mds/journal.cc | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 49fdb9ce5da..237e1349396 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -2382,7 +2382,6 @@ void EFragment::replay(MDS *mds) list<CDir*> resultfrags; list<Context*> waiters; list<frag_t> old_frags; - pair<dirfrag_t,int> desc(dirfrag_t(ino,basefrag), bits); // in may be NULL if it wasn't in our cache yet. if it's a prepare // it will be once we replay the metablob , but first we need to @@ -2391,7 +2390,7 @@ void EFragment::replay(MDS *mds) switch (op) { case OP_PREPARE: - mds->mdcache->add_uncommitted_fragment(dirfrag_t(ino, basefrag), bits, old_frags); + mds->mdcache->add_uncommitted_fragment(dirfrag_t(ino, basefrag), bits, orig_frags, &rollback); // fall-thru case OP_ONESHOT: if (in) @@ -2399,8 +2398,15 @@ void EFragment::replay(MDS *mds) break; case OP_ROLLBACK: - if (in) - mds->mdcache->adjust_dir_fragments(in, basefrag, -bits, resultfrags, waiters, true); + if (in) { + 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); + } + } // fall-thru case OP_COMMIT: mds->mdcache->finish_uncommitted_fragment(dirfrag_t(ino, basefrag)); @@ -2409,24 +2415,27 @@ void EFragment::replay(MDS *mds) default: assert(0); } + metablob.replay(mds, _segment); if (in && g_conf->mds_debug_frag) in->verify_dirfrags(); } void EFragment::encode(bufferlist &bl) const { - ENCODE_START(4, 4, bl); + ENCODE_START(5, 4, bl); ::encode(stamp, bl); ::encode(op, bl); ::encode(ino, bl); ::encode(basefrag, bl); ::encode(bits, bl); ::encode(metablob, bl); + ::encode(orig_frags, bl); + ::encode(rollback, bl); ENCODE_FINISH(bl); } void EFragment::decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, bl); + DECODE_START_LEGACY_COMPAT_LEN(5, 4, 4, bl); if (struct_v >= 2) ::decode(stamp, bl); if (struct_v >= 3) @@ -2437,6 +2446,10 @@ void EFragment::decode(bufferlist::iterator &bl) { ::decode(basefrag, bl); ::decode(bits, bl); ::decode(metablob, bl); + if (struct_v >= 5) { + ::decode(orig_frags, bl); + ::decode(rollback, bl); + } DECODE_FINISH(bl); } @@ -2460,7 +2473,19 @@ void EFragment::generate_test_instances(list<EFragment*>& ls) ls.back()->bits = 5; } +void dirfrag_rollback::encode(bufferlist &bl) const +{ + ENCODE_START(1, 1, bl); + ::encode(fnode, bl); + ENCODE_FINISH(bl); +} +void dirfrag_rollback::decode(bufferlist::iterator &bl) +{ + DECODE_START(1, bl); + ::decode(fnode, bl); + DECODE_FINISH(bl); +} |