Set max limit of 24 hours on cached score

This commit is contained in:
Martin Sumner 2020-11-27 13:56:47 +00:00
parent be562c85cb
commit bcc331da10
2 changed files with 33 additions and 11 deletions

View file

@ -114,7 +114,7 @@
cdb_deletepending/3, cdb_deletepending/3,
cdb_isrolling/1, cdb_isrolling/1,
cdb_clerkcomplete/1, cdb_clerkcomplete/1,
cdb_getcachedscore/1, cdb_getcachedscore/2,
cdb_putcachedscore/2]). cdb_putcachedscore/2]).
-export([finished_rolling/1, -export([finished_rolling/1,
@ -135,6 +135,8 @@
-define(GETPOS_FACTOR, 8). -define(GETPOS_FACTOR, 8).
-define(MAX_OBJECT_SIZE, 1000000000). -define(MAX_OBJECT_SIZE, 1000000000).
% 1GB but really should be much smaller than this % 1GB but really should be much smaller than this
-define(MEGA, 1000000).
-define(CACHE_LIFE, 86400).
-record(state, {hashtree, -record(state, {hashtree,
last_position :: integer() | undefined, last_position :: integer() | undefined,
@ -155,7 +157,7 @@
timings_countdown = 0 :: integer(), timings_countdown = 0 :: integer(),
log_options = leveled_log:get_opts() log_options = leveled_log:get_opts()
:: leveled_log:log_options(), :: leveled_log:log_options(),
cached_score :: float()|undefined}). cached_score :: {float(), erlang:timestamp()}|undefined}).
-record(cdb_timings, {sample_count = 0 :: integer(), -record(cdb_timings, {sample_count = 0 :: integer(),
sample_cyclecount = 0 :: integer(), sample_cyclecount = 0 :: integer(),
@ -430,11 +432,11 @@ cdb_isrolling(Pid) ->
cdb_clerkcomplete(Pid) -> cdb_clerkcomplete(Pid) ->
gen_fsm:send_all_state_event(Pid, clerk_complete). gen_fsm:send_all_state_event(Pid, clerk_complete).
-spec cdb_getcachedscore(pid()) -> undefined|float(). -spec cdb_getcachedscore(pid(), erlang:timestamp()) -> undefined|float().
%% @doc %% @doc
%% Return the cached score for a CDB file %% Return the cached score for a CDB file
cdb_getcachedscore(Pid) -> cdb_getcachedscore(Pid, Now) ->
gen_fsm:sync_send_all_state_event(Pid, get_cachedscore, infinity). gen_fsm:sync_send_all_state_event(Pid, {get_cachedscore, Now}, infinity).
-spec cdb_putcachedscore(pid(), float()) -> ok. -spec cdb_putcachedscore(pid(), float()) -> ok.
@ -849,10 +851,24 @@ handle_sync_event(cdb_filename, _From, StateName, State) ->
{reply, State#state.filename, StateName, State}; {reply, State#state.filename, StateName, State};
handle_sync_event(cdb_isrolling, _From, StateName, State) -> handle_sync_event(cdb_isrolling, _From, StateName, State) ->
{reply, StateName == rolling, StateName, State}; {reply, StateName == rolling, StateName, State};
handle_sync_event(get_cachedscore, _From, StateName, State) -> handle_sync_event({get_cachedscore, {NowMega, NowSecs, _}},
{reply, State#state.cached_score, StateName, State}; _From, StateName, State) ->
ScoreToReturn =
case State#state.cached_score of
undefined ->
undefined;
{Score, {CacheMega, CacheSecs, _}} ->
case (NowMega * ?MEGA + NowSecs) >
(CacheMega * ?MEGA + CacheSecs + ?CACHE_LIFE) of
true ->
undefined;
false ->
Score
end
end,
{reply, ScoreToReturn, StateName, State};
handle_sync_event({put_cachedscore, Score}, _From, StateName, State) -> handle_sync_event({put_cachedscore, Score}, _From, StateName, State) ->
{reply, ok, StateName, State#state{cached_score = Score}}; {reply, ok, StateName, State#state{cached_score = {Score,os:timestamp()}}};
handle_sync_event(cdb_close, _From, delete_pending, State) -> handle_sync_event(cdb_close, _From, delete_pending, State) ->
leveled_log:log("CDB05", leveled_log:log("CDB05",
[State#state.filename, delete_pending, cdb_close]), [State#state.filename, delete_pending, cdb_close]),
@ -2419,9 +2435,15 @@ get_keys_byposition_manykeys_test_to() ->
SampleList3 = cdb_getpositions(P2, KeyCount + 1), SampleList3 = cdb_getpositions(P2, KeyCount + 1),
?assertMatch(KeyCount, length(SampleList3)), ?assertMatch(KeyCount, length(SampleList3)),
?assertMatch(undefined, cdb_getcachedscore(P2)), ?assertMatch(undefined, cdb_getcachedscore(P2, os:timestamp())),
ok = cdb_putcachedscore(P2, 80.0), ok = cdb_putcachedscore(P2, 80.0),
?assertMatch(80.0, cdb_getcachedscore(P2)), ?assertMatch(80.0, cdb_getcachedscore(P2, os:timestamp())),
timer:sleep(1000),
{NowMega, NowSecs, _} = Now = os:timestamp(),
?assertMatch(80.0, cdb_getcachedscore(P2, Now)),
FutureEpoch = NowMega * ?MEGA + NowSecs + ?CACHE_LIFE,
Future = {FutureEpoch div ?MEGA, FutureEpoch rem ?MEGA, 0},
?assertMatch(undefined, cdb_getcachedscore(P2, Future)),
ok = cdb_close(P2), ok = cdb_close(P2),
ok = file:delete(F2). ok = file:delete(F2).

View file

@ -330,7 +330,7 @@ handle_cast({score_filelist, [Entry|Tail]}, State) ->
{LowSQN, FN, JournalP, _LK} = Entry, {LowSQN, FN, JournalP, _LK} = Entry,
ScoringState = State#state.scoring_state, ScoringState = State#state.scoring_state,
CpctPerc = CpctPerc =
case {leveled_cdb:cdb_getcachedscore(JournalP), case {leveled_cdb:cdb_getcachedscore(JournalP, os:timestamp()),
leveled_rand:uniform(State#state.score_onein) == 1} of leveled_rand:uniform(State#state.score_onein) == 1} of
{CachedScore, UseNewScore} {CachedScore, UseNewScore}
when CachedScore == undefined; UseNewScore -> when CachedScore == undefined; UseNewScore ->