diff options
author | Lukas Larsson <lukas@erlang.org> | 2020-01-21 17:20:10 +0100 |
---|---|---|
committer | Lukas Larsson <lukas@erlang.org> | 2020-02-20 16:51:31 +0100 |
commit | aa4457514d1fdcfb543ada9c502bd11f9ad58c9f (patch) | |
tree | e1c2d8550ff6b2fb1581dd3d0ff813e0f1dbaefc /lib/kernel/src/logger_proxy.erl | |
parent | 0e9e0aec6619ba7cac497a60471d362c48dd31ee (diff) | |
download | erlang-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.erl | 18 |
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) -> |