summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang.org>2020-01-21 17:20:10 +0100
committerLukas Larsson <lukas@erlang.org>2020-02-20 16:51:31 +0100
commitaa4457514d1fdcfb543ada9c502bd11f9ad58c9f (patch)
treee1c2d8550ff6b2fb1581dd3d0ff813e0f1dbaefc /lib
parent0e9e0aec6619ba7cac497a60471d362c48dd31ee (diff)
downloaderlang-aa4457514d1fdcfb543ada9c502bd11f9ad58c9f.tar.gz
logger: Make logger_proxy more robust at startup
If a remote log event happens before the logger_proxy is started the logger_server would crash which would pull down the entire node. Now we instead try to do the logging in the calling processes.
Diffstat (limited to 'lib')
-rw-r--r--lib/kernel/src/logger_proxy.erl18
-rw-r--r--lib/kernel/test/logger_proxy_SUITE.erl14
2 files changed, 27 insertions, 5 deletions
diff --git a/lib/kernel/src/logger_proxy.erl b/lib/kernel/src/logger_proxy.erl
index 24b293805c..6ab8e3e4c5 100644
--- a/lib/kernel/src/logger_proxy.erl
+++ b/lib/kernel/src/logger_proxy.erl
@@ -42,11 +42,16 @@
StringOrReport :: unicode:chardata() | logger:report(),
Meta :: logger:metadata().
log(RemoteLog) ->
- Olp = persistent_term:get(?MODULE),
- case logger_olp:get_pid(Olp) =:= self() of
+ Olp = persistent_term:get(?MODULE, undefined),
+ case (Olp =:= undefined) orelse (logger_olp:get_pid(Olp) =:= self()) of
true ->
%% This happens when the log event comes from the
%% emulator, and the group leader is on a remote node.
+ %%
+ %% OR
+ %%
+ %% when we are to log a remote message before the logger_proxy
+ %% has started
_ = handle_load(RemoteLog, no_state),
ok;
false ->
@@ -112,9 +117,12 @@ init([]) ->
%% Log event to send to the node where the group leader of it's client resides
handle_load({remote,Node,Log},State) ->
- %% If the connection is overloaded (send_nosuspend returns false),
- %% we drop the message.
- _ = erlang:send_nosuspend({?SERVER,Node},Log),
+ case erlang:send({?SERVER,Node},Log,[nosuspend]) of
+ _ok_or_nosuspend ->
+ %% If the connection is overloaded (send returns nosuspend),
+ %% we drop the message.
+ ok
+ end,
State;
%% Log event to log on this node
handle_load({log,Level,Format,Args,Meta},State) ->
diff --git a/lib/kernel/test/logger_proxy_SUITE.erl b/lib/kernel/test/logger_proxy_SUITE.erl
index 777531e4ed..bae2bd8d17 100644
--- a/lib/kernel/test/logger_proxy_SUITE.erl
+++ b/lib/kernel/test/logger_proxy_SUITE.erl
@@ -72,6 +72,7 @@ all() ->
[basic,
emulator,
remote,
+ remote_disconnect,
remote_emulator,
config,
restart_after,
@@ -118,6 +119,19 @@ remote(Config) ->
remote(cleanup,_Config) ->
ok = logger:remove_handler(?HNAME).
+remote_disconnect(Config) ->
+ {ok,_,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
+ ok = logger:add_handler(?HNAME,?MODULE,#{config=>self()}),
+ RemoteGL = rpc:call(Node, erlang, whereis, [user]),
+ net_kernel:disconnect(Node),
+ L1 = ?LOC#{ gl => RemoteGL }, logger:notice("Log from ~p; ~p",[?FUNCTION_NAME,?LINE],L1),
+ ok = ensure(L1),
+ L2 = ?LOC#{ gl => RemoteGL }, logger:notice([{test_case,?FUNCTION_NAME},{line,?LINE}],L2),
+ ok = ensure(L2),
+ ok.
+remote_disconnect(cleanup,_Config) ->
+ ok = logger:remove_handler(?HNAME).
+
remote_emulator(Config) ->
{ok,_,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
ok = logger:add_handler(?HNAME,?MODULE,#{config=>self()}),