Skip to content

Commit

Permalink
Merge pull request #111 from basho/mv-tiered-options
Browse files Browse the repository at this point in the history
Mv tiered options
  • Loading branch information
Matthew Von-Maszewski committed Apr 10, 2014
2 parents deea5ef + 9af8e16 commit 9ab8ed6
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 17 deletions.
34 changes: 32 additions & 2 deletions c_src/eleveldb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,9 @@ ERL_NIF_TERM ATOM_LIMITED_DEVELOPER_MEM;
ERL_NIF_TERM ATOM_ELEVELDB_THREADS;
ERL_NIF_TERM ATOM_FADVISE_WILLNEED;
ERL_NIF_TERM ATOM_DELETE_THRESHOLD;

ERL_NIF_TERM ATOM_TIERED_SLOW_LEVEL;
ERL_NIF_TERM ATOM_TIERED_FAST_PREFIX;
ERL_NIF_TERM ATOM_TIERED_SLOW_PREFIX;
} // namespace eleveldb


Expand Down Expand Up @@ -422,6 +424,32 @@ ERL_NIF_TERM parse_open_option(ErlNifEnv* env, ERL_NIF_TERM item, leveldb::Optio
else
opts.limited_developer_mem = false;
}

else if (option[0] == eleveldb::ATOM_TIERED_SLOW_LEVEL)
{
int tiered_level;
if (enif_get_int(env, option[1], &tiered_level))
opts.tiered_slow_level = tiered_level;
}
else if (option[0] == eleveldb::ATOM_TIERED_FAST_PREFIX)
{
char buffer[256];
int ret_val;

ret_val=enif_get_string(env, option[1], buffer, 256, ERL_NIF_LATIN1);
if (0<ret_val && ret_val<256)
opts.tiered_fast_prefix = buffer;
}
else if (option[0] == eleveldb::ATOM_TIERED_SLOW_PREFIX)
{
char buffer[256];
int ret_val;

ret_val=enif_get_string(env, option[1], buffer, 256, ERL_NIF_LATIN1);
if (0<ret_val && ret_val<256)
opts.tiered_slow_prefix = buffer;
}

}

return eleveldb::ATOM_OK;
Expand Down Expand Up @@ -1194,7 +1222,9 @@ try
ATOM(eleveldb::ATOM_ELEVELDB_THREADS, "eleveldb_threads");
ATOM(eleveldb::ATOM_FADVISE_WILLNEED, "fadvise_willneed");
ATOM(eleveldb::ATOM_DELETE_THRESHOLD, "delete_threshold");

ATOM(eleveldb::ATOM_TIERED_SLOW_LEVEL, "tiered_slow_level");
ATOM(eleveldb::ATOM_TIERED_FAST_PREFIX, "tiered_fast_prefix");
ATOM(eleveldb::ATOM_TIERED_SLOW_PREFIX, "tiered_slow_prefix");
#undef ATOM


Expand Down
48 changes: 48 additions & 0 deletions priv/eleveldb.schema
Original file line number Diff line number Diff line change
Expand Up @@ -180,3 +180,51 @@
Int -> Int
end
end}.

%% @doc leveldb can be configured to use different mounts for
%% different levels. This tiered option defaults to off, but you can
%% configure it to trigger at levels 1-6. If you do this, anything
%% stored at the chosen level or greater will be stored on
%% leveldb.tiered.mounts.slow, while everything at the levels below will
%% be stored on leveldb.tiered.mounts.fast
%% Levels 3 or 4 are recommended settings.
%% WARNING: There is no dynamic reallocation of leveldb
%% data across mounts. If you change this setting without manually
%% moving the level files to the correct mounts, leveldb will act in
%% an unexpected state.
%% @see leveldb.tiered.mounts.fast
%% @see leveldb.tiered.mounts.slow
{mapping, "leveldb.tiered", "eleveldb.tiered_slow_level", [
{default, off},
{datatype, [
{atom, off},
{integer, 1},
{integer, 2},
{integer, 3},
{integer, 4},
{integer, 5},
{integer, 6}
]},
hidden
]}.

{translation, "eleveldb.tiered_slow_level",
fun(Conf) ->
case cuttlefish:conf_get("leveldb.tiered", Conf) of
off -> 0;
I -> I
end
end
}.

%% @see leveldb.tiered
{mapping, "leveldb.tiered.path.fast", "eleveldb.tiered_fast_prefix", [
{datatype, directory},
hidden
]}.

%% @see leveldb.tiered
{mapping, "leveldb.tiered.path.slow", "eleveldb.tiered_slow_prefix", [
{datatype, directory},
hidden
]}.
27 changes: 27 additions & 0 deletions priv/eleveldb_multi.schema
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,30 @@
{datatype, [integer, {atom, off}]},
hidden
]}.

%% @see leveldb.tiered
{mapping, "multi_backend.$name.leveldb.tiered", "riak_kv.multi_backend", [
{default, off},
{datatype, [
{atom, off},
{integer, 1},
{integer, 2},
{integer, 3},
{integer, 4},
{integer, 5},
{integer, 6}
]},
hidden
]}.

%% @see leveldb.tiered
{mapping, "multi_backend.$name.leveldb.tiered.mountpoint.fast", "riak_kv.multi_backend", [
{datatype, directory},
hidden
]}.

%% @see leveldb.tiered
{mapping, "multi_backend.$name.leveldb.tiered.mountpoint.slow", "riak_kv.multi_backend", [
{datatype, directory},
hidden
]}.
10 changes: 8 additions & 2 deletions src/eleveldb.erl
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,10 @@ init() ->
{eleveldb_threads, pos_integer()} |
{fadvise_willneed, boolean()} |
{block_cache_threshold, pos_integer()} |
{delete_threshold, pos_integer()}].
{delete_threshold, pos_integer()} |
{tiered_slow_level, pos_integer()} |
{tiered_fast_prefix, string()} |
{tiered_slow_prefix, string()}].

-type read_options() :: [{verify_checksums, boolean()} |
{fill_cache, boolean()} |
Expand Down Expand Up @@ -282,7 +285,10 @@ option_types(open) ->
{eleveldb_threads, integer},
{fadvise_willneed, bool},
{block_cache_threshold, integer},
{delete_threshold, integer}];
{delete_threshold, integer},
{tiered_slow_level, integer},
{tiered_fast_prefix, any},
{tiered_slow_prefix, any}];

option_types(read) ->
[{verify_checksums, bool},
Expand Down
13 changes: 11 additions & 2 deletions test/eleveldb_schema_tests.erl
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ basic_schema_test() ->
cuttlefish_unit:assert_config(Config, "eleveldb.fadvise_willneed", false),
cuttlefish_unit:assert_config(Config, "eleveldb.delete_threshold", 1000),
cuttlefish_unit:assert_config(Config, "eleveldb.compression", true),
cuttlefish_unit:assert_config(Config, "eleveldb.tiered_slow_level", 0),
cuttlefish_unit:assert_not_configured(Config, "eleveldb.tiered_fast_prefix"),
cuttlefish_unit:assert_not_configured(Config, "eleveldb.tiered_slow_prefix"),

%% Make sure no multi_backend
%% Warning: The following line passes by coincidence. It's because the
%% first mapping in the schema has no default defined. Testing strategy
Expand All @@ -54,7 +58,10 @@ override_schema_test() ->
{["leveldb", "threads"], 7},
{["leveldb", "fadvise_willneed"], true},
{["leveldb", "compression"], off},
{["leveldb", "compaction", "trigger", "tombstone_count"], off}
{["leveldb", "compaction", "trigger", "tombstone_count"], off},
{["leveldb", "tiered"], "2"},
{["leveldb", "tiered", "path", "fast"], "/mnt/speedy"},
{["leveldb", "tiered", "path", "slow"], "/mnt/slowpoke"}
],

%% The defaults are defined in ../priv/eleveldb.schema.
Expand All @@ -78,6 +85,9 @@ override_schema_test() ->
cuttlefish_unit:assert_config(Config, "eleveldb.fadvise_willneed", true),
cuttlefish_unit:assert_config(Config, "eleveldb.delete_threshold", 0),
cuttlefish_unit:assert_config(Config, "eleveldb.compression", false),
cuttlefish_unit:assert_config(Config, "eleveldb.tiered_slow_level", 2),
cuttlefish_unit:assert_config(Config, "eleveldb.tiered_fast_prefix", "/mnt/speedy"),
cuttlefish_unit:assert_config(Config, "eleveldb.tiered_slow_prefix", "/mnt/slowpoke"),

%% Make sure no multi_backend
%% Warning: The following line passes by coincidence. It's because the
Expand All @@ -94,7 +104,6 @@ multi_backend_test() ->
Config = cuttlefish_unit:generate_templated_config(
["../priv/eleveldb.schema", "../priv/eleveldb_multi.schema", "../test/multi_backend.schema"],
Conf, context(), predefined_schema()),
%%io:format("Config: ~p~n", []),

MultiBackendConfig = proplists:get_value(multi_backend, proplists:get_value(riak_kv, Config)),

Expand Down
39 changes: 28 additions & 11 deletions test/multi_backend.schema
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,45 @@
hidden
]}.

{translation, "riak_kv.multi_backend",
{translation,
"riak_kv.multi_backend",
fun(Conf, Schema) ->
GenerateSubConfig = fun(Name, Prefix, ProplistKey, ModuleName) ->
BackendConfigName = ["multi_backend", Name],
BackendConfigPrefix = BackendConfigName ++ [Prefix],
SubConf = [ begin
{lists:nthtail(2, Key), Value}
end || {Key, Value} <- cuttlefish_variable:filter_by_prefix(BackendConfigPrefix, Conf)],

case cuttlefish_generator:map(Schema, SubConf) of
{error, _Phase, {error, Errors}} ->
[ io:format("~s~n", [E]) || {error, E} <- Errors ],
cuttlefish:invalid(
lists:flatten(io_lib:format(
"Error processing multi_backend configuration for backend ~s", [Name])));
BackendProplist ->
Proplist = lists:foldl(
fun(K, Acc) ->
proplists:get_value(K, Acc, [])
end,
BackendProplist, ProplistKey),
{ModuleName, Proplist}
end
end,
%% group by $name into list, also cut the "multi_backend.$name" off every key
BackendNames = cuttlefish_variable:fuzzy_matches(["multi_backend","$name","storage_backend"], Conf),
%% for each in list, case statement on backend type
Backends = [ begin
BackendConfigName = ["multi_backend", Name],
{BackendModule, BackendConfig} = case cuttlefish:conf_get(BackendConfigName ++ ["storage_backend"], Conf) of
leveldb ->
BackendConfigPrefix = BackendConfigName ++ ["leveldb"],
SubConf = [ begin
{Key -- BackendConfigName, Value}
end || {Key, Value} <- cuttlefish_variable:filter_by_prefix(BackendConfigPrefix, Conf)],

BackendProplist = cuttlefish_generator:map(Schema, SubConf),

{riak_kv_eleveldb_backend, proplists:get_value(eleveldb, BackendProplist)}
end,
GenerateSubConfig(Name, "leveldb", [eleveldb], riak_kv_eleveldb_backend)
end,
{list_to_binary(Name), BackendModule, BackendConfig}
end || {"$name", Name} <- BackendNames],
case Backends of
[] -> throw(unset);
_ -> Backends
end
end}.
end
}.

0 comments on commit 9ab8ed6

Please sign in to comment.