Skip to content

Commit

Permalink
fix: don't crash if stopping an unknown consumer
Browse files Browse the repository at this point in the history
```
=ERROR REPORT==== 25-Oct-2024::12:11:26.244821 ===
** Generic server t_double_stop_consumer terminating
** Last message in was {stop_consumer,<<"brod-client-SUITE-topic">>}
** When Server state == {state,t_double_stop_consumer,
                               [{"localhost",9192}],
                               <0.664.0>,[],<0.667.0>,<0.668.0>,
                               [{get_metadata_timeout_seconds,10}],
                               t_double_stop_consumer}
** Reason for termination ==
** {{badmatch,{error,not_found}},
    [{brod_client,handle_call,3,
                  [{file,"/home/thales/dev/emqx/brod/src/brod_client.erl"},
                   {line,391}]},
     {gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,1131}]},
     {gen_server,handle_msg,6,[{file,"gen_server.erl"},{line,1160}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,241}]}]}
** Client <0.661.0> stacktrace
** [{gen,do_call,4,[{file,"gen.erl"},{line,240}]},
    {gen_server,call,3,[{file,"gen_server.erl"},{line,415}]},
    {brod_client,safe_gen_call,3,
                 [{file,"/home/thales/dev/emqx/brod/src/brod_client.erl"},
                  {line,979}]},
    {brod_client_SUITE,t_double_stop_consumer,1,
                       [{file,"/home/thales/dev/emqx/brod/test/brod_client_SUITE.erl"},
                        {line,395}]},
    {test_server,ts_tc,3,[{file,"test_server.erl"},{line,1793}]},
    {test_server,run_test_case_eval1,6,[{file,"test_server.erl"},{line,1302}]},
    {test_server,run_test_case_eval,9,[{file,"test_server.erl"},{line,1234}]}]

=CRASH REPORT==== 25-Oct-2024::12:11:26.244863 ===
  crasher:
    initial call: brod_client:init/1
    pid: <0.663.0>
    registered_name: t_double_stop_consumer
    exception error: no match of right hand side value {error,not_found}
      in function  brod_client:handle_call/3 (/home/thales/dev/emqx/brod/src/brod_client.erl, line 391)
      in call from gen_server:try_handle_call/4 (gen_server.erl, line 1131)
      in call from gen_server:handle_msg/6 (gen_server.erl, line 1160)
    ancestors: [brod_sup,<0.657.0>]
    message_queue_len: 3
    messages: [{'EXIT',<0.667.0>,shutdown},
                  {'EXIT',<0.668.0>,shutdown},
                  {'EXIT',<0.664.0>,shutdown}]
    links: [<0.658.0>]
    dictionary: [{rand_seed,{#{type => exsss,next => #Fun<rand.0.65977474>,
                                bits => 58,uniform => #Fun<rand.1.65977474>,
                                uniform_n => #Fun<rand.2.65977474>,
                                jump => #Fun<rand.3.65977474>},
                              [52087848521744273|168058237035269794]}}]
    trap_exit: true
    status: running
    heap_size: 1598
    stack_size: 28
    reductions: 2571
  neighbours:

=ERROR REPORT==== 25-Oct-2024::12:11:26.244935 ===
    supervisor: {local,brod_sup}
    errorContext: child_terminated
    reason: {{badmatch,{error,not_found}},
             [{brod_client,handle_call,3,
                           [{file,"/home/thales/dev/emqx/brod/src/brod_client.erl"},
                            {line,391}]},
              {gen_server,try_handle_call,4,
                          [{file,"gen_server.erl"},{line,1131}]},
              {gen_server,handle_msg,6,[{file,"gen_server.erl"},{line,1160}]},
              {proc_lib,init_p_do_apply,3,
                        [{file,"proc_lib.erl"},{line,241}]}]}
    offender: [{pid,<0.663.0>},
               {id,t_double_stop_consumer},
               {mfargs,{brod_client,start_link,
                                    [[{"localhost",9192}],
                                     t_double_stop_consumer,
                                     [{get_metadata_timeout_seconds,10}]]}},
               {restart_type,{permanent,10}},
               {shutdown,5000},
               {child_type,worker}]
```
  • Loading branch information
thalesmg committed Oct 25, 2024
1 parent 0a49142 commit fa28883
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/brod_client.erl
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,8 @@ handle_call({stop_producer, Topic}, _From, State) ->
ok = brod_producers_sup:stop_producer(State#state.producers_sup, Topic),
{reply, ok, State};
handle_call({stop_consumer, Topic}, _From, State) ->
ok = brod_consumers_sup:stop_consumer(State#state.consumers_sup, Topic),
{reply, ok, State};
Reply = brod_consumers_sup:stop_consumer(State#state.consumers_sup, Topic),
{reply, Reply, State};
handle_call({get_leader_connection, Topic, Partition}, _From, State) ->
{Result, NewState} = do_get_leader_connection(State, Topic, Partition),
{reply, Result, NewState};
Expand Down
22 changes: 19 additions & 3 deletions test/brod_client_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,17 @@
, t_sasl_callback/1
, t_magic_version/1
, t_get_partitions_count_safe/1
, t_double_stop_consumer/1
]).

-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
-include("brod_int.hrl").

-define(HOST, "localhost").
-define(HOSTS, [{?HOST, 9092}]).
-define(HOSTS_SSL, [{?HOST, 9093}]).
-define(HOSTS_SASL_SSL, [{?HOST, 9094}]).
-define(HOSTS, [{?HOST, 9192}]).
-define(HOSTS_SSL, [{?HOST, 9193}]).
-define(HOSTS_SASL_SSL, [{?HOST, 9194}]).
-define(TOPIC, <<"brod-client-SUITE-topic">>).

-define(WAIT(PATTERN, RESULT, TIMEOUT),
Expand Down Expand Up @@ -379,6 +380,21 @@ t_magic_version(Config) when is_list(Config) ->
?assert(is_integer(Ts))
end.

t_double_stop_consumer({init, Config}) -> Config;
t_double_stop_consumer({'end', Config}) ->
brod:stop_client(?FUNCTION_NAME),
Config;
t_double_stop_consumer(Config) when is_list(Config) ->
Client = ?FUNCTION_NAME,
ClientConfig = [{get_metadata_timeout_seconds, 10}],
ok = start_client(?HOSTS, Client, ClientConfig),
ok = brod:start_consumer(Client, ?TOPIC, []),
?assertMatch({ok, _}, brod_client:get_consumer(Client, ?TOPIC, 0)),
?assertMatch(ok, brod_client:stop_consumer(Client, ?TOPIC)),
?assertMatch({error, {consumer_not_found, _}}, brod_client:get_consumer(Client, ?TOPIC, 0)),
?assertMatch({error, not_found}, brod_client:stop_consumer(Client, ?TOPIC)),
ok.

%%%_* Help functions ===========================================================

%% mocked callback
Expand Down

0 comments on commit fa28883

Please sign in to comment.