Add check for too-small trees

Provide a function for generating segmentfilter lists so that it can handle trees that are "too small".

Test those smaller trees - plus also false positives and cold caches
This commit is contained in:
Martin Sumner 2017-11-01 13:18:01 +00:00
parent 6099dd1367
commit 033cf1954d
2 changed files with 74 additions and 13 deletions

View file

@ -68,7 +68,8 @@
export_tree/1,
import_tree/1,
valid_size/1,
keyto_segment32/1
keyto_segment32/1,
generate_segmentfilter_list/2
]).
@ -76,13 +77,11 @@
-define(HASH_SIZE, 4).
-define(XXSMALL, {6, 64, 64 * 64}). % DO NOT USE
-define(XSMALL, {7, 128, 128 * 128}). % DO NOT USE
%% DO NOT USE warnings with smaller key sizes are there as accelerated queries
%% for finding segment lists will not work where the tree size is smaller than
%% 2 ^ 15
%% UNSUUPPORTED tree sizes for accelerated segment filtering
-define(XXSMALL, {6, 64, 64 * 64}).
-define(XSMALL, {7, 128, 128 * 128}).
%% SUPPORTED tree sizes
%% SUPPORTED tree sizes for accelerated segment filtering
-define(SMALL, {8, 256, 256 * 256}).
-define(MEDIUM, {9, 512, 512 * 512}).
-define(LARGE, {10, 1024, 1024 * 1024}).
@ -343,6 +342,32 @@ keyto_segment32(BinKey) when is_binary(BinKey) ->
keyto_segment32(Key) ->
keyto_segment32(term_to_binary(Key)).
-spec generate_segmentfilter_list(list(integer()), atom())
-> false|list(integer()).
%% @doc
%% Cannot accelerate segment listing for trees below certain sizes, so check
%% the creation of segment filter lists with this function
generate_segmentfilter_list(_SegmentList, xxsmall) ->
false;
generate_segmentfilter_list(SegmentList, xsmall) ->
case length(SegmentList) =< 4 of
true ->
A0 = 1 bsl 15,
A1 = 1 bsl 14,
ExpandSegFun =
fun(X, Acc) ->
Acc ++ [X, X + A0, X + A1, X + A0 + A1]
end,
lists:foldl(ExpandSegFun, [], SegmentList);
false ->
false
end;
generate_segmentfilter_list(SegmentList, Size) ->
case lists:member(Size, ?VALID_SIZES) of
true ->
SegmentList
end.
%%%============================================================================
%%% Internal functions
%%%============================================================================