]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
filestore: enforce min and max sync interval
authorSage Weil <sage@newdream.net>
Thu, 5 Mar 2009 18:22:03 +0000 (10:22 -0800)
committerSage Weil <sage@newdream.net>
Thu, 5 Mar 2009 18:22:03 +0000 (10:22 -0800)
Ideally the min sync interval should be self-tuning (ala ext3, xfs),
but that can come later.

src/TODO
src/config.cc
src/config.h
src/os/FileStore.cc

index f31a5ea3779999b08da4d3bed041b48f4b98f3af..d743e5af34a263d41e3c499fcbb505dad76ed9cb 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -1,3 +1,8 @@
+v0.6
+/- fold observer into cmonctl/ceph?
+/- osd scrub
+/- async metadata
+
 v0.7
 /- smart osd sync
 /- osd bug fixes
@@ -70,6 +75,7 @@ vfs issues
 - a getattr mask would be really nice
 
 filestore
+- make min sync interval self-tuning (ala xfs, ext3?)
 - get file csum?
 
 btrfs
index 2e32585040e149d6a540570a5b02cdbb838fccee..26d38e52fb10f501d87d492469a474388ffa027e 100644 (file)
@@ -528,7 +528,8 @@ static struct config_option config_optionsp[] = {
        OPTION(osd, osd_recovery_max_active, 0, INT, 5),
        OPTION(osd, osd_auto_weight, 0, BOOL, false),
        OPTION(filestore, filestore, 0, BOOL, false),
-       OPTION(filestore, filestore_sync_interval, 0, DOUBLE, .2),    // seconds
+       OPTION(filestore, filestore_max_sync_interval, 0, DOUBLE, .2),    // seconds
+       OPTION(filestore, filestore_min_sync_interval, 0, DOUBLE, .02),    // seconds
        OPTION(filestore, filestore_fake_attrs, 0, BOOL, false),
        OPTION(filestore, filestore_fake_collections, 0, BOOL, false),
        OPTION(filestore, filestore_dev, 0, STR, 0),
index 0bccd15a5acffc0abb109101e37d5a9878f0cc9e..fdf1c150103bccddaec27e9f6e9eb435fc584a7d 100644 (file)
@@ -289,7 +289,8 @@ struct md_config_t {
 
   // filestore
   bool filestore;
-  double   filestore_sync_interval;
+  double   filestore_max_sync_interval;
+  double   filestore_min_sync_interval;
   bool  filestore_fake_attrs;
   bool  filestore_fake_collections;
   const char  *filestore_dev;
index 7583827cab42c263f09ba034e3b2e31c90a2fe74..a629289d7b426abae69fe7187bcc606d5fd0f8b7 100644 (file)
@@ -1407,16 +1407,34 @@ int FileStore::_clone_range(coll_t cid, pobject_t oldoid, pobject_t newoid, __u6
 
 void FileStore::sync_entry()
 {
+  Cond othercond;
+
   lock.Lock();
-  utime_t interval;
-  interval.set_from_double(g_conf.filestore_sync_interval);
+  utime_t max_interval;
+  max_interval.set_from_double(g_conf.filestore_max_sync_interval);
+  utime_t min_interval;
+  min_interval.set_from_double(g_conf.filestore_min_sync_interval);
   while (!stop) {
-    dout(20) << "sync_entry waiting for " << interval << dendl;
-    sync_cond.WaitInterval(lock, interval);
+    dout(20) << "sync_entry waiting for max_interval " << max_interval << dendl;
+    utime_t startwait = g_clock.now();
+
+    sync_cond.WaitInterval(lock, max_interval);
+
+    // wait for at least the min interval
+    utime_t woke = g_clock.now();
+    woke -= startwait;
+    dout(20) << "sync_entry woke after " << woke << dendl;
+    if (woke < min_interval) {
+      utime_t t = min_interval;
+      t -= woke;
+      dout(20) << "sync_entry waiting for another " << t << " to reach min interval " << min_interval << dendl;
+      othercond.WaitInterval(lock, t);
+    }
+
     lock.Unlock();
 
     if (commit_start()) {
-      dout(15) << "sync_entry committing " << op_seq << " " << interval << dendl;
+      dout(15) << "sync_entry committing " << op_seq << dendl;
 
       __u64 cp = op_seq;
       
@@ -1443,9 +1461,12 @@ void FileStore::sync_entry()
 
 void FileStore::_start_sync()
 {
-  dout(10) << "start_sync" << dendl;
-  if (!journal)   // don't do a big sync if the journal is on
+  if (!journal) {  // don't do a big sync if the journal is on
+    dout(10) << "start_sync" << dendl;
     sync_cond.Signal();
+  } else {
+    dout(10) << "start_sync - NOOP (journal is on)" << dendl;
+  }
 }
 
 void FileStore::sync()