2012-04-19 22:09:01 +00:00
|
|
|
%% ----------------------------------------------------------------------------
|
|
|
|
%%
|
2012-05-07 15:22:55 +00:00
|
|
|
%% hanoidb: LSM-trees (Log-Structured Merge Trees) Indexed Storage
|
2012-04-19 22:09:01 +00:00
|
|
|
%%
|
|
|
|
%% 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.
|
|
|
|
%%
|
|
|
|
%% ----------------------------------------------------------------------------
|
|
|
|
|
2012-05-07 15:22:55 +00:00
|
|
|
-module(hanoidb_writer_tests).
|
2012-01-06 21:56:23 +00:00
|
|
|
|
|
|
|
-ifdef(TEST).
|
2012-07-24 20:39:28 +00:00
|
|
|
-ifdef(TEST).
|
|
|
|
-ifdef(TRIQ).
|
|
|
|
-include_lib("triq/include/triq.hrl").
|
|
|
|
-include_lib("triq/include/triq_statem.hrl").
|
|
|
|
-else.
|
2012-01-06 21:56:23 +00:00
|
|
|
-include_lib("proper/include/proper.hrl").
|
2012-07-24 20:39:28 +00:00
|
|
|
-endif.
|
2012-01-06 21:56:23 +00:00
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
-endif.
|
|
|
|
|
2012-07-24 20:39:28 +00:00
|
|
|
-ifdef(PROPER).
|
|
|
|
-behaviour(proper_statem).
|
|
|
|
-endif.
|
|
|
|
-endif.
|
|
|
|
|
2012-05-07 15:22:55 +00:00
|
|
|
-include("include/hanoidb.hrl").
|
2012-04-28 16:35:35 +00:00
|
|
|
|
2012-01-06 21:56:23 +00:00
|
|
|
-compile(export_all).
|
|
|
|
|
|
|
|
simple_test() ->
|
|
|
|
|
2012-04-28 16:35:35 +00:00
|
|
|
file:delete("testdata"),
|
2012-05-07 15:22:55 +00:00
|
|
|
{ok, BT} = hanoidb_writer:open("testdata"),
|
|
|
|
ok = hanoidb_writer:add(BT, <<"A">>, <<"Avalue">>),
|
|
|
|
ok = hanoidb_writer:add(BT, <<"B">>, <<"Bvalue">>),
|
|
|
|
ok = hanoidb_writer:close(BT),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
2012-05-07 15:22:55 +00:00
|
|
|
{ok, IN} = hanoidb_reader:open("testdata"),
|
|
|
|
{ok, <<"Avalue">>} = hanoidb_reader:lookup(IN, <<"A">>),
|
|
|
|
ok = hanoidb_reader:close(IN),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
|
|
|
ok = file:delete("testdata").
|
|
|
|
|
|
|
|
|
|
|
|
simple1_test() ->
|
|
|
|
|
2012-04-28 16:35:35 +00:00
|
|
|
file:delete("testdata"),
|
2014-11-28 15:22:20 +00:00
|
|
|
{ok, BT} = hanoidb_writer:open("testdata", [{block_size, 102},{expiry_secs, 0}]),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
2014-11-28 15:22:20 +00:00
|
|
|
Max = 102,
|
2012-01-06 21:56:23 +00:00
|
|
|
Seq = lists:seq(0, Max),
|
|
|
|
|
|
|
|
{Time1,_} = timer:tc(
|
|
|
|
fun() ->
|
|
|
|
lists:foreach(
|
|
|
|
fun(Int) ->
|
2012-05-07 15:22:55 +00:00
|
|
|
ok = hanoidb_writer:add(BT, <<Int:128>>, <<"valuevalue/", Int:128>>)
|
2012-01-06 21:56:23 +00:00
|
|
|
end,
|
|
|
|
Seq),
|
2012-05-07 15:22:55 +00:00
|
|
|
ok = hanoidb_writer:close(BT)
|
2012-01-06 21:56:23 +00:00
|
|
|
end,
|
|
|
|
[]),
|
|
|
|
|
2014-11-28 15:22:20 +00:00
|
|
|
error_logger:info_msg("time to insert: ~p/sec~n", [1000000/(Time1/Max)]),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
Refactor for expiry_secs option
Tree nodes now hold entries at the form
{Key, ?TOMBSTONE
| BinValue
| {?TOMBSTONE, TStamp}
| {BinValue, TStamp}}
We use the form without TStamp when expiry_secs
is unset or set to 0 (i.e., values don't expire).
merger/writer: Move KV count into writer, because
now the writer:add determines if a value is expired
and thus wither a value is actually written. Thus,
writer now has a new API function which returns the
KV count written so far.
reader: lookup/fold API hides the TStamp tuples,
so only the next_node API used by the merger
is exposed to these {Key, {_, TStamp}} entries.
nursery: like reader, the TStamp'ed tuples are
not exposed in the client API; expired values
are simply not returned from fold/lookup.
hanoidb: add config option {expiry_secs, N}.
other modules: Make sure that config is passed
all the way down through (sub) processes to be
able to utilize the config option everywhere.
test: update to work with new option.
2012-05-11 10:00:32 +00:00
|
|
|
{ok, IN} = hanoidb_reader:open("testdata", [{expiry_secs,0}]),
|
2012-04-28 16:35:35 +00:00
|
|
|
Middle = Max div 2,
|
2014-11-28 15:22:20 +00:00
|
|
|
io:format("LOOKING UP ~p~n", [<<Middle:128>>]),
|
2012-05-07 15:22:55 +00:00
|
|
|
{ok, <<"valuevalue/", Middle:128>>} = hanoidb_reader:lookup(IN, <<Middle:128>>),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
{Time2,Count} = timer:tc(
|
2014-11-28 15:22:20 +00:00
|
|
|
fun() -> hanoidb_reader:fold(fun(_Key, <<"valuevalue/", N:128>>, N) ->
|
2012-01-06 21:56:23 +00:00
|
|
|
N+1
|
|
|
|
end,
|
|
|
|
0,
|
|
|
|
IN)
|
|
|
|
end,
|
|
|
|
[]),
|
|
|
|
|
2014-11-28 15:22:20 +00:00
|
|
|
io:format("time to scan: ~p/sec~n", [1000000/(Time2 div Max)]),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
|
|
|
Max = Count-1,
|
|
|
|
|
2012-04-28 16:35:35 +00:00
|
|
|
{Time3,{done,Count2}} = timer:tc(
|
2014-11-28 15:22:20 +00:00
|
|
|
fun() -> hanoidb_reader:range_fold(fun(_Key, <<"valuevalue/", N:128>>, N) ->
|
|
|
|
% io:format("[~p]~n", N),
|
2012-04-28 16:35:35 +00:00
|
|
|
N+1
|
|
|
|
end,
|
|
|
|
0,
|
|
|
|
IN,
|
2012-05-07 15:22:55 +00:00
|
|
|
#key_range{ from_key= <<>>, to_key=undefined })
|
2012-04-28 16:35:35 +00:00
|
|
|
end,
|
|
|
|
[]),
|
2012-01-06 21:56:23 +00:00
|
|
|
|
2012-04-28 16:35:35 +00:00
|
|
|
|
2014-11-28 15:22:20 +00:00
|
|
|
|
|
|
|
%error_logger:info_msg("time to range_fold: ~p/sec~n", [1000000/(Time3 div Max)]),
|
|
|
|
|
|
|
|
io:format("count2=~p~n", [Count2]),
|
2012-04-28 16:35:35 +00:00
|
|
|
|
|
|
|
Max = Count2-1,
|
|
|
|
|
2012-05-07 15:22:55 +00:00
|
|
|
ok = hanoidb_reader:close(IN).
|
2012-01-06 21:56:23 +00:00
|
|
|
|