diff options
Diffstat (limited to 'src/mds/MDCache.h')
-rw-r--r-- | src/mds/MDCache.h | 59 |
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); |