From 30d359c5f20df7299d7f799ad7743964815bb8d0 Mon Sep 17 00:00:00 2001 From: sageweil Date: Tue, 9 Oct 2007 22:54:49 +0000 Subject: [PATCH] cleaned up freeze_tree and freeze_dir interface git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1903 29311d96-e01e-0410-9327-a35deaab8ce9 --- branches/sage/mds/mds/CDir.cc | 121 +++++------------------------- branches/sage/mds/mds/CDir.h | 27 +++++-- branches/sage/mds/mds/MDCache.cc | 6 +- branches/sage/mds/mds/Migrator.cc | 5 +- 4 files changed, 46 insertions(+), 113 deletions(-) diff --git a/branches/sage/mds/mds/CDir.cc b/branches/sage/mds/mds/CDir.cc index 8ad539f6481ba..00923487f1bfb 100644 --- a/branches/sage/mds/mds/CDir.cc +++ b/branches/sage/mds/mds/CDir.cc @@ -1470,11 +1470,7 @@ void CDir::auth_unpin() dout(10) << "auth_unpin on " << *this << " count now " << auth_pins << " + " << nested_auth_pins << dendl; assert(auth_pins >= 0); - // pending freeze? - if (state_test(STATE_FREEZINGTREE|STATE_FREEZINGDIR) && - auth_pins == 1 && - nested_auth_pins == 0) - finish_waiting(WAIT_FREEZEABLE); + maybe_finish_freeze(); // pending freeze? // nest? if (is_subtree_root()) return; // no. @@ -1490,12 +1486,8 @@ void CDir::adjust_nested_auth_pins(int inc) dout(15) << "adjust_nested_auth_pins " << inc << " on " << *this << " count now " << auth_pins << " + " << nested_auth_pins << dendl; assert(nested_auth_pins >= 0); - - // pending freeze? - if (state_test(STATE_FREEZINGTREE|STATE_FREEZINGDIR) && - auth_pins == 1 && - nested_auth_pins == 0) - finish_waiting(WAIT_FREEZEABLE); + + maybe_finish_freeze(); // pending freeze? // adjust my inode? if (is_subtree_root()) @@ -1513,20 +1505,7 @@ void CDir::adjust_nested_auth_pins(int inc) // FREEZE TREE -class C_MDS_FreezeTree : public Context { - CDir *dir; - Context *con; -public: - C_MDS_FreezeTree(CDir *dir, Context *c) { - this->dir = dir; - this->con = c; - } - virtual void finish(int r) { - dir->freeze_tree_finish(con); - } -}; - -void CDir::freeze_tree(Context *c) +bool CDir::freeze_tree() { assert(!is_frozen()); assert(!is_freezing()); @@ -1534,23 +1513,17 @@ void CDir::freeze_tree(Context *c) auth_pin(); if (is_freezeable()) { - _freeze_tree(); - auth_unpin(); - if (c) { - c->finish(0); - delete c; - } + freeze_tree_finish(); + return true; } else { state_set(STATE_FREEZINGTREE); dout(10) << "freeze_tree waiting " << *this << dendl; - add_waiter(WAIT_FREEZEABLE, new C_MDS_FreezeTree(this, c)); - } + return false; + } } void CDir::_freeze_tree() { - dout(10) << "_freeze_tree " << *this << dendl; - // there shouldn't be any conflicting auth_pins (except the 'freezing' one) assert(is_freezeable(true)); @@ -1564,31 +1537,11 @@ void CDir::_freeze_tree() inode->auth_pin(); } -void CDir::freeze_tree_finish(Context *c) +void CDir::freeze_tree_finish() { - // still freezing? (we may have been canceled) - if (!is_freezing()) { - dout(10) << "freeze_tree_finish no longer freezing, done on " << *this << dendl; - c->finish(-1); - delete c; - return; - } - - // freezeable now? - if (!is_freezeable(true)) { - dout(10) << "freeze_tree_finish still waiting " << *this << dendl; - assert(state_test(STATE_FREEZINGTREE)); - add_waiter(WAIT_FREEZEABLE, new C_MDS_FreezeTree(this, c)); - return; - } - dout(10) << "freeze_tree_finish " << *this << dendl; _freeze_tree(); auth_unpin(); - if (c) { - c->finish(0); - delete c; - } } void CDir::unfreeze_tree() @@ -1614,7 +1567,7 @@ void CDir::unfreeze_tree() // cancel freeze waiters finish_waiting(WAIT_UNFREEZE); - finish_waiting(WAIT_FREEZEABLE, -1); + finish_waiting(WAIT_FROZEN, -1); } } @@ -1662,43 +1615,24 @@ CDir *CDir::get_frozen_tree_root() // FREEZE DIR -class C_MDS_FreezeDir : public Context { - CDir *dir; - Context *con; -public: - C_MDS_FreezeDir(CDir *dir, Context *c) { - this->dir = dir; - this->con = c; - } - virtual void finish(int r) { - dir->freeze_dir_finish(con); - } -}; - -void CDir::freeze_dir(Context *c) +bool CDir::freeze_dir() { assert(!is_frozen()); assert(!is_freezing()); auth_pin(); if (is_freezeable_dir()) { - _freeze_dir(); - auth_unpin(); - if (c) { - c->finish(0); - delete c; - } + freeze_dir_finish(); + return true; } else { state_set(STATE_FREEZINGDIR); dout(10) << "freeze_dir + wait " << *this << dendl; - add_waiter(WAIT_FREEZEABLE, new C_MDS_FreezeDir(this, c)); + return false; } } void CDir::_freeze_dir() -{ - dout(10) << "_freeze_dir " << *this << dendl; - +{ assert(is_freezeable_dir(true)); state_clear(STATE_FREEZINGDIR); @@ -1709,32 +1643,11 @@ void CDir::_freeze_dir() inode->auth_pin(); // auth_pin for duration of freeze } -void CDir::freeze_dir_finish(Context *c) +void CDir::freeze_dir_finish() { - // still freezing? (we may have been canceled) - if (!is_freezing()) { - dout(10) << "freeze_dir_finish no longer freezing, done on " << *this << dendl; - c->finish(-1); - delete c; - return; - } - - // freezeable now? - if (!is_freezeable_dir(true)) { - dout(10) << "freeze_dir_finish still waiting " << *this << dendl; - state_set(STATE_FREEZINGDIR); - add_waiter(WAIT_FREEZEABLE, new C_MDS_FreezeDir(this, c)); - return; - } - - // freeze now dout(10) << "freeze_dir_finish " << *this << dendl; _freeze_dir(); auth_unpin(); - if (c) { - c->finish(0); - delete c; - } } void CDir::unfreeze_dir() @@ -1759,7 +1672,7 @@ void CDir::unfreeze_dir() // cancel freeze waiters finish_waiting(WAIT_UNFREEZE); - finish_waiting(WAIT_FREEZEABLE, -1); + finish_waiting(WAIT_FROZEN, -1); } } diff --git a/branches/sage/mds/mds/CDir.h b/branches/sage/mds/mds/CDir.h index cb36346474182..f042b3d465f9c 100644 --- a/branches/sage/mds/mds/CDir.h +++ b/branches/sage/mds/mds/CDir.h @@ -135,7 +135,7 @@ class CDir : public MDSCacheObject { // -- wait masks -- static const int WAIT_DENTRY = (1<<0); // wait for item to be in cache static const int WAIT_COMPLETE = (1<<1); // wait for complete dir contents - static const int WAIT_FREEZEABLE = (1<<2); // auth pins removed + static const int WAIT_FROZEN = (1<<2); // auth pins removed static const int WAIT_DNLOCK_OFFSET = 4; @@ -422,16 +422,31 @@ public: void adjust_nested_auth_pins(int inc); // -- freezing -- - void freeze_tree(Context *c); - void freeze_tree_finish(Context *c); - void unfreeze_tree(); + bool freeze_tree(); void _freeze_tree(); + void freeze_tree_finish(); + void unfreeze_tree(); - void freeze_dir(Context *c); - void freeze_dir_finish(Context *c); + bool freeze_dir(); void _freeze_dir(); + void freeze_dir_finish(); void unfreeze_dir(); + void maybe_finish_freeze() { + if (state_test(STATE_FREEZINGTREE) && + auth_pins == 1 && + nested_auth_pins == 0) { + freeze_tree_finish(); + finish_waiting(WAIT_FROZEN); + } + if (state_test(STATE_FREEZINGDIR) && + auth_pins == 1 && + nested_auth_pins == 0) { + freeze_dir_finish(); + finish_waiting(WAIT_FROZEN); + } + } + bool is_freezing() { return is_freezing_tree() || is_freezing_dir(); } bool is_freezing_tree(); bool is_freezing_tree_root() { return state & STATE_FREEZINGTREE; } diff --git a/branches/sage/mds/mds/MDCache.cc b/branches/sage/mds/mds/MDCache.cc index 3eacfe1d13320..03fa6d9b0d195 100644 --- a/branches/sage/mds/mds/MDCache.cc +++ b/branches/sage/mds/mds/MDCache.cc @@ -5856,7 +5856,7 @@ void MDCache::split_dir(CDir *dir, int bits) */ void MDCache::fragment_freeze(CInode *diri, list& frags, frag_t basefrag, int bits) { - C_Gather *gather = new C_Gather(new C_MDC_FragmentGo(this, diri, frags, basefrag, bits)); + C_Gather *gather = new C_Gather(new C_MDC_FragmentGo(this, diri, frags, basefrag, bits)); // freeze the dirs for (list::iterator p = frags.begin(); @@ -5864,7 +5864,9 @@ void MDCache::fragment_freeze(CInode *diri, list& frags, frag_t basefrag, ++p) { CDir *dir = *p; dir->auth_pin(); // this will block the freeze - dir->freeze_dir(gather->new_sub()); + dir->freeze_dir(); + assert(dir->is_freezing_dir()); + dir->add_waiter(CDir::WAIT_FROZEN, gather->new_sub()); } } diff --git a/branches/sage/mds/mds/Migrator.cc b/branches/sage/mds/mds/Migrator.cc index 78e80a4ab017d..0eb13255ad485 100644 --- a/branches/sage/mds/mds/Migrator.cc +++ b/branches/sage/mds/mds/Migrator.cc @@ -587,7 +587,10 @@ void Migrator::export_dir(CDir *dir, int dest) // start the freeze, but hold it up with an auth_pin. dir->auth_pin(); - dir->freeze_tree(new C_MDC_ExportFreeze(this, dir)); + if (dir->freeze_tree()) + export_frozen(dir); + else + dir->add_waiter(CDir::WAIT_FROZEN, new C_MDC_ExportFreeze(this, dir)); } -- 2.39.5