2016-11-17 08:20:12 +00:00
|
|
|
%% -------------------------------------------------------------------
|
|
|
|
%%
|
|
|
|
%% Copyright (c) 2015 Basho Techonologies
|
|
|
|
%%
|
|
|
|
%% 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.
|
|
|
|
%%
|
|
|
|
%% -------------------------------------------------------------------
|
|
|
|
|
|
|
|
%% Raw eleveldb driver. It opens a number of eleveldb instances and assigns
|
|
|
|
%% one to each created worker in round robin fashion. So, for example, creating
|
|
|
|
%% 32 instances and 64 concurrent workers would bind a pair of workers to
|
|
|
|
%% each instance for all operations.
|
|
|
|
-module(basho_bench_driver_eleveleddb).
|
|
|
|
|
|
|
|
-export([new/1,
|
|
|
|
run/4]).
|
|
|
|
|
2016-11-17 15:55:29 +00:00
|
|
|
% -include("basho_bench.hrl").
|
2016-11-17 08:20:12 +00:00
|
|
|
|
|
|
|
-record(state, {
|
|
|
|
instance
|
|
|
|
}).
|
|
|
|
|
|
|
|
get_instances() ->
|
|
|
|
case basho_bench_config:get(eleveleddb_instances, undefined) of
|
|
|
|
undefined ->
|
|
|
|
Instances = start_instances(),
|
2016-11-17 15:55:29 +00:00
|
|
|
% ?INFO("Instances started ~w~n", [Instances]),
|
2016-11-17 08:20:12 +00:00
|
|
|
basho_bench_config:set(eleveleddb_instances, Instances),
|
|
|
|
Instances;
|
|
|
|
Instances ->
|
|
|
|
Instances
|
|
|
|
end.
|
|
|
|
|
|
|
|
|
|
|
|
start_instances() ->
|
|
|
|
BaseDir = basho_bench_config:get(eleveleddb_dir, "."),
|
|
|
|
Num = basho_bench_config:get(eleveleddb_num_instances, 1),
|
2016-11-17 15:55:29 +00:00
|
|
|
% ?INFO("Starting up ~p eleveleddb instances under ~s .\n",
|
|
|
|
% [Num, BaseDir]),
|
2016-11-17 08:20:12 +00:00
|
|
|
Refs = [begin
|
|
|
|
Dir = filename:join(BaseDir, "instance." ++ integer_to_list(N)),
|
2016-11-17 15:55:29 +00:00
|
|
|
% ?INFO("Opening eleveleddb instance in ~s\n", [Dir]),
|
2016-11-17 08:20:12 +00:00
|
|
|
{ok, Ref} = leveled_bookie:book_start(Dir, 2000, 500000000),
|
|
|
|
Ref
|
|
|
|
end || N <- lists:seq(1, Num)],
|
|
|
|
list_to_tuple(Refs).
|
|
|
|
|
|
|
|
new(Id) ->
|
|
|
|
Instances = get_instances(),
|
|
|
|
Count = size(Instances),
|
|
|
|
Idx = ((Id - 1) rem Count) + 1,
|
2016-11-17 15:55:29 +00:00
|
|
|
% ?INFO("Worker ~p using instance ~p.\n", [Id, Idx]),
|
2016-11-17 08:20:12 +00:00
|
|
|
State = #state{instance = element(Idx, Instances)},
|
|
|
|
{ok, State}.
|
|
|
|
|
|
|
|
|
|
|
|
run(get, KeyGen, _ValueGen, State = #state{instance = Ref}) ->
|
|
|
|
Key = KeyGen(),
|
|
|
|
case leveled_bookie:book_get(Ref, "PerfBucket", Key, o) of
|
|
|
|
{ok, _Value} ->
|
|
|
|
{ok, State};
|
|
|
|
not_found ->
|
|
|
|
{ok, State};
|
|
|
|
{error, Reason} ->
|
|
|
|
{error, Reason}
|
|
|
|
end;
|
|
|
|
run(put, KeyGen, ValGen, State = #state{instance = Ref}) ->
|
|
|
|
Key = KeyGen(),
|
|
|
|
Value = ValGen(),
|
|
|
|
case leveled_bookie:book_put(Ref, "PerfBucket", Key, Value, []) of
|
|
|
|
ok ->
|
|
|
|
{ok, State};
|
|
|
|
pause ->
|
|
|
|
timer:sleep(1000),
|
|
|
|
{ok, State};
|
|
|
|
{error, Reason} ->
|
|
|
|
{error, Reason}
|
|
|
|
end.
|
|
|
|
|
|
|
|
|