summaryrefslogtreecommitdiff
path: root/src/mds/journal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds/journal.cc')
-rw-r--r--src/mds/journal.cc37
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);
+}