summaryrefslogtreecommitdiff
path: root/lib/kernel/src/logger_proxy.erl
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/kernel/src/logger_proxy.erl
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/kernel/src/logger_proxy.erl')
-rw-r--r--lib/kernel/src/logger_proxy.erl18
1 files changed, 13 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) ->