diff --git a/rebar.config b/rebar.config index a08116c..09bc631 100644 --- a/rebar.config +++ b/rebar.config @@ -3,7 +3,7 @@ {clean_files, ["*.eunit", "ebin/*.beam"]}. {eunit_opts, [verbose, {report, {eunit_surefire, [{dir, "."}]}}]}. -{erl_opts, [%{d,'TRIQ',true}, %{d,'DEBUG',true}, +{erl_opts, [%{d,'DEBUG',true}, {parse_transform, lager_transform}, fail_on_warning, warn_unused_vars, @@ -28,6 +28,8 @@ , {lager, ".*", {git, "git://github.com/basho/lager", {branch, "master"}}} , {snappy, "1.0.*", {git, "git://github.com/fdmanana/snappy-erlang-nif.git", {branch, "master"}}} , {plain_fsm, "1.1.*", {git, "git://github.com/gburd/plain_fsm", {branch, "master"}}} + , {basho_bench, ".*", {git, "git://github.com/basho/basho_bench", {branch, "master"}}} + , {triq, ".*", {git, "git://github.com/krestenkrab/triq", {branch, "master"}}} % , {lz4, ".*", {git, "git://github.com/gburd/erlang-lz4.git", {branch, "master"}}} % , {edown, "0.3.*", {git, "git://github.com/esl/edown.git", {branch, "master"}}} % , {asciiedoc, "0.1.*", {git, "git://github.com/norton/asciiedoc.git", {branch, "master"}}} diff --git a/src/basho_bench_driver_hanoidb.erl b/src/basho_bench_driver_hanoidb.erl new file mode 100644 index 0000000..5844d54 --- /dev/null +++ b/src/basho_bench_driver_hanoidb.erl @@ -0,0 +1,121 @@ +%% ---------------------------------------------------------------------------- +%% +%% hanoidb: LSM-trees (Log-Structured Merge Trees) Indexed Storage +%% +%% Copyright 2011-2012 (c) Trifork A/S. All Rights Reserved. +%% http://trifork.com/ info@trifork.com +%% +%% Copyright 2012 (c) Basho Technologies, Inc. All Rights Reserved. +%% http://basho.com/ info@basho.com +%% +%% This file is provided to you under the Apache License, Version 2.0 (the +%% "License"); you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +%% License for the specific language governing permissions and limitations +%% under the License. +%% +%% ---------------------------------------------------------------------------- + +-module(basho_bench_driver_hanoidb). + +-record(state, { tree, + filename, + flags, + sync_interval, + last_sync }). + +-export([new/1, + run/4]). + +-include("hanoidb.hrl"). +-include_lib("basho_bench/include/basho_bench.hrl"). + +-record(key_range, { from_key = <<>> :: binary(), + from_inclusive = true :: boolean(), + to_key :: binary() | undefined, + to_inclusive = false :: boolean(), + limit :: pos_integer() | undefined }). + +%% ==================================================================== +%% API +%% ==================================================================== + +new(_Id) -> + %% Make sure bitcask is available + case code:which(hanoidb) of + non_existing -> + ?FAIL_MSG("~s requires hanoidb to be available on code path.\n", + [?MODULE]); + _ -> + ok + end, + + %% Get the target directory + Dir = basho_bench_config:get(hanoidb_dir, "."), + Filename = filename:join(Dir, "test.hanoidb"), + Config = basho_bench_config:get(hanoidb_flags, []), + + %% Look for sync interval config + case basho_bench_config:get(hanoidb_sync_interval, infinity) of + Value when is_integer(Value) -> + SyncInterval = Value; + infinity -> + SyncInterval = infinity + end, + + %% Get any bitcask flags + case hanoidb:open(Filename, Config) of + {error, Reason} -> + ?FAIL_MSG("Failed to open hanoidb in ~s: ~p\n", [Filename, Reason]); + {ok, FBTree} -> + {ok, #state { tree = FBTree, + filename = Filename, + sync_interval = SyncInterval, + last_sync = os:timestamp() }} + end. + +run(get, KeyGen, _ValueGen, State) -> + case hanoidb:lookup(State#state.tree, KeyGen()) of + {ok, _Value} -> + {ok, State}; + not_found -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end; +run(put, KeyGen, ValueGen, State) -> + case hanoidb:put(State#state.tree, KeyGen(), ValueGen()) of + ok -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end; +run(delete, KeyGen, _ValueGen, State) -> + case hanoidb:delete(State#state.tree, KeyGen()) of + ok -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end; + +run(fold_100, KeyGen, _ValueGen, State) -> + [From,To] = lists:usort([KeyGen(), KeyGen()]), + case hanoidb:sync_fold_range(State#state.tree, + fun(_Key,_Value,Count) -> + Count+1 + end, + 0, + #key_range{ from_key=From, + to_key=To, + limit=100 }) of + Count when Count >= 0; Count =< 100 -> + {ok,State}; + Count -> + {error, {bad_fold_count, Count}} + end. diff --git a/test/hanoidb_merger_tests.erl b/test/hanoidb_merger_tests.erl index 69b8a80..45ee773 100644 --- a/test/hanoidb_merger_tests.erl +++ b/test/hanoidb_merger_tests.erl @@ -27,7 +27,6 @@ -ifdef(QC_PROPER). -ifdef(TEST). --include_lib("proper/include/proper.hrl"). -include_lib("eunit/include/eunit.hrl"). -endif. diff --git a/test/hanoidb_tests.erl b/test/hanoidb_tests.erl index 8a8750d..2e7f088 100644 --- a/test/hanoidb_tests.erl +++ b/test/hanoidb_tests.erl @@ -49,9 +49,9 @@ next_state/3, postcondition/3, precondition/2]). --record(tree, { elements = dict:new() }). --record(state, { open = dict:new(), - closed = dict:new() }). +-record(tree, { elements = dict:new() :: dict() }). +-record(state, { open = dict:new() :: dict(), + closed = dict:new() :: dict()}). -define(SERVER, hanoidb_drv). full_test_() ->