From bdc527eba869e4cb4d6f7af21195099aa5a5dd4e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 5 Mar 2009 10:22:03 -0800 Subject: [PATCH] filestore: enforce min and max sync interval Ideally the min sync interval should be self-tuning (ala ext3, xfs), but that can come later. --- src/TODO | 6 ++++++ src/config.cc | 3 ++- src/config.h | 3 ++- src/os/FileStore.cc | 35 ++++++++++++++++++++++++++++------- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/TODO b/src/TODO index f31a5ea377999..d743e5af34a26 100644 --- 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 diff --git a/src/config.cc b/src/config.cc index 2e32585040e14..26d38e52fb10f 100644 --- a/src/config.cc +++ b/src/config.cc @@ -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), diff --git a/src/config.h b/src/config.h index 0bccd15a5acff..fdf1c150103bc 100644 --- a/src/config.h +++ b/src/config.h @@ -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; diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 7583827cab42c..a629289d7b426 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -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() -- 2.39.5