From e3bf11fe39b0a46e10b6c955f5f40c1cd8fa2b80 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 29 Jun 2022 20:45:05 +0800 Subject: [PATCH 1/3] chore: stop http listener to load latest http hanlders --- apps/emqx_management/src/emqx_management.appup.src | 5 ++++- apps/emqx_management/src/emqx_mgmt_http.erl | 2 ++ lib-ce/emqx_dashboard/src/emqx_dashboard.appup.src | 7 +++++++ lib-ce/emqx_dashboard/src/emqx_dashboard.erl | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/emqx_management/src/emqx_management.appup.src b/apps/emqx_management/src/emqx_management.appup.src index 1463334b4..17260b107 100644 --- a/apps/emqx_management/src/emqx_management.appup.src +++ b/apps/emqx_management/src/emqx_management.appup.src @@ -1,7 +1,10 @@ %% -*- mode: erlang -*- {VSN, [ {<<"4\\.3\\.[0-9]+">>, - [ {apply,{minirest,stop_http,['http:management']}}, + [ %% Stop the http listener to load the latest http handlers. + %% We can only stop these listeners here because we can't get the list of + %% currently started http listener via app-env during the hot upgrade. + {apply,{minirest,stop_http,['http:management']}}, {apply,{minirest,stop_http,['https:management']}}, {restart_application, emqx_management} ]}, diff --git a/apps/emqx_management/src/emqx_mgmt_http.erl b/apps/emqx_management/src/emqx_mgmt_http.erl index 473cec306..5ccc2cf5e 100644 --- a/apps/emqx_management/src/emqx_mgmt_http.erl +++ b/apps/emqx_management/src/emqx_mgmt_http.erl @@ -85,6 +85,8 @@ listeners() -> application:get_env(?APP, listeners, []). listener_name(Proto) -> + %% NOTE: this name has referenced by emqx_management.appup.src. + %% Please don't change it except you have got how to handle it in hot-upgrade list_to_atom(atom_to_list(Proto) ++ ":management"). http_handlers() -> diff --git a/lib-ce/emqx_dashboard/src/emqx_dashboard.appup.src b/lib-ce/emqx_dashboard/src/emqx_dashboard.appup.src index 902585ffb..cefe79ebd 100644 --- a/lib-ce/emqx_dashboard/src/emqx_dashboard.appup.src +++ b/lib-ce/emqx_dashboard/src/emqx_dashboard.appup.src @@ -5,12 +5,19 @@ %% NOTE: this depends on the fact that emqx_dashboard is always %% the last application gets upgraded [ {apply, {emqx_rule_engine, load_providers, []}} + %% Stop the http listener to load the latest http handlers. + %% We can only stop these listeners here because we can't get the list of + %% currently started http listener via app-env during the hot upgrade. + , {apply, {minirest, stop_http, ['http:dashboard']}} + , {apply, {minirest, stop_http, ['https:dashboard']}} , {restart_application, emqx_dashboard} , {apply, {emqx_plugins, load, []}} ]} ], [ {<<".*">>, [ {apply, {emqx_rule_engine, load_providers, []}} + , {apply, {minirest, stop_http, ['http:dashboard']}} + , {apply, {minirest, stop_http, ['https:dashboard']}} , {restart_application, emqx_dashboard} , {apply, {emqx_plugins, load, []}} ]} diff --git a/lib-ce/emqx_dashboard/src/emqx_dashboard.erl b/lib-ce/emqx_dashboard/src/emqx_dashboard.erl index 5d17c019e..c4a774072 100644 --- a/lib-ce/emqx_dashboard/src/emqx_dashboard.erl +++ b/lib-ce/emqx_dashboard/src/emqx_dashboard.erl @@ -80,6 +80,8 @@ listeners() -> application:get_env(?APP, listeners, []). listener_name(Proto) -> + %% NOTE: this name has referenced by emqx_dashboard.appup.src. + %% Please don't change it except you have got how to handle it in hot-upgrade list_to_atom(atom_to_list(Proto) ++ ":dashboard"). %%-------------------------------------------------------------------- From 5c89998049126ad22ab62da45dd8fcb6880b48e2 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 29 Jun 2022 11:00:31 -0300 Subject: [PATCH 2/3] fix(hooks): return error on hook-removed subscription rather than deleting it Following https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901178 --- apps/emqx_lua_hook/src/emqx_lua_script.erl | 2 +- apps/emqx_lua_hook/test/emqx_lua_hook_SUITE.erl | 2 +- src/emqx_channel.erl | 6 +++--- test/emqx_broker_SUITE.erl | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/emqx_lua_hook/src/emqx_lua_script.erl b/apps/emqx_lua_hook/src/emqx_lua_script.erl index b54eaf571..f5629309f 100644 --- a/apps/emqx_lua_hook/src/emqx_lua_script.erl +++ b/apps/emqx_lua_hook/src/emqx_lua_script.erl @@ -171,7 +171,7 @@ on_client_subscribe(#{clientid := ClientId, username := Username}, _Properties, case on_client_subscribe_single(ClientId, Username, TopicFilter, LuaState) of false -> {Topic, Opts} = TopicFilter, - [{Topic, Opts#{delete => true}} | Acc]; + [{Topic, Opts#{deny_subscription => true}} | Acc]; NewTopicFilter -> [NewTopicFilter | Acc] end diff --git a/apps/emqx_lua_hook/test/emqx_lua_hook_SUITE.erl b/apps/emqx_lua_hook/test/emqx_lua_hook_SUITE.erl index ea75b138c..9b9f7c410 100644 --- a/apps/emqx_lua_hook/test/emqx_lua_hook_SUITE.erl +++ b/apps/emqx_lua_hook/test/emqx_lua_hook_SUITE.erl @@ -711,7 +711,7 @@ t_stop_sub(_Config) -> OriginalTopicFilters = [{Topic = <<"u">>, Opts = #{nl => 0,qos => 0,rap => 0,rh => 0}}], Props = #{}, - Expected = [{Topic, Opts#{delete => true}}], + Expected = [{Topic, Opts#{deny_subscription => true}}], ?assertEqual(Expected, emqx_hooks:run_fold('client.subscribe', [ClientInfo, Props], OriginalTopicFilters)). diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 8ac537b69..bf292f10b 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -425,9 +425,9 @@ handle_in(Packet = ?SUBSCRIBE_PACKET(PacketId, Properties, TopicFilters), Channel), TupleTopicFilters2 = lists:foldl( - fun({{Topic, Opts = #{delete := true}}, _QoS}, Acc) -> - Key = {Topic, maps:without([delete], Opts)}, - lists:keydelete(Key, 1, Acc); + fun({{Topic, Opts = #{deny_subscription := true}}, _ReturnCode}, Acc) -> + Key = {Topic, maps:without([deny_subscription], Opts)}, + lists:keyreplace(Key, 1, Acc, {Key, ?RC_UNSPECIFIED_ERROR}); (Tuple = {Key, _Value}, Acc) -> lists:keyreplace(Key, 1, Acc, Tuple) end, diff --git a/test/emqx_broker_SUITE.erl b/test/emqx_broker_SUITE.erl index 9fc62875e..f8698e1a2 100644 --- a/test/emqx_broker_SUITE.erl +++ b/test/emqx_broker_SUITE.erl @@ -315,7 +315,7 @@ t_handle_in_empty_client_subscribe_hook({'end', _Config}) -> ok; t_handle_in_empty_client_subscribe_hook(Config) when is_list(Config) -> Hook = fun(_ClientInfo, _Username, TopicFilter) -> - EmptyFilters = [{T, Opts#{delete => true}} || {T, Opts} <- TopicFilter], + EmptyFilters = [{T, Opts#{deny_subscription => true}} || {T, Opts} <- TopicFilter], {stop, EmptyFilters} end, ok = emqx:hook('client.subscribe', Hook, []), @@ -323,7 +323,7 @@ t_handle_in_empty_client_subscribe_hook(Config) when is_list(Config) -> {ok, C} = emqtt:start_link(), {ok, _} = emqtt:connect(C), {ok, _, RCs} = emqtt:subscribe(C, <<"t">>), - ?assertEqual([], RCs), + ?assertEqual([?RC_UNSPECIFIED_ERROR], RCs), ok after ok = emqx:unhook('client.subscribe', Hook) From cb82e8cdb68c53fcaa7952d61b9bc032abe5467a Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Wed, 29 Jun 2022 22:19:46 +0800 Subject: [PATCH 3/3] chore: release 4.3.16-beta.4 --- include/emqx_release.hrl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/emqx_release.hrl b/include/emqx_release.hrl index 83d774252..fbfba0f0b 100644 --- a/include/emqx_release.hrl +++ b/include/emqx_release.hrl @@ -29,7 +29,7 @@ -ifndef(EMQX_ENTERPRISE). --define(EMQX_RELEASE, {opensource, "4.3.16-beta.3"}). +-define(EMQX_RELEASE, {opensource, "4.3.16-beta.4"}). -else.