]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objectcacher: fix writeback logic to be less braindead
authorSage Weil <sage@newdream.net>
Wed, 18 Jun 2008 03:56:19 +0000 (20:56 -0700)
committerSage Weil <sage@newdream.net>
Wed, 18 Jun 2008 03:56:19 +0000 (20:56 -0700)
src/config.cc
src/config.h
src/osdc/ObjectCacher.cc

index f6d9f834055ff256a909d7051110f4f928cb7b06..2a0b70122d962f5bc3101b26739d3885d1dec90a 100644 (file)
@@ -295,7 +295,9 @@ md_config_t g_conf = {
   // --- objectcacher ---
   client_oc: true,
   client_oc_size:      1024*1024* 64,    // MB * n
-  client_oc_max_dirty: 1024*1024* 32,    // MB * n  (dirty OR tx)
+  client_oc_max_dirty: 1024*1024* 48,    // MB * n  (dirty OR tx.. bigish)
+  client_oc_target_dirty:  1024*1024* 8, // target dirty (keep this smallish)
+  // note: the max amount of "in flight" dirty data is roughly (max - target)
   client_oc_max_sync_write: 128*1024,   // sync writes >= this use wrlock
 
   // --- objecter ---
index be12340b75547d0388730f9a91269d734546fd12..e8171ce534fe2afc2e537c99dc8c794b5acd7332 100644 (file)
@@ -162,6 +162,7 @@ struct md_config_t {
   bool     client_oc;
   int      client_oc_size;
   int      client_oc_max_dirty;
+  int      client_oc_target_dirty;
   size_t   client_oc_max_sync_write;
 
   // objecter
index e2fe09ad8ae9c305ae39ca074b58b853e61de5a5..195e0a26984debf25514c444d26d509bb61b0907 100644 (file)
@@ -918,6 +918,8 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
 bool ObjectCacher::wait_for_write(size_t len, Mutex& lock)
 {
   int blocked = 0;
+
+  // wait for writeback?
   while (get_stat_dirty() + get_stat_tx() >= g_conf.client_oc_max_dirty) {
     dout(10) << "wait_for_write waiting on " << len << ", dirty|tx " 
             << (get_stat_dirty() + get_stat_tx()) 
@@ -930,6 +932,13 @@ bool ObjectCacher::wait_for_write(size_t len, Mutex& lock)
     blocked++;
     dout(10) << "wait_for_write woke up" << dendl;
   }
+
+  // start writeback anyway?
+  if (get_stat_dirty() > g_conf.client_oc_target_dirty) {
+    dout(10) << "wait_for_write " << get_stat_dirty() << " > target "
+            << g_conf.client_oc_target_dirty << ", nudging flusher" << dendl;
+    flusher_cond.Signal();
+  }
   return blocked;
 }
 
@@ -945,14 +954,17 @@ void ObjectCacher::flusher_entry()
                << get_stat_tx() << " tx, "
                << get_stat_rx() << " rx, "
                << get_stat_clean() << " clean, "
-               << get_stat_dirty() << " / " << g_conf.client_oc_max_dirty << " dirty"
+               << get_stat_dirty() << " dirty ("
+              << g_conf.client_oc_target_dirty << " target, "
+              << g_conf.client_oc_max_dirty << " max)"
                << dendl;
-      if (get_stat_dirty() > g_conf.client_oc_max_dirty) {
+      if (get_stat_dirty() > g_conf.client_oc_target_dirty) {
         // flush some dirty pages
         dout(10) << "flusher " 
-                 << get_stat_dirty() << " / " << g_conf.client_oc_max_dirty << " dirty,"
-                 << " flushing some dirty bhs" << dendl;
-        flush(get_stat_dirty() - g_conf.client_oc_max_dirty);
+                 << get_stat_dirty() << " dirty > target "
+                << g_conf.client_oc_target_dirty
+                 << ", flushing some dirty bhs" << dendl;
+        flush(get_stat_dirty() - g_conf.client_oc_target_dirty);
       }
       else {
         // check tail of lru for old dirty items