summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Vergé <adrienverge@gmail.com>2019-01-31 01:06:21 +0100
committerJoan Touzet <wohali@users.noreply.github.com>2019-01-30 19:06:21 -0500
commit547169447067e9111dbd31f2ae86d49afe980fda (patch)
treed5272b275bb2866020b21f5bb4fde8e10c9e7c88
parentaba66331f74142e84229aae3c569376375494a36 (diff)
downloadcouchdb-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.ini7
-rw-r--r--src/couch/src/couch_compaction_daemon.erl71
-rw-r--r--src/couch/test/couchdb_compaction_daemon_tests.erl2
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]),