diff options
author | Adrien Vergé <adrienverge@gmail.com> | 2019-01-31 01:06:21 +0100 |
---|---|---|
committer | Joan Touzet <wohali@users.noreply.github.com> | 2019-01-30 19:06:21 -0500 |
commit | 547169447067e9111dbd31f2ae86d49afe980fda (patch) | |
tree | d5272b275bb2866020b21f5bb4fde8e10c9e7c88 | |
parent | aba66331f74142e84229aae3c569376375494a36 (diff) | |
download | couchdb-547169447067e9111dbd31f2ae86d49afe980fda.tar.gz |
Compaction: Add snooze_period_ms for finer tuning (#1880)
This commit introduces a new option `snooze_period_ms` (measured in
milliseconds), and deprecates `snooze_period` while still supporting it
for obvious legacy reasons.
-rw-r--r-- | rel/overlay/etc/default.ini | 7 | ||||
-rw-r--r-- | src/couch/src/couch_compaction_daemon.erl | 71 | ||||
-rw-r--r-- | src/couch/test/couchdb_compaction_daemon_tests.erl | 2 |
3 files changed, 72 insertions, 8 deletions
diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini index b9d51af71..24428f3e5 100644 --- a/rel/overlay/etc/default.ini +++ b/rel/overlay/etc/default.ini @@ -434,9 +434,10 @@ min_file_size = 131072 ; With lots of databases and/or with lots of design docs in one or more ; databases, the compaction_daemon can create significant CPU load when ; checking whether databases and view indexes need compacting. The -; snooze_period setting ensures a smoother CPU load. Defaults to -; 3 seconds wait. -; snooze_period = 3 +; snooze_period_ms setting ensures a smoother CPU load. Defaults to +; 3000 milliseconds wait. Note that this option was formerly called +; snooze_period, measured in seconds (it is currently still supported). +; snooze_period_ms = 3000 [compactions] ; List of compaction rules for the compaction daemon. diff --git a/src/couch/src/couch_compaction_daemon.erl b/src/couch/src/couch_compaction_daemon.erl index 115a9a897..2a46c3f26 100644 --- a/src/couch/src/couch_compaction_daemon.erl +++ b/src/couch/src/couch_compaction_daemon.erl @@ -125,8 +125,16 @@ handle_config_terminate(_, stop, _) -> handle_config_terminate(_Server, _Reason, _State) -> erlang:send_after(?RELISTEN_DELAY, whereis(?MODULE), restart_config_listener). +get_snooze_period() -> + % The snooze_period_ms option should be used, but snooze_period is supported + % for legacy reasons. + Default = config:get_integer("compaction_daemon", "snooze_period", 3), + case config:get_integer("compaction_daemon", "snooze_period_ms", -1) of + -1 -> Default * 1000; + SnoozePeriod -> SnoozePeriod + end. + compact_loop(Parent) -> - SnoozePeriod = config:get_integer("compaction_daemon", "snooze_period", 3), {ok, _} = couch_server:all_databases( fun(DbName, Acc) -> case ets:info(?CONFIG_ETS, size) =:= 0 of @@ -140,7 +148,7 @@ compact_loop(Parent) -> case check_period(Config) of true -> maybe_compact_db(Parent, DbName, Config), - ok = timer:sleep(SnoozePeriod * 1000); + ok = timer:sleep(get_snooze_period()); false -> ok end @@ -231,8 +239,7 @@ maybe_compact_views(DbName, [DDocName | Rest], Config) -> timeout -> ok end, - SnoozePeriod = config:get_integer("compaction_daemon", "snooze_period", 3), - ok = timer:sleep(SnoozePeriod * 1000); + ok = timer:sleep(get_snooze_period()); false -> ok end. @@ -597,4 +604,60 @@ abs_path2_test() -> ?assertEqual({ok, "/a/b/"}, abs_path2("/a/b")), ok. +get_snooze_period_test_() -> + { + foreach, + fun() -> + meck:new(config, [passthrough]) + end, + fun(_) -> + meck:unload() + end, + [ + {"should return default value without config attributes", + fun should_default_without_config/0}, + {"should respect old config attribute", + fun should_respect_old_config/0}, + {"should respect old config set to zero", + fun should_respect_old_config_zero/0}, + {"should respect new config attribute", + fun should_respect_new_config/0}, + {"should respect new config set to zero", + fun should_respect_new_config_zero/0} + ] + }. + +should_default_without_config() -> + ?assertEqual(3000, get_snooze_period()). + +should_respect_old_config() -> + meck:expect(config, get_integer, fun + ("compaction_daemon", "snooze_period", _) -> 1; + (_, _, Default) -> Default + end), + ?assertEqual(1000, get_snooze_period()). + +should_respect_old_config_zero() -> + meck:expect(config, get_integer, fun + ("compaction_daemon", "snooze_period", _) -> 0; + (_, _, Default) -> Default + end), + ?assertEqual(0, get_snooze_period()). + +should_respect_new_config() -> + meck:expect(config, get_integer, fun + ("compaction_daemon", "snooze_period", _) -> 1; + ("compaction_daemon", "snooze_period_ms", _) -> 300; + (_, _, Default) -> Default + end), + ?assertEqual(300, get_snooze_period()). + +should_respect_new_config_zero() -> + meck:expect(config, get_integer, fun + ("compaction_daemon", "snooze_period", _) -> 1; + ("compaction_daemon", "snooze_period_ms", _) -> 0; + (_, _, Default) -> Default + end), + ?assertEqual(0, get_snooze_period()). + -endif. diff --git a/src/couch/test/couchdb_compaction_daemon_tests.erl b/src/couch/test/couchdb_compaction_daemon_tests.erl index c10ddee12..0ef2a4064 100644 --- a/src/couch/test/couchdb_compaction_daemon_tests.erl +++ b/src/couch/test/couchdb_compaction_daemon_tests.erl @@ -24,7 +24,7 @@ start() -> Ctx = test_util:start_couch(), ok = config:set("compaction_daemon", "check_interval", "3", false), - ok = config:set("compaction_daemon", "snooze_period", "0", false), + ok = config:set("compaction_daemon", "snooze_period_ms", "0", false), ok = config:set("compaction_daemon", "min_file_size", "100000", false), ok = config:delete("compactions", "_default", false), ok = meck:new(?MODS_TO_MOCK, [passthrough]), |