diff --git a/tools/basho_bench_driver_wterl.erl b/tools/basho_bench_driver_wterl.erl new file mode 100644 index 0000000..bdc6eb3 --- /dev/null +++ b/tools/basho_bench_driver_wterl.erl @@ -0,0 +1,91 @@ +-module(basho_bench_driver_wterl). + +-record(state, { connection, uri }). + +-export([new/1, + run/4]). + +-include_lib("basho_bench/include/basho_bench.hrl"). + + +%% ==================================================================== +%% API +%% ==================================================================== + +new(1) -> + %% Make sure wterl is available + case code:which(wterl) of + non_existing -> + ?FAIL_MSG("~s requires wterl to be available on code path.\n", + [?MODULE]); + _ -> + ok + end, + {ok, _} = wterl_sup:start_link(), + setup(1); +new(Id) -> + setup(Id). + +setup(_Id) -> + %% Get the target directory + Dir = basho_bench_config:get(wterl_dir, "/tmp"), + Config = basho_bench_config:get(wterl, []), + Uri = config_value(table_uri, Config, "lsm:test"), + ConnectionOpts = config_value(connection, Config, [{create, true}]), + SessionOpts = config_value(session, Config, []), + TableOpts = config_value(table, Config, []), + + %% Start WiredTiger + Connection = + case wterl_conn:is_open() of + false -> + case wterl_conn:open(Dir, ConnectionOpts, SessionOpts) of + {ok, Conn} -> + Conn; + {error, Reason0} -> + ?FAIL_MSG("Failed to establish a WiredTiger connection, wterl backend unable to start: ~p\n", [Reason0]) + end; + true -> + {ok, Conn} = wterl_conn:get(), + Conn + end, + case wterl:create(Connection, Uri, TableOpts) of + ok -> + {ok, #state{connection=Connection, uri=Uri}}; + {error, Reason} -> + {error, Reason} + end. + +run(get, KeyGen, _ValueGen, #state{connection=Connection, uri=Uri}=State) -> + case wterl:get(Connection, Uri, KeyGen()) of + {ok, _Value} -> + {ok, State}; + not_found -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end; +run(put, KeyGen, ValueGen, #state{connection=Connection, uri=Uri}=State) -> + case wterl:put(Connection, Uri, KeyGen(), ValueGen()) of + ok -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end; +run(delete, KeyGen, _ValueGen, #state{connection=Connection, uri=Uri}=State) -> + case wterl:delete(Connection, Uri, KeyGen()) of + ok -> + {ok, State}; + not_found -> + {ok, State}; + {error, Reason} -> + {error, Reason} + end. + +config_value(Key, Config, Default) -> + case proplists:get_value(Key, Config) of + undefined -> + Default; + Value -> + Value + end. diff --git a/tools/wterl-b_b.config b/tools/wterl-b_b.config new file mode 100644 index 0000000..2a89f99 --- /dev/null +++ b/tools/wterl-b_b.config @@ -0,0 +1,97 @@ +%%-*- mode: erlang -*- +%% ex: ft=erlang ts=4 sw=4 et + +%% How to: +%% * put the wterl-b_b.config file into basho_bench/examples +%% * put the basho_bench_driver_wterl.erl into basho_bench/src +%% * make clean in basho_bench, then make +%% * edit examples/wterl-b_b.config +%% - change {code_paths, ["../wterl"]}. to be a relative path to your +%% wterl directory +%% - change {wterl_dir, "/home/gburd/ws/basho_bench/data"}. to a fully +%% qualified location for your test data files (mkdir that directory +%% yourself, if it doesn't exist the test will fail 'enoent') +%% * to run, replace this path with the proper path on your system: +%% LD_LIBRARY_PATH=/home/you/wterl/priv ./basho_bench examples/wterl-b_b.config +%% * the test should run for 10 minutes (as it is configured right now) +%% with 4 concurrent workers accessing the same table +%% +%% Note: +%% There are two config sections in wt.config {wterl, [ ... ]}. and +%% {wterl_, [ ... ]}. The one being used is named "wterl" the other +%% config is ignored. I setup an LSM and BTREE config and to choose +%% which is run you just rename those two sections (turn one off by +%% adding a "_" to the name and take the "_" out of the other's name). + +{mode, max}. +{duration, 10}. +{concurrent, 4}. +{driver, basho_bench_driver_wterl}. +{key_generator, {int_to_bin_littleendian,{uniform_int, 5000000}}}. +{value_generator, {fixed_bin, 10000}}. +{operations, [{get, 4}, {put, 4}, {delete, 2}]}. +{code_paths, ["../wterl"]}. +{wterl_dir, "/home/gburd/ws/basho_bench/data"}. + +%% lsm +{wterl, [ + {connection, [ + {create, true}, + {sync, false}, + {logging, true}, + {transactional, true}, + {session_max, 1024}, + {cache_size, 4294967296}, + {verbose, []}, + % "salvage", "verify" are okay, however... + % for some unknown reason, if you add these additional + % verbose flags Erlang SEGV's "size_object: bad tag for 0x80" + % no idea why... yet... you've been warned. + %"block", "shared_cache", "reconcile", "evict", "lsm", + %"fileops", "read", "write", "readserver", "evictserver", + %"hazard", "mutex", "ckpt" + {statistics_log, [{wait, 30}]} + ]}, + {session, [ {isolation, "snapshot"} ]}, + {table_uri, "lsm:test"}, + {table, [ + {internal_page_max, "128K"}, + {leaf_page_max, "128K"}, + {lsm_chunk_size, "25MB"}, + {prefix_compression, false}, + {lsm_bloom_newest, true}, + {lsm_bloom_oldest, true} , + {lsm_bloom_bit_count, 128}, + {lsm_bloom_hash_count, 64}, + {lsm_bloom_config, [{leaf_page_max, "8MB"}]}, + {block_compressor, "snappy"} % bzip2 + ]} + ]}. + +%% btree +{wterl_, [ + {connection, [ + {create, true}, + {sync, false}, + {logging, true}, + {transactional, true}, + {session_max, 1024}, + {cache_size, 4294967296}, + {verbose, []}, + % "salvage", "verify" are okay, however... + % for some unknown reason, if you add these additional + % verbose flags Erlang SEGV's "size_object: bad tag for 0x80" + % no idea why... yet... you've been warned. + %"block", "shared_cache", "reconcile", "evict", "lsm", + %"fileops", "read", "write", "readserver", "evictserver", + %"hazard", "mutex", "ckpt" + {statistics_log, [{wait, 30}]}, + {checkpoint, [{await, 10}]} + ]}, + {session, [ {isolation, "snapshot"} ]}, + {table_uri, "table:test"}, + {table, [ + {prefix_compression, false}, + {block_compressor, "snappy"} % bzip2 + ]} + ]}.