From fa2888358d696fa515c7e265b551e85f087e794a Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Fri, 25 Oct 2024 12:12:08 -0300 Subject: [PATCH] fix: don't crash if stopping an unknown consumer ``` =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, bits => 58,uniform => #Fun, uniform_n => #Fun, jump => #Fun}, [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}] ``` --- src/brod_client.erl | 4 ++-- test/brod_client_SUITE.erl | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/brod_client.erl b/src/brod_client.erl index d52f1b38..b708578c 100644 --- a/src/brod_client.erl +++ b/src/brod_client.erl @@ -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}; diff --git a/test/brod_client_SUITE.erl b/test/brod_client_SUITE.erl index eff92257..6217a687 100644 --- a/test/brod_client_SUITE.erl +++ b/test/brod_client_SUITE.erl @@ -44,6 +44,7 @@ , 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"). @@ -51,9 +52,9 @@ -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), @@ -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