diff options
Diffstat (limited to 'src/mds/events/EFragment.h')
-rw-r--r-- | src/mds/events/EFragment.h | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/mds/events/EFragment.h b/src/mds/events/EFragment.h index bdbbd335e29..a9ddd548502 100644 --- a/src/mds/events/EFragment.h +++ b/src/mds/events/EFragment.h @@ -18,6 +18,14 @@ #include "../LogEvent.h" #include "EMetaBlob.h" +struct dirfrag_rollback { + fnode_t fnode; + dirfrag_rollback() { } + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& bl); +}; +WRITE_CLASS_ENCODER(dirfrag_rollback) + class EFragment : public LogEvent { public: EMetaBlob metablob; @@ -25,6 +33,8 @@ public: inodeno_t ino; frag_t basefrag; __s32 bits; // positive for split (from basefrag), negative for merge (to basefrag) + list<frag_t> orig_frags; + bufferlist rollback; EFragment() : LogEvent(EVENT_FRAGMENT) { } EFragment(MDLog *mdlog, int o, inodeno_t i, frag_t bf, int b) : @@ -39,17 +49,25 @@ public: OP_PREPARE = 1, OP_COMMIT = 2, OP_ROLLBACK = 3, - OP_ONESHOT = 4, // (legacy) PREPARE+COMMIT + OP_FINISH = 4, // finish deleting orphan dirfrags + OP_ONESHOT = 5, // (legacy) PREPARE+COMMIT }; - const char *op_name(int o) const { + static const char *op_name(int o) { switch (o) { case OP_PREPARE: return "prepare"; case OP_COMMIT: return "commit"; case OP_ROLLBACK: return "rollback"; + case OP_FINISH: return "finish"; default: return "???"; } } + void add_orig_frag(frag_t df, dirfrag_rollback *drb=NULL) { + orig_frags.push_back(df); + if (drb) + ::encode(*drb, rollback); + } + void encode(bufferlist &bl) const; void decode(bufferlist::iterator &bl); void dump(Formatter *f) const; |