Extend mergefile_selector for strategy
Strategy only applied below L1, and only random strategy supported
This commit is contained in:
parent
aaf58dd343
commit
4ef0f4006d
2 changed files with 9 additions and 7 deletions
|
@ -183,7 +183,7 @@ merge(SrcLevel, Manifest, RootPath, OptsSST) ->
|
||||||
leveled_log:log("PC023",
|
leveled_log:log("PC023",
|
||||||
[SrcLevel + 1, FCnt, AvgMem, MaxFN, MaxP, MaxMem])
|
[SrcLevel + 1, FCnt, AvgMem, MaxFN, MaxP, MaxMem])
|
||||||
end,
|
end,
|
||||||
Src = leveled_pmanifest:mergefile_selector(Manifest, SrcLevel),
|
Src = leveled_pmanifest:mergefile_selector(Manifest, SrcLevel, random),
|
||||||
NewSQN = leveled_pmanifest:get_manifest_sqn(Manifest) + 1,
|
NewSQN = leveled_pmanifest:get_manifest_sqn(Manifest) + 1,
|
||||||
SinkList = leveled_pmanifest:merge_lookup(Manifest,
|
SinkList = leveled_pmanifest:merge_lookup(Manifest,
|
||||||
SrcLevel + 1,
|
SrcLevel + 1,
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
remove_manifest_entry/4,
|
remove_manifest_entry/4,
|
||||||
replace_manifest_entry/5,
|
replace_manifest_entry/5,
|
||||||
switch_manifest_entry/4,
|
switch_manifest_entry/4,
|
||||||
mergefile_selector/2,
|
mergefile_selector/3,
|
||||||
add_snapshot/3,
|
add_snapshot/3,
|
||||||
release_snapshot/2,
|
release_snapshot/2,
|
||||||
merge_snapshot/2,
|
merge_snapshot/2,
|
||||||
|
@ -82,6 +82,7 @@
|
||||||
-type manifest() :: #manifest{}.
|
-type manifest() :: #manifest{}.
|
||||||
-type manifest_entry() :: #manifest_entry{}.
|
-type manifest_entry() :: #manifest_entry{}.
|
||||||
-type manifest_owner() :: pid()|list().
|
-type manifest_owner() :: pid()|list().
|
||||||
|
-type selector_strategy() :: random.
|
||||||
|
|
||||||
-export_type([manifest/0, manifest_entry/0, manifest_owner/0]).
|
-export_type([manifest/0, manifest_entry/0, manifest_owner/0]).
|
||||||
|
|
||||||
|
@ -429,7 +430,8 @@ merge_lookup(Manifest, LevelIdx, StartKey, EndKey) ->
|
||||||
range_lookup_int(Manifest, LevelIdx, StartKey, EndKey, MakePointerFun).
|
range_lookup_int(Manifest, LevelIdx, StartKey, EndKey, MakePointerFun).
|
||||||
|
|
||||||
|
|
||||||
-spec mergefile_selector(manifest(), integer()) -> manifest_entry().
|
-spec mergefile_selector(manifest(), integer(), selector_strategy())
|
||||||
|
-> manifest_entry().
|
||||||
%% @doc
|
%% @doc
|
||||||
%% An algorithm for discovering which files to merge ....
|
%% An algorithm for discovering which files to merge ....
|
||||||
%% We can find the most optimal file:
|
%% We can find the most optimal file:
|
||||||
|
@ -441,10 +443,10 @@ merge_lookup(Manifest, LevelIdx, StartKey, EndKey) ->
|
||||||
%% genuinely better - eventually every file has to be compacted.
|
%% genuinely better - eventually every file has to be compacted.
|
||||||
%%
|
%%
|
||||||
%% Hence, the initial implementation is to select files to merge at random
|
%% Hence, the initial implementation is to select files to merge at random
|
||||||
mergefile_selector(Manifest, LevelIdx) when LevelIdx =< 1 ->
|
mergefile_selector(Manifest, LevelIdx, _Strategy) when LevelIdx =< 1 ->
|
||||||
Level = array:get(LevelIdx, Manifest#manifest.levels),
|
Level = array:get(LevelIdx, Manifest#manifest.levels),
|
||||||
lists:nth(leveled_rand:uniform(length(Level)), Level);
|
lists:nth(leveled_rand:uniform(length(Level)), Level);
|
||||||
mergefile_selector(Manifest, LevelIdx) ->
|
mergefile_selector(Manifest, LevelIdx, random) ->
|
||||||
Level = leveled_tree:to_list(array:get(LevelIdx,
|
Level = leveled_tree:to_list(array:get(LevelIdx,
|
||||||
Manifest#manifest.levels)),
|
Manifest#manifest.levels)),
|
||||||
{_SK, ME} = lists:nth(leveled_rand:uniform(length(Level)), Level),
|
{_SK, ME} = lists:nth(leveled_rand:uniform(length(Level)), Level),
|
||||||
|
@ -1057,10 +1059,10 @@ changeup_setup(Man6) ->
|
||||||
random_select_test() ->
|
random_select_test() ->
|
||||||
ManTuple = initial_setup(),
|
ManTuple = initial_setup(),
|
||||||
LastManifest = element(7, ManTuple),
|
LastManifest = element(7, ManTuple),
|
||||||
L1File = mergefile_selector(LastManifest, 1),
|
L1File = mergefile_selector(LastManifest, 1, random),
|
||||||
% This blows up if the function is not prepared for the different format
|
% This blows up if the function is not prepared for the different format
|
||||||
% https://github.com/martinsumner/leveled/issues/43
|
% https://github.com/martinsumner/leveled/issues/43
|
||||||
_L2File = mergefile_selector(LastManifest, 2),
|
_L2File = mergefile_selector(LastManifest, 2, random),
|
||||||
Level1 = array:get(1, LastManifest#manifest.levels),
|
Level1 = array:get(1, LastManifest#manifest.levels),
|
||||||
?assertMatch(true, lists:member(L1File, Level1)).
|
?assertMatch(true, lists:member(L1File, Level1)).
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue