diff --git a/src/riak_ensemble_config.erl b/src/riak_ensemble_config.erl index ee21bef..355c0d0 100644 --- a/src/riak_ensemble_config.erl +++ b/src/riak_ensemble_config.erl @@ -113,6 +113,27 @@ tree_validation() -> synchronous_tree_updates() -> get_env(synchronous_tree_updates, false). +%% @doc LevelDB options used for synctree LevelDB instances. +synctree_leveldb_opts() -> + DefaultWriteBufferMin = 4 * 1024 * 1024, + DefaultWriteBufferMax = 14 * 1024 * 1024, + Config = get_env(synctree_leveldb_opts, + [{write_buffer_size_min, DefaultWriteBufferMin}, + {write_buffer_size_max, DefaultWriteBufferMax}]), + %% Use a variable write buffer size to prevent against all buffers being + %% flushed to disk at once when under a heavy uniform load. + WriteBufferMin = proplists:get_value(write_buffer_size_min, Config, DefaultWriteBufferMin), + WriteBufferMax = proplists:get_value(write_buffer_size_max, Config, DefaultWriteBufferMax), + {Offset, _} = random:uniform_s(1 + WriteBufferMax - WriteBufferMin, now()), + WriteBufferSize = WriteBufferMin + Offset, + Config2 = orddict:store(write_buffer_size, WriteBufferSize, Config), + Config3 = orddict:erase(write_buffer_size_min, Config2), + Config4 = orddict:erase(write_buffer_size_max, Config3), + Config5 = orddict:store(is_internal_db, true, Config4), + Config6 = orddict:store(use_bloomfilter, true, Config5), + Options = orddict:store(create_if_missing, true, Config6), + Options. + get_env(Key, Default) -> case application:get_env(riak_ensemble, Key) of undefined -> diff --git a/src/synctree_leveldb.erl b/src/synctree_leveldb.erl index 046f218..ee8c064 100644 --- a/src/synctree_leveldb.erl +++ b/src/synctree_leveldb.erl @@ -174,8 +174,4 @@ timestamp({Mega, Secs, Micro}) -> Mega*1000*1000*1000*1000 + Secs * 1000 * 1000 + Micro. leveldb_opts() -> - [{is_internal_db, true}, - {write_buffer_size, 4 * 1024 * 1024}, - {use_bloomfilter, true}, - {create_if_missing, true}]. - + riak_ensemble_config:synctree_leveldb_opts().