Skip to content

Commit 2d808ec

Browse files
committed
Fix logger crash when :gen_statem format_status/2 returns non-tuple (#13684)
1 parent 6bfb95a commit 2d808ec

File tree

2 files changed

+57
-13
lines changed

2 files changed

+57
-13
lines changed

Diff for: lib/logger/lib/logger/translator.ex

+1-3
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,
@@ -328,8 +328,6 @@ defmodule Logger.Translator do
328328
msg,
329329
"\nState: ",
330330
inspect(state, inspect_opts),
331-
"\nData: ",
332-
inspect(data, inspect_opts),
333331
"\nCallback mode: ",
334332
"#{inspect(callback_mode, inspect_opts)}, state_enter: #{state_enter?}"
335333
| format_client_info(client)

Diff for: lib/logger/test/logger/translator_test.exs

+56-10
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,28 @@ 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, :no_state, _data) do
116+
raise "oops"
117+
end
118+
119+
@impl :gen_statem
120+
def format_status(_opts, [_pdict, _, state]) do
121+
state
122+
end
123+
end
124+
103125
defmodule MyBridge do
104126
@behaviour :supervisor_bridge
105127

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

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

398420
refute Map.has_key?(gen_statem_metadata, :registered_name)
399421
refute Map.has_key?(process_metadata, :registered_name)
@@ -445,7 +467,7 @@ defmodule Logger.TranslatorTest do
445467
assert capture_log(:debug, fn ->
446468
catch_exit(:gen_statem.call(pid, :error))
447469
end) =~ """
448-
[:ok, :ok, :ok, ...]
470+
State: {:started, [:ok, ...]}
449471
"""
450472
after
451473
Application.put_env(:logger, :translator_inspect_opts, [])
@@ -462,8 +484,7 @@ defmodule Logger.TranslatorTest do
462484
.*
463485
Queue: .*
464486
Postponed: \[\]
465-
State: :started
466-
Data: :ok
487+
State: {:started, :ok}
467488
Callback mode: :state_functions, state_enter: false
468489
Client #PID<\d+\.\d+\.\d+> is alive
469490
.*
@@ -488,8 +509,7 @@ defmodule Logger.TranslatorTest do
488509
.*
489510
Queue: .*
490511
Postponed: \[\]
491-
State: :started
492-
Data: :ok
512+
State: {:started, :ok}
493513
Callback mode: :state_functions, state_enter: false
494514
Client :named_client is alive
495515
.*
@@ -513,8 +533,7 @@ defmodule Logger.TranslatorTest do
513533
.*
514534
Queue: .*
515535
Postponed: \[\]
516-
State: :started
517-
Data: :ok
536+
State: {:started, :ok}
518537
Callback mode: :state_functions, state_enter: false
519538
Client #PID<\d+\.\d+\.\d+> is dead
520539
"""s
@@ -533,8 +552,7 @@ defmodule Logger.TranslatorTest do
533552
.*
534553
Queue: .*
535554
Postponed: \[\]
536-
State: :started
537-
Data: :ok
555+
State: {:started, :ok}
538556
Callback mode: :state_functions, state_enter: false
539557
"""s
540558
end
@@ -552,6 +570,34 @@ defmodule Logger.TranslatorTest do
552570
assert_receive {:event, {:string, ["Process " | _]}, _process_metadata}
553571
end
554572

573+
test "translates :gen_statem crashes when callback_mode is :handle_event_function" do
574+
{:ok, pid} = :gen_statem.start(MyGenStatemHandleEvent, :ok, [])
575+
576+
assert capture_log(:debug, fn ->
577+
catch_exit(:gen_statem.call(pid, :error))
578+
end) =~ ~r"""
579+
\[error\] :gen_statem #PID<\d+\.\d+\.\d+> terminating
580+
\*\* \(RuntimeError\) oops
581+
.*
582+
Queue: .*
583+
Postponed: \[\]
584+
State: :ok
585+
Callback mode: .*, state_enter: false
586+
"""s
587+
588+
assert_receive {:event, {:string, [[":gen_statem " <> _ | _] | _]}, gen_statem_metadata}
589+
assert_receive {:event, {:string, ["Process " | _]}, process_metadata}
590+
591+
assert {%RuntimeError{message: "oops"}, [_ | _]} = gen_statem_metadata[:crash_reason]
592+
assert {%RuntimeError{message: "oops"}, [_ | _]} = process_metadata[:crash_reason]
593+
594+
refute Map.has_key?(gen_statem_metadata, :initial_call)
595+
assert process_metadata[:initial_call] == {MyGenStatemHandleEvent, :init, 1}
596+
597+
refute Map.has_key?(gen_statem_metadata, :registered_name)
598+
refute Map.has_key?(process_metadata, :registered_name)
599+
end
600+
555601
test "translates Task crashes" do
556602
{:ok, pid} = Task.start_link(__MODULE__, :task, [self()])
557603
parent = self()

0 commit comments

Comments
 (0)