]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid propagating nestlock more frequently than mds_dirstat_min_interval
authorSage Weil <sage@newdream.net>
Mon, 24 Aug 2009 21:01:14 +0000 (14:01 -0700)
committerSage Weil <sage@newdream.net>
Mon, 24 Aug 2009 21:01:14 +0000 (14:01 -0700)
Instead, add the lock to the update_scatterlock list, as usual.

src/config.cc
src/config.h
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/ScatterLock.h

index 1cee555069d9e55fb8e65887d72171098ed5e08c..e16ebfc3c443884d695ab6f9ec72c38882532561 100644 (file)
@@ -407,6 +407,7 @@ static struct config_option config_optionsp[] = {
        OPTION(mds_reconnect_timeout, 0, OPT_FLOAT, 45),  // seconds to wait for clients during mds restart
                                                          //  make it (mds_session_timeout - mds_beacon_grace)
        OPTION(mds_tick_interval, 0, OPT_FLOAT, 5),
+       OPTION(mds_dirstat_min_interval, 0, OPT_FLOAT, 1),    // try to avoid propagating more often than this
        OPTION(mds_scatter_nudge_interval, 0, OPT_FLOAT, 5),  // how quickly dirstat changes propagate up the hierarchy
        OPTION(mds_client_prealloc_inos, 0, OPT_INT, 1000),
        OPTION(mds_early_reply, 0, OPT_BOOL, true),
index 6cde0ba9aab54214c8bd3358337f3fd2f2098dcf..08f9f6dd5898a50746e3c6f06865a081bb93f421 100644 (file)
@@ -198,6 +198,7 @@ struct md_config_t {
   float mds_reconnect_timeout;
 
   float mds_tick_interval;
+  float mds_dirstat_min_interval;
   float mds_scatter_nudge_interval;
 
   int mds_client_prealloc_inos;
index 101c18d8d8dbcb2901075015cb81f8055cd737a8..4562fb1d360d3e8eaa0d7c9c1ef351dff65014f0 100644 (file)
@@ -2546,6 +2546,12 @@ bool Locker::simple_sync(SimpleLock *lock, bool *need_issue)
       gather++;
     }
     
+    if (!gather && lock->is_updated()) {
+      lock->get_parent()->auth_pin(lock);
+      scatter_writebehind((ScatterLock*)lock);
+      return false;
+    }
+
     if (gather) {
       lock->get_parent()->auth_pin(lock);
       return false;
@@ -2664,8 +2670,9 @@ void Locker::simple_lock(SimpleLock *lock, bool *need_issue)
   }
 
   if (!gather && lock->is_updated()) {
+    lock->get_parent()->auth_pin(lock);
     scatter_writebehind((ScatterLock*)lock);
-    gather++;
+    return;
   }
 
   if (gather) {
index cccd80926898e3fb879c07cb13e12f997bb4d204..8f39d9263256d736eac486753c17197c2fd33eea 100644 (file)
@@ -1667,6 +1667,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
   list<CInode*> lsi;
   CInode *cur = in;
   CDentry *parentdn = cur->get_projected_parent_dn();
+  bool first = true;
   while (parent) {
     //assert(cur->is_auth() || !primary_dn);  // this breaks the rename auth twiddle hack
     assert(parent->is_auth());
@@ -1749,6 +1750,26 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
       dout(10) << "predirty_journal_parents !auth or ambig on " << *pin << dendl;
       stop = true;
     }
+
+    // delay propagating until later?
+    if (!stop && !first &&
+       g_conf.mds_dirstat_min_interval > 0) {
+      if (pin->last_dirstat_prop.sec() > 0) {
+       double since_last_prop = mut->now - pin->last_dirstat_prop;
+       if (since_last_prop < g_conf.mds_dirstat_min_interval) {
+         dout(10) << "predirty_journal_parents last prop " << since_last_prop
+                  << " < " << g_conf.mds_dirstat_min_interval
+                  << ", stopping" << dendl;
+         stop = true;
+       } else {
+         dout(10) << "predirty_journal_parents last prop " << since_last_prop << " ago, continuing" << dendl;
+       }
+      } else {
+       dout(10) << "predirty_journal_parents last prop never, stopping" << dendl;
+       stop = true;
+      }
+    }
+
     if (!stop &&
        mut->wrlocks.count(&pin->nestlock) == 0 &&
        (!pin->can_auth_pin() ||
@@ -1772,6 +1793,8 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
 
     assert(mut->wrlocks.count(&pin->nestlock) ||
           mut->is_slave());
+    
+    pin->last_dirstat_prop = mut->now;
 
     // dirfrag -> diri
     mut->auth_pin(pin);
@@ -1827,6 +1850,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
     linkunlink = 0;
     do_parent_mtime = false;
     primary_dn = true;
+    first = false;
   }
 
   // now, stick it in the blob
index aff5a1d5f3d658963a6e04d0343da8e6474fcd79..b8804265e6a27c4e53e0a3ff8bab13807536a872 100644 (file)
@@ -39,6 +39,9 @@ public:
   void clear_scatter_wanted() { scatter_wanted = false; }
   bool get_scatter_wanted() { return scatter_wanted; }
 
+  bool is_updated() {
+    return dirty;
+  }
   void mark_dirty() { 
     if (!dirty) {
       if (!flushing)