Преглед изворни кода

fix: get_memory_cache return {ok, Mem} | stale

Zhongwen Deng пре 3 година
родитељ
комит
3c4d09a752
1 измењених фајлова са 22 додато и 18 уклоњено
  1. 22 18
      apps/emqx_management/src/emqx_mgmt_cache.erl

+ 22 - 18
apps/emqx_management/src/emqx_mgmt_cache.erl

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