fix: get_memory_cache return {ok, Mem} | stale

This commit is contained in:
Zhongwen Deng 2023-02-01 16:00:55 +08:00
parent ced55719ef
commit 3c4d09a752
1 changed files with 22 additions and 18 deletions

View File

@ -27,14 +27,11 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
get_sys_memory() ->
Now = now_millisecond(),
{CacheMem, ExpiredAt} = get_memory_from_cache(),
case Now > ExpiredAt of
true ->
case get_memory_from_cache() of
{ok, CacheMem} ->
erlang:send(?MODULE, fresh_sys_memory),
CacheMem;
%% stale cache value, try to recalculate
false ->
stale ->
get_sys_memory_sync()
end.
@ -80,24 +77,31 @@ code_change(_OldVsn, State, _Extra) ->
fresh_sys_memory(State = #{fresh_at := LastFreshAt}) ->
Now = now_millisecond(),
{Mem, ExpiredAt} = get_memory_from_cache(),
case Now >= ExpiredAt orelse Now - LastFreshAt >= ?REFRESH_MS of
case Now - LastFreshAt >= ?REFRESH_MS of
true ->
%% NOTE: Now /= UpdateAt, because
%% load_ctl:get_sys_memory/0 maybe a heavy operation,
%% so record update_at timestamp after get_sys_memory/0.
do_fresh_sys_memory(Now, State);
false ->
case get_memory_from_cache() of
stale -> do_fresh_sys_memory(Now, State);
{ok, Mem} -> {Mem, State}
end
end.
do_fresh_sys_memory(FreshAt, State) ->
NewMem = load_ctl:get_sys_memory(),
NewExpiredAt = now_millisecond() + ?EXPIRED_MS,
ets:insert(?MODULE, {?SYS_MEMORY_KEY, {NewMem, NewExpiredAt}}),
{NewMem, State#{fresh_at => Now}};
false ->
{Mem, State}
end.
{NewMem, State#{fresh_at => FreshAt}}.
get_memory_from_cache() ->
case ets:lookup(?MODULE, ?SYS_MEMORY_KEY) of
[] -> {?DEFAULT_BAD_MEMORY, 0};
[{_, CacheVal}] -> CacheVal
[] ->
stale;
[{_, {Mem, ExpiredAt}}] ->
case now_millisecond() < ExpiredAt of
true -> {ok, Mem};
false -> stale
end
end.
now_millisecond() ->