Ver código fonte

Merge pull request #473 from erlang-lager/adt/weird-statem-crash

Handle strange crash report from gen_statem
pull/475/head
Andrew Thompson 6 anos atrás
committed by GitHub
pai
commit
988e3f2eaf
Nenhuma chave conhecida encontrada para esta assinatura no banco de dados ID da chave GPG: 4AEE18F83AFDEB23
3 arquivos alterados com 26 adições e 8 exclusões
  1. +3
    -0
      src/error_logger_lager_h.erl
  2. +15
    -2
      test/crash_statem.erl
  3. +8
    -6
      test/lager_test_backend.erl

+ 3
- 0
src/error_logger_lager_h.erl Ver arquivo

@ -207,6 +207,9 @@ log_event(Event, #state{sink=Sink} = State) ->
[TName, _Msg, TStateName, _StateData, TReason] -> [TName, _Msg, TStateName, _StateData, TReason] ->
{gen_fsm, TName, TStateName, TReason}; {gen_fsm, TName, TStateName, TReason};
[TName, _Msg, {TStateName, _StateData}, _ExitType, TReason, _FsmType, Stacktrace] -> [TName, _Msg, {TStateName, _StateData}, _ExitType, TReason, _FsmType, Stacktrace] ->
{gen_statem, TName, TStateName, {TReason, Stacktrace}};
[TName, _Msg, [{TStateName, _StateData}], _ExitType, TReason, _FsmType, Stacktrace] ->
%% sometimes gen_statem wraps its statename/data in a list for some reason???
{gen_statem, TName, TStateName, {TReason, Stacktrace}} {gen_statem, TName, TStateName, {TReason, Stacktrace}}
end, end,
{Md, Formatted} = format_reason_md(Reason), {Md, Formatted} = format_reason_md(Reason),

+ 15
- 2
test/crash_statem.erl Ver arquivo

@ -6,6 +6,8 @@
-export([ -export([
start/0, start/0,
crash/0, crash/0,
stop/1,
timeout/0,
handle_event/4 handle_event/4
]). ]).
@ -17,6 +19,12 @@ start() ->
crash() -> crash() ->
gen_statem:call(?MODULE, boom). gen_statem:call(?MODULE, boom).
stop(Reason) ->
gen_statem:call(?MODULE, {stop, Reason}).
timeout() ->
gen_statem:call(?MODULE, timeout).
%% Mandatory callback functions %% Mandatory callback functions
terminate(_Reason, _State, _Data) -> ok. terminate(_Reason, _State, _Data) -> ok.
code_change(_Vsn, State, Data, _Extra) -> {ok,State,Data}. code_change(_Vsn, State, Data, _Extra) -> {ok,State,Data}.
@ -26,12 +34,17 @@ init([]) ->
"8.0" -> {callback_mode(),state1,undefined}; "8.0" -> {callback_mode(),state1,undefined};
_ -> {ok, state1, undefined} _ -> {ok, state1, undefined}
end. end.
callback_mode() -> handle_event_function. callback_mode() -> handle_event_function.
%%% state callback(s) %%% state callback(s)
handle_event({call, _From}, state1, _Arg, Data) ->
{next_state, state1, Data}.
handle_event(state_timeout, timeout, state1, _) ->
{stop, timeout};
handle_event({call, _From}, timeout, _Arg, Data) ->
{keep_state_and_data, [{state_timeout, 0, timeout}]};
handle_event({call, _From}, {stop, Reason}, state1, Data) ->
{stop, Reason}.
-else. -else.
-export([start/0, crash/0]). -export([start/0, crash/0]).

+ 8
- 6
test/lager_test_backend.erl Ver arquivo

@ -996,14 +996,14 @@ kill_crasher(RegName) ->
Pid -> exit(Pid, kill) Pid -> exit(Pid, kill)
end. end.
spawn_fsm_crash(Module) ->
spawn(fun() -> Module:crash() end),
spawn_fsm_crash(Module, Function, Args) ->
spawn(fun() -> erlang:apply(Module, Function, Args) end),
timer:sleep(100), timer:sleep(100),
_ = gen_event:which_handlers(error_logger), _ = gen_event:which_handlers(error_logger),
ok. ok.
crash_fsm_test_() -> crash_fsm_test_() ->
TestBody = fun(Name, FsmModule, Expected) ->
TestBody = fun(Name, FsmModule, FSMFunc, FSMArgs, Expected) ->
fun(Sink) -> fun(Sink) ->
{Name, {Name,
fun() -> fun() ->
@ -1011,7 +1011,7 @@ crash_fsm_test_() ->
{true, true} -> ok; {true, true} -> ok;
_ -> _ ->
Pid = whereis(FsmModule), Pid = whereis(FsmModule),
spawn_fsm_crash(FsmModule),
spawn_fsm_crash(FsmModule, FSMFunc, FSMArgs),
{Level, _, Msg, Metadata} = pop(Sink), {Level, _, Msg, Metadata} = pop(Sink),
test_body(Expected, lists:flatten(Msg)), test_body(Expected, lists:flatten(Msg)),
?assertEqual(Pid, proplists:get_value(pid, Metadata)), ?assertEqual(Pid, proplists:get_value(pid, Metadata)),
@ -1031,8 +1031,10 @@ crash_fsm_test_() ->
} }
end, end,
TestBody("gen_fsm crash", crash_fsm, "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"),
TestBody("gen_statem crash", crash_statem, "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle")
TestBody("gen_fsm crash", crash_fsm, crash, [], "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"),
TestBody("gen_statem crash", crash_statem, crash, [], "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle"),
TestBody("gen_statem stop", crash_statem, stop, [explode], "gen_statem crash_statem in state state1 terminated with reason: explode"),
TestBody("gen_statem timeout", crash_statem, timeout, [], "gen_statem crash_statem in state state1 terminated with reason: timeout")
], ],
{"FSM crash output tests", [ {"FSM crash output tests", [

Carregando…
Cancelar
Salvar