]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
scatterlock: compress boolean flags into a set of state flags
authorGreg Farnum <gregory.farnum@dreamhost.com>
Fri, 29 Jul 2011 00:12:28 +0000 (17:12 -0700)
committerGreg Farnum <gregory.farnum@dreamhost.com>
Fri, 29 Jul 2011 16:17:45 +0000 (09:17 -0700)
While we're at it, unify the naming structure a bit and remove
the unused stale flag.

Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/ScatterLock.h
src/mds/Server.cc

index 58bb039b1e152e56e889a4f28d998c553840e899..4fcfedc8d423daa2e90c5ec9dd782c91b142614d 100644 (file)
@@ -1461,9 +1461,9 @@ bool CInode::is_dirty_scattered()
 
 void CInode::clear_scatter_dirty()
 {
-  filelock.clear_dirty();
-  nestlock.clear_dirty();
-  dirfragtreelock.clear_dirty();
+  filelock.remove_dirty();
+  nestlock.remove_dirty();
+  dirfragtreelock.remove_dirty();
 }
 
 void CInode::clear_dirty_scattered(int type)
index 9bc39703355c59e6cc9b8a4a14f1dac40548283d..9832a0dced2846654b37e03768d82b6ce6058d00 100644 (file)
@@ -231,9 +231,9 @@ void MDCache::remove_inode(CInode *o)
   if (o->is_dirty())
     o->mark_clean();
 
-  o->filelock.clear_dirty();
-  o->nestlock.clear_dirty();
-  o->dirfragtreelock.clear_dirty();
+  o->filelock.remove_dirty();
+  o->nestlock.remove_dirty();
+  o->dirfragtreelock.remove_dirty();
 
   o->item_open_file.remove_myself();
 
@@ -3140,9 +3140,9 @@ void MDCache::recalc_auth_bits()
              dnl->get_inode()->mark_clean();
            // avoid touching scatterlocks for our subtree roots!
            if (subtree_inodes.count(dnl->get_inode()) == 0) {
-             dnl->get_inode()->filelock.clear_dirty();
-             dnl->get_inode()->nestlock.clear_dirty();
-             dnl->get_inode()->dirfragtreelock.clear_dirty();
+             dnl->get_inode()->filelock.remove_dirty();
+             dnl->get_inode()->nestlock.remove_dirty();
+             dnl->get_inode()->dirfragtreelock.remove_dirty();
            }
          }
 
index 3c74bccb7863ff3d00a9a2df53f648f7e67506e6..699621099444ccae31804a829f5f4a70e171e9a3 100644 (file)
 class ScatterLock : public SimpleLock {
 
   struct more_bits_t {
-    bool dirty, flushing, flushed;
     int state_flags;
     utime_t last_scatter;
     xlist<ScatterLock*>::item item_updated;
     utime_t update_stamp;
-    bool stale;
 
     more_bits_t(ScatterLock *lock) :
-      dirty(false), flushing(false), flushed(false), state_flags(0),
-      item_updated(lock), stale(false)
+      state_flags(0),
+      item_updated(lock)
     {}
 
     bool empty() const {
       return
-       dirty == false &&
-       flushing == false &&
-       flushed == false &&
        !state_flags &&
-       !item_updated.is_on_list() &&
-       !stale;
+       !item_updated.is_on_list();
     }
   };
   more_bits_t *_more;
@@ -64,7 +58,6 @@ class ScatterLock : public SimpleLock {
     DIRTY            = 1 << 2,
     FLUSHING         = 1 << 3,
     FLUSHED          = 1 << 4,
-    STALE            = 1 << 5
   };
 
 public:
@@ -120,10 +113,12 @@ public:
   void clear_scatter_wanted() {
     if (have_more())
       _more->state_flags &= ~SCATTER_WANTED;
+    try_clear_more();
   }
   void clear_unscatter_wanted() {
     if (have_more())
       _more->state_flags &= ~UNSCATTER_WANTED;
+    try_clear_more();
   }
   bool get_scatter_wanted() const {
     return have_more() ? _more->state_flags & SCATTER_WANTED : false;
@@ -133,46 +128,48 @@ public:
   }
 
   bool is_dirty() const {
-    return have_more() ? _more->dirty : false;
+    return have_more() ? _more->state_flags & DIRTY : false;
   }
   bool is_flushing() const {
-    return have_more() ? _more->flushing : false;
+    return have_more() ? _more->state_flags & FLUSHING: false;
   }
   bool is_flushed() const {
-    return have_more() ? _more->flushed : false;
+    return have_more() ? _more->state_flags & FLUSHED: false;
   }
   bool is_dirty_or_flushing() const {
-    return have_more() ? (_more->dirty || _more->flushing) : false;
+    return have_more() ? (is_dirty() || is_flushing()) : false;
   }
 
   void mark_dirty() { 
-    if (!more()->dirty) {
-      if (!_more->flushing) 
+    if (!is_dirty()) {
+      if (!is_flushing())
        parent->get(MDSCacheObject::PIN_DIRTYSCATTERED);
-      _more->dirty = true;
+      set_dirty();
     }
   }
   void start_flush() {
-    more()->flushing |= more()->dirty;
-    more()->dirty = false;
+    if (is_dirty()) {
+      set_flushing();
+      clear_dirty();
+    }
   }
   void finish_flush() {
-    if (more()->flushing) {
-      _more->flushing = false;
-      _more->flushed = true;
-      if (!_more->dirty) {
+    if (is_flushing()) {
+      clear_flushing();
+      set_flushed();
+      if (!is_dirty()) {
        parent->put(MDSCacheObject::PIN_DIRTYSCATTERED);
        parent->clear_dirty_scattered(get_type());
       }
     }
   }
-  void clear_dirty() {
+  void remove_dirty() {
     start_flush();
     finish_flush();
   }
   void clear_flushed() {
-    if (_more) {
-      _more->flushed = false;
+    if (have_more()) {
+      _more->state_flags &= ~FLUSHED;
       try_clear_more();
     }
   }
@@ -205,6 +202,27 @@ public:
       out << " scatter_wanted";
     out << ")";
   }
+
+private:
+  void set_flushing() {
+    more()->state_flags &= FLUSHING;
+  }
+  void clear_flushing() {
+    if (have_more()) {
+      _more->state_flags &= ~FLUSHING;
+    }
+  }
+  void set_flushed() {
+    more()->state_flags &= FLUSHED;
+  }
+  void set_dirty() {
+    more()->state_flags &= DIRTY;
+  }
+  void clear_dirty() {
+    if (have_more()) {
+      _more->state_flags &= ~DIRTY;
+    }
+  }
 };
 
 #endif
index 56126d25c1b720f9d9421e3a43fb89cc8a8f44ae..640aaf5c67f4e265c3b8ccf3a1e74e1634d38411 100644 (file)
@@ -5386,8 +5386,8 @@ version_t Server::_rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferl
                                         srcdn->authority().first,
                                         mdr->ls, 0,
                                         mdr->more()->cap_imports, updated_scatterlocks);
-  srcdnl->get_inode()->filelock.clear_dirty();  
-  srcdnl->get_inode()->nestlock.clear_dirty();  
+  srcdnl->get_inode()->filelock.remove_dirty();  
+  srcdnl->get_inode()->nestlock.remove_dirty();  
 
   // hack: force back to !auth and clean, temporarily
   srcdnl->get_inode()->state_clear(CInode::STATE_AUTH);