Skip to content

Commit 902068e

Browse files
committed
Fix logger crash when :gen_statem uses :handle_event_function callback mode
Closes #13682
1 parent 0df128c commit 902068e

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

lib/logger/lib/logger/translator.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ defmodule Logger.Translator do
298298
client_info: client,
299299
name: name,
300300
reason: {kind, reason, stack},
301-
state: {state, data},
301+
state: state,
302302
queue: queue,
303303
postponed: postponed,
304304
callback_mode: callback_mode,
@@ -324,12 +324,17 @@ defmodule Logger.Translator do
324324
["\nPostponed: #{inspect(postponed, inspect_opts)}"]
325325

326326
if min_level == :debug do
327+
state_info =
328+
if callback_mode == :state_functions do
329+
{state, data} = state
330+
["\nState: ", inspect(state, inspect_opts), "\nData: ", inspect(data, inspect_opts)]
331+
else
332+
["\nState: ", inspect(state, inspect_opts)]
333+
end
334+
327335
msg = [
328336
msg,
329-
"\nState: ",
330-
inspect(state, inspect_opts),
331-
"\nData: ",
332-
inspect(data, inspect_opts),
337+
state_info,
333338
"\nCallback mode: ",
334339
"#{inspect(callback_mode, inspect_opts)}, state_enter: #{state_enter?}"
335340
| format_client_info(client)

lib/logger/test/logger/translator_test.exs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,23 @@ defmodule Logger.TranslatorTest do
100100
end
101101
end
102102

103+
defmodule MyGenStatemHandleEvent do
104+
@behaviour :gen_statem
105+
106+
@impl true
107+
def callback_mode, do: :handle_event_function
108+
109+
@impl true
110+
def init(state) do
111+
{:ok, :no_state, state}
112+
end
113+
114+
@impl true
115+
def handle_event({:call, _}, :error, _state, _data) do
116+
raise "oops"
117+
end
118+
end
119+
103120
defmodule MyBridge do
104121
@behaviour :supervisor_bridge
105122

@@ -393,7 +410,7 @@ defmodule Logger.TranslatorTest do
393410
assert {%RuntimeError{message: "oops"}, [_ | _]} = process_metadata[:crash_reason]
394411

395412
refute Map.has_key?(gen_statem_metadata, :initial_call)
396-
assert process_metadata[:initial_call] == {Logger.TranslatorTest.MyGenStatem, :init, 1}
413+
assert process_metadata[:initial_call] == {MyGenStatem, :init, 1}
397414

398415
refute Map.has_key?(gen_statem_metadata, :registered_name)
399416
refute Map.has_key?(process_metadata, :registered_name)
@@ -552,6 +569,29 @@ defmodule Logger.TranslatorTest do
552569
assert_receive {:event, {:string, ["Process " | _]}, _process_metadata}
553570
end
554571

572+
test "translates :gen_statem crashes when callback_mode is :handle_event_function" do
573+
{:ok, pid} = :gen_statem.start(MyGenStatemHandleEvent, :ok, [])
574+
575+
assert capture_log(:debug, fn ->
576+
catch_exit(:gen_statem.call(pid, :error))
577+
end) =~ """
578+
[error] :gen_statem #{inspect(pid)} terminating
579+
** (RuntimeError) oops
580+
"""
581+
582+
assert_receive {:event, {:string, [[":gen_statem " <> _ | _] | _]}, gen_statem_metadata}
583+
assert_receive {:event, {:string, ["Process " | _]}, process_metadata}
584+
585+
assert {%RuntimeError{message: "oops"}, [_ | _]} = gen_statem_metadata[:crash_reason]
586+
assert {%RuntimeError{message: "oops"}, [_ | _]} = process_metadata[:crash_reason]
587+
588+
refute Map.has_key?(gen_statem_metadata, :initial_call)
589+
assert process_metadata[:initial_call] == {MyGenStatemHandleEvent, :init, 1}
590+
591+
refute Map.has_key?(gen_statem_metadata, :registered_name)
592+
refute Map.has_key?(process_metadata, :registered_name)
593+
end
594+
555595
test "translates Task crashes" do
556596
{:ok, pid} = Task.start_link(__MODULE__, :task, [self()])
557597
parent = self()

0 commit comments

Comments
 (0)