From c6271de1743ff0d75a94aa5125b28c877fef80ec Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Thu, 16 Jun 2022 11:26:54 +0800 Subject: [PATCH 1/2] fix: restart started listener when listener connection options update --- apps/emqx/src/emqx_listeners.erl | 2 +- .../test/emqx_mgmt_api_listeners_SUITE.erl | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/emqx/src/emqx_listeners.erl b/apps/emqx/src/emqx_listeners.erl index 9c0552601..ae55f7968 100644 --- a/apps/emqx/src/emqx_listeners.erl +++ b/apps/emqx/src/emqx_listeners.erl @@ -377,7 +377,7 @@ post_config_update([listeners, Type, Name], {create, _Request}, NewConf, undefin start_listener(Type, Name, NewConf); post_config_update([listeners, Type, Name], {update, _Request}, NewConf, OldConf, _AppEnvs) -> case NewConf of - #{<<"enabled">> := true} -> restart_listener(Type, Name, {OldConf, NewConf}); + #{enabled := true} -> restart_listener(Type, Name, {OldConf, NewConf}); _ -> ok end; post_config_update([listeners, _Type, _Name], '$remove', undefined, undefined, _AppEnvs) -> diff --git a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl index 8ea1ea718..36fd69968 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl @@ -142,6 +142,21 @@ crud_listeners_by_id(ListenerId, NewListenerId, MinListenerId, BadId, Type) -> ?assertMatch(#{<<"acceptors">> := Acceptors1}, Update), Get2 = request(get, NewPath, [], []), ?assertMatch(#{<<"acceptors">> := Acceptors1}, Get2), + ?assert(is_running(NewListenerId)), + + %% update an stopped listener + action_listener(NewListenerId, "stop", false), + ?assertNot(is_running(NewListenerId)), + %% update + Get3 = request(get, NewPath, [], []), + #{<<"acceptors">> := Acceptors3} = Get3, + Acceptors4 = Acceptors3 + 1, + Update1 = + request(put, NewPath, [], Get3#{<<"acceptors">> => Acceptors4}), + ?assertMatch(#{<<"acceptors">> := Acceptors4}, Update1), + Get4 = request(get, NewPath, [], []), + ?assertMatch(#{<<"acceptors">> := Acceptors4}, Get4), + ?assertNot(is_running(NewListenerId)), %% delete ?assertEqual([], delete(NewPath)), From 634a75341a227a0e9b293362ff127b43ca68a3d7 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Thu, 16 Jun 2022 11:33:24 +0800 Subject: [PATCH 2/2] fix: remove nonexistent listener should always return ok --- apps/emqx/src/emqx_listeners.erl | 2 +- apps/emqx_management/src/emqx_mgmt_api_listeners.erl | 5 ++--- apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl | 5 +++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/emqx/src/emqx_listeners.erl b/apps/emqx/src/emqx_listeners.erl index ae55f7968..062da5a72 100644 --- a/apps/emqx/src/emqx_listeners.erl +++ b/apps/emqx/src/emqx_listeners.erl @@ -381,7 +381,7 @@ post_config_update([listeners, Type, Name], {update, _Request}, NewConf, OldConf _ -> ok end; post_config_update([listeners, _Type, _Name], '$remove', undefined, undefined, _AppEnvs) -> - {error, not_found}; + ok; post_config_update([listeners, Type, Name], '$remove', undefined, OldConf, _AppEnvs) -> case stop_listener(Type, Name, OldConf) of ok -> diff --git a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl index d158834ae..5ff76062f 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl @@ -355,9 +355,8 @@ crud_listeners_by_id(post, #{bindings := #{id := Id}, body := Body0}) -> end; crud_listeners_by_id(delete, #{bindings := #{id := Id}}) -> {ok, #{type := Type, name := Name}} = emqx_listeners:parse_listener_id(Id), - case remove([listeners, Type, Name]) of + case ensure_remove([listeners, Type, Name]) of {ok, _} -> {204}; - {error, not_found} -> {204}; {error, Reason} -> {400, #{code => 'BAD_REQUEST', message => err_msg(Reason)}} end. @@ -552,7 +551,7 @@ action(Path, Action, Conf) -> create(Path, Conf) -> wrap(emqx_conf:update(Path, {create, Conf}, ?OPTS(cluster))). -remove(Path) -> +ensure_remove(Path) -> wrap(emqx_conf:remove(Path, ?OPTS(cluster))). wrap({error, {post_config_update, emqx_listeners, Reason}}) -> {error, Reason}; diff --git a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl index 36fd69968..f72f9b762 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl @@ -166,6 +166,11 @@ crud_listeners_by_id(ListenerId, NewListenerId, MinListenerId, BadId, Type) -> ?assertEqual([], delete(NewPath)), ok. +t_delete_nonexistent_listener(_) -> + NonExist = emqx_mgmt_api_test_util:api_path(["listeners", "tcp:nonexistent"]), + ?assertEqual([], delete(NonExist)), + ok. + t_action_listeners(_) -> ID = "tcp:default", action_listener(ID, "stop", false),