Просмотр исходного кода

Merge pull request #11861 from zmstone/1101-do-not-repeat-print-shell-warning

fix(shell): do not repeat print shell warnings
Zaiming (Stone) Shi 2 лет назад
Родитель
Сommit
a44f8eb583
2 измененных файлов с 33 добавлено и 12 удалено
  1. 31 12
      apps/emqx_machine/src/emqx_restricted_shell.erl
  2. 2 0
      changes/ce/fix-11861.en.md

+ 31 - 12
apps/emqx_machine/src/emqx_restricted_shell.erl

@@ -33,6 +33,21 @@
 -define(LOCAL_PROHIBITED, [halt, q]).
 -define(REMOTE_PROHIBITED, [{erlang, halt}, {c, q}, {init, stop}, {init, restart}, {init, reboot}]).
 
+-define(WARN_ONCE(Fn, Args),
+    case get(Fn) of
+        true ->
+            ok;
+        _ ->
+            case apply(Fn, Args) of
+                true ->
+                    put(Fn, true),
+                    ok;
+                false ->
+                    ok
+            end
+    end
+).
+
 is_locked() ->
     {ok, false} =/= application:get_env(?APP, ?IS_LOCKED).
 
@@ -72,31 +87,31 @@ is_allowed(prohibited) -> false;
 is_allowed(_) -> true.
 
 limit_warning(MF, Args) ->
-    max_heap_size_warning(MF, Args),
-    max_args_warning(MF, Args).
+    ?WARN_ONCE(fun max_heap_size_warning/2, [MF, Args]),
+    ?WARN_ONCE(fun max_args_warning/2, [MF, Args]).
 
 max_args_warning(MF, Args) ->
     ArgsSize = erts_debug:flat_size(Args),
-    case ArgsSize < ?MAX_ARGS_SIZE of
+    case ArgsSize > ?MAX_ARGS_SIZE of
         true ->
-            ok;
-        false ->
             warning("[WARNING] current_args_size:~w, max_args_size:~w", [ArgsSize, ?MAX_ARGS_SIZE]),
             ?SLOG(warning, #{
                 msg => "execute_function_in_shell_max_args_size",
                 function => MF,
                 %%args => Args,
                 args_size => ArgsSize,
-                max_heap_size => ?MAX_ARGS_SIZE
-            })
+                max_heap_size => ?MAX_ARGS_SIZE,
+                pid => self()
+            }),
+            true;
+        false ->
+            false
     end.
 
 max_heap_size_warning(MF, Args) ->
     {heap_size, HeapSize} = erlang:process_info(self(), heap_size),
-    case HeapSize < ?MAX_HEAP_SIZE of
+    case HeapSize > ?MAX_HEAP_SIZE of
         true ->
-            ok;
-        false ->
             warning("[WARNING] current_heap_size:~w, max_heap_size_warning:~w", [
                 HeapSize, ?MAX_HEAP_SIZE
             ]),
@@ -105,8 +120,12 @@ max_heap_size_warning(MF, Args) ->
                 current_heap_size => HeapSize,
                 function => MF,
                 args => pp_args(Args),
-                max_heap_size => ?MAX_HEAP_SIZE
-            })
+                max_heap_size => ?MAX_HEAP_SIZE,
+                pid => self()
+            }),
+            true;
+        false ->
+            false
     end.
 
 log(_, {?MODULE, prompt_func}, [[{history, _}]]) ->

+ 2 - 0
changes/ce/fix-11861.en.md

@@ -0,0 +1,2 @@
+Fix excessive warning message print in remote console shell.
+