diff --git a/src/leveled_pclerk.erl b/src/leveled_pclerk.erl index 9f47df0..53f8cae 100644 --- a/src/leveled_pclerk.erl +++ b/src/leveled_pclerk.erl @@ -188,7 +188,7 @@ merge(SrcLevel, Manifest, RootPath, OptsSST) -> end, SelectMethod = case leveled_rand:uniform(100) of - R when R < ?GROOMING_PERC -> + R when R =< ?GROOMING_PERC -> {grooming, fun grooming_scorer/1}; _ -> random @@ -297,18 +297,23 @@ do_merge(KL1, KL2, SinkLevel, SinkB, RP, NewSQN, MaxSQN, OptsSST, Additions) -> end. -spec grooming_scorer(list(manifest_entry())) -> manifest_entry(). -grooming_scorer(Sample) -> - ScoringFun = - fun(ME) -> - TombCount = leveled_sst:sst_gettombcount(ME#manifest_entry.owner), - {TombCount, ME} - end, - ScoredSample = - lists:reverse(lists:ukeysort(1, lists:map(ScoringFun, Sample))), - [{HighestTC, BestME}|_Rest] = ScoredSample, +grooming_scorer([ME | MEs]) -> + InitTombCount = leveled_sst:sst_gettombcount(ME#manifest_entry.owner), + {HighestTC, BestME} = grooming_scorer(InitTombCount, ME, MEs), leveled_log:log("PC024", [HighestTC]), BestME. +grooming_scorer(HighestTC, BestME, []) -> + {HighestTC, BestME}; +grooming_scorer(HighestTC, BestME, [ME | MEs]) -> + TombCount = leveled_sst:sst_gettombcount(ME#manifest_entry.owner), + case TombCount > HighestTC of + true -> + grooming_scorer(TombCount, ME, MEs); + false -> + grooming_scorer(HighestTC, BestME, MEs) + end. + return_deletions(ManifestSQN, PendingDeletionD) -> % The returning of deletions had been seperated out as a failure to fetch % here had caased crashes of the clerk. The root cause of the failure to diff --git a/src/leveled_pmanifest.erl b/src/leveled_pmanifest.erl index 94c9c77..34df448 100644 --- a/src/leveled_pmanifest.erl +++ b/src/leveled_pmanifest.erl @@ -464,7 +464,8 @@ mergefile_selector(Manifest, LevelIdx, {grooming, ScoringFun}) -> Sample = lists:usort(lists:foldl(SelectorFun, [], lists:seq(1, ?GROOM_SAMPLE))), % Note that Entries may be less than GROOM_SAMPLE, if same one picked - % multiple times + % multiple times. Level cannot be empty, as otherwise a merge would not + % have been chosen at this level ScoringFun(Sample).