summaryrefslogtreecommitdiff
path: root/src/mds/events/EFragment.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds/events/EFragment.h')
-rw-r--r--src/mds/events/EFragment.h22
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;