summaryrefslogtreecommitdiff
path: root/src/mds/MDCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds/MDCache.h')
-rw-r--r--src/mds/MDCache.h59
1 files changed, 41 insertions, 18 deletions
diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h
index 416c6454292..87b1098bb52 100644
--- a/src/mds/MDCache.h
+++ b/src/mds/MDCache.h
@@ -943,10 +943,26 @@ protected:
// -- fragmenting --
-public:
- set< pair<dirfrag_t,int> > uncommitted_fragments; // prepared but uncommitted refragmentations
-
private:
+ struct ufragment {
+ int bits;
+ bool committed;
+ LogSegment *ls;
+ list<Context*> waiters;
+ list<frag_t> old_frags;
+ bufferlist rollback;
+ ufragment() : bits(0), committed(false), ls(NULL) {}
+ };
+ map<dirfrag_t, ufragment> uncommitted_fragments;
+
+ struct fragment_info_t {
+ frag_t basefrag;
+ int bits;
+ list<CDir*> dirs;
+ list<CDir*> resultfrags;
+ };
+ map<metareqid_t, fragment_info_t> fragment_requests;
+
void adjust_dir_fragments(CInode *diri, frag_t basefrag, int bits,
list<CDir*>& frags, list<Context*>& waiters, bool replay);
void adjust_dir_fragments(CInode *diri,
@@ -958,32 +974,39 @@ private:
CDir *force_dir_fragment(CInode *diri, frag_t fg);
void get_force_dirfrag_bound_set(vector<dirfrag_t>& dfs, set<CDir*>& bounds);
-
- friend class EFragment;
-
- bool can_fragment_lock(CInode *diri);
bool can_fragment(CInode *diri, list<CDir*>& dirs);
-
-public:
- void split_dir(CDir *dir, int byn);
- void merge_dir(CInode *diri, frag_t fg);
-
-private:
void fragment_freeze_dirs(list<CDir*>& dirs, C_GatherBuilder &gather);
void fragment_mark_and_complete(list<CDir*>& dirs);
void fragment_frozen(list<CDir*>& dirs, frag_t basefrag, int bits);
void fragment_unmark_unfreeze_dirs(list<CDir*>& dirs);
- void fragment_logged_and_stored(Mutation *mut, list<CDir*>& resultfrags, frag_t basefrag, int bits);
-public:
- void rollback_uncommitted_fragments();
-private:
+ void dispatch_fragment_dir(MDRequest *mdr);
+ void _fragment_logged(MDRequest *mdr);
+ void _fragment_stored(MDRequest *mdr);
+ void _fragment_committed(dirfrag_t f, list<CDir*>& resultfrags);
+ void _fragment_finish(dirfrag_t f, list<CDir*>& resultfrags);
+ friend class EFragment;
friend class C_MDC_FragmentFrozen;
friend class C_MDC_FragmentMarking;
- friend class C_MDC_FragmentLoggedAndStored;
+ friend class C_MDC_FragmentPrep;
+ friend class C_MDC_FragmentStore;
+ friend class C_MDC_FragmentCommit;
+ friend class C_MDC_FragmentFinish;
void handle_fragment_notify(MMDSFragmentNotify *m);
+ void add_uncommitted_fragment(dirfrag_t basedirfrag, int bits, list<frag_t>& old_frag,
+ LogSegment *ls, bufferlist *rollback=NULL);
+ void finish_uncommitted_fragment(dirfrag_t basedirfrag, int op);
+ void rollback_uncommitted_fragment(dirfrag_t basedirfrag, list<frag_t>& old_frags);
+public:
+ void wait_for_uncommitted_fragment(dirfrag_t dirfrag, Context *c) {
+ assert(uncommitted_fragments.count(dirfrag));
+ uncommitted_fragments[dirfrag].waiters.push_back(c);
+ }
+ void split_dir(CDir *dir, int byn);
+ void merge_dir(CInode *diri, frag_t fg);
+ void rollback_uncommitted_fragments();
// -- updates --
//int send_inode_updates(CInode *in);