Extend mergefile_selector for strategy

Strategy only applied below L1, and only random strategy supported
This commit is contained in:
Martin Sumner 2020-03-26 14:18:57 +00:00
parent aaf58dd343
commit 4ef0f4006d
2 changed files with 9 additions and 7 deletions

View file

@ -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,

View file

@ -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)).