From d5b4cb844fb6d6bfe4727aa5792e0ee47c9d932c Mon Sep 17 00:00:00 2001 From: martinsumner Date: Mon, 19 Jun 2017 18:38:55 +0100 Subject: [PATCH] Finding keys Progresses from a segment list to scanning for the keys in that segment --- src/leveled_tictac.erl | 10 ++++++---- test/end_to_end/tictac_SUITE.erl | 28 +++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/leveled_tictac.erl b/src/leveled_tictac.erl index 3463a81..b1e5846 100644 --- a/src/leveled_tictac.erl +++ b/src/leveled_tictac.erl @@ -61,7 +61,8 @@ find_dirtysegments/2, fetch_root/1, fetch_leaves/2, - merge_trees/2 + merge_trees/2, + get_segment/1 ]). @@ -200,6 +201,10 @@ merge_trees(TreeA, TreeB) -> MergedTree#tictactree{level1 = NewLevel1, level2 = NewLevel2}. +get_segment(Key) -> + erlang:phash2(Key) band (?SEGMENT_COUNT - 1). + + %%%============================================================================ %%% Internal functions %%%============================================================================ @@ -219,9 +224,6 @@ segmentcompare(SrcBin, SnkBin, Acc, Counter) -> segmentcompare(SrcTail, SnkTail, [Counter|Acc], Counter + 1) end. -get_segment(Key) -> - erlang:phash2(Key) band (?SEGMENT_COUNT - 1). - merge_binaries(BinA, BinB) -> BitSize = bit_size(BinA), BitSize = bit_size(BinB), diff --git a/test/end_to_end/tictac_SUITE.erl b/test/end_to_end/tictac_SUITE.erl index 819c8b1..6230dc9 100644 --- a/test/end_to_end/tictac_SUITE.erl +++ b/test/end_to_end/tictac_SUITE.erl @@ -92,7 +92,33 @@ many_put_compare(_Config) -> true = length(SegList0) == 1, % only the test object should be different true = length(AltList) > 100000, - % check there are a significant number fo differences from empty + % check there are a significant number of differences from empty + + FoldKeysFun = + fun(SegListToFind) -> + fun(_B, K, Acc) -> + Seg = leveled_tictac:get_segment(K), + case lists:member(Seg, SegListToFind) of + true -> + [K|Acc]; + false -> + Acc + end + end + end, + SegQuery = {keylist, o_rkv, "Bucket", {FoldKeysFun(SegList0), []}}, + {async, SegKeyFinder} = + leveled_bookie:book_returnfolder(Bookie2, SegQuery), + SWSKL0 = os:timestamp(), + SegKeyList = SegKeyFinder(), + io:format("Finding ~w keys in ~w dirty segments in ~w~n", + [length(SegKeyList), + length(SegList0), + timer:now_diff(os:timestamp(), SWSKL0)]), + + true = length(SegKeyList) >= 1, + true = length(SegKeyList) < 10, + true = lists:member("Key1.1.4567.4321", SegKeyList), % Now remove the object which represents the difference between these % stores and confirm that the tictac trees will now match