fix: get_memory_cache return {ok, Mem} | stale
This commit is contained in:
parent
ced55719ef
commit
3c4d09a752
|
@ -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.
|
||||
NewMem = load_ctl:get_sys_memory(),
|
||||
NewExpiredAt = now_millisecond() + ?EXPIRED_MS,
|
||||
ets:insert(?MODULE, {?SYS_MEMORY_KEY, {NewMem, NewExpiredAt}}),
|
||||
{NewMem, State#{fresh_at => Now}};
|
||||
do_fresh_sys_memory(Now, State);
|
||||
false ->
|
||||
{Mem, State}
|
||||
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 => 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() ->
|
||||
|
|
Loading…
Reference in New Issue