From a54668e83bc624d58e96fcb65a39f3ca77b09678 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Wed, 24 Nov 2021 17:11:04 +0800 Subject: [PATCH 01/23] fix(mqtt_bridge): the mqtt bridge hangs with an unreachable IP --- .../src/emqx_bridge_mqtt_actions.erl | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_actions.erl b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_actions.erl index 3f685a72a..21cda5b6d 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_actions.erl +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_actions.erl @@ -410,21 +410,35 @@ start_resource(ResId, PoolName, Options) -> end. test_resource_status(PoolName) -> - IsConnected = fun(Worker) -> - case ecpool_worker:client(Worker) of - {ok, Bridge} -> - try emqx_bridge_worker:status(Bridge) of - connected -> true; - _ -> false - catch _Error:_Reason -> - false - end; - {error, _} -> - false - end - end, - Status = [IsConnected(Worker) || {_WorkerName, Worker} <- ecpool:workers(PoolName)], - lists:any(fun(St) -> St =:= true end, Status). + Parent = self(), + Pids = [spawn(fun() -> Parent ! {self(), get_worker_status(Worker)} end) + || {_WorkerName, Worker} <- ecpool:workers(PoolName)], + try + Status = [ + receive {Pid, R} -> R + after 1000 -> %% get_worker_status/1 should be a quick operation + throw({timeout, Pid}) + end || Pid <- Pids], + lists:any(fun(St) -> St =:= true end, Status) + catch + throw:Reason -> + ?LOG(error, "Get mqtt bridge status timeout: ~p", [Reason]), + lists:foreach(fun(Pid) -> exit(Pid, kill) end, Pids), + false + end. + +get_worker_status(Worker) -> + case ecpool_worker:client(Worker) of + {ok, Bridge} -> + try emqx_bridge_worker:status(Bridge) of + connected -> true; + _ -> false + catch _Error:_Reason -> + false + end; + {error, _} -> + false + end. -spec(on_get_resource_status(ResId::binary(), Params::map()) -> Status::map()). on_get_resource_status(_ResId, #{<<"pool">> := PoolName}) -> @@ -433,13 +447,13 @@ on_get_resource_status(_ResId, #{<<"pool">> := PoolName}) -> on_resource_destroy(ResId, #{<<"pool">> := PoolName}) -> ?LOG(info, "Destroying Resource ~p, ResId: ~p", [?RESOURCE_TYPE_MQTT, ResId]), - case ecpool:stop_sup_pool(PoolName) of - ok -> - ?LOG(info, "Destroyed Resource ~p Successfully, ResId: ~p", [?RESOURCE_TYPE_MQTT, ResId]); - {error, Reason} -> - ?LOG(error, "Destroy Resource ~p failed, ResId: ~p, ~p", [?RESOURCE_TYPE_MQTT, ResId, Reason]), - error({{?RESOURCE_TYPE_MQTT, ResId}, destroy_failed}) - end. + case ecpool:stop_sup_pool(PoolName) of + ok -> + ?LOG(info, "Destroyed Resource ~p Successfully, ResId: ~p", [?RESOURCE_TYPE_MQTT, ResId]); + {error, Reason} -> + ?LOG(error, "Destroy Resource ~p failed, ResId: ~p, ~p", [?RESOURCE_TYPE_MQTT, ResId, Reason]), + error({{?RESOURCE_TYPE_MQTT, ResId}, destroy_failed}) + end. on_action_create_data_to_mqtt_broker(ActId, Opts = #{<<"pool">> := PoolName, <<"forward_topic">> := ForwardTopic, From 3b9bb1d66c960670391247ab3db67920996b7f4e Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Wed, 24 Nov 2021 17:52:11 +0800 Subject: [PATCH 02/23] fix(ecpool): update ecpool to 0.5.2 --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 09e4d1e2b..82f029873 100644 --- a/rebar.config +++ b/rebar.config @@ -47,7 +47,7 @@ , {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.5.1"}}} , {cuttlefish, {git, "https://github.com/emqx/cuttlefish", {tag, "v3.3.6"}}} , {minirest, {git, "https://github.com/emqx/minirest", {tag, "0.3.7"}}} - , {ecpool, {git, "https://github.com/emqx/ecpool", {tag, "0.5.1"}}} + , {ecpool, {git, "https://github.com/emqx/ecpool", {tag, "0.5.2"}}} , {replayq, {git, "https://github.com/emqx/replayq", {tag, "0.3.2"}}} , {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {branch, "2.0.4"}}} , {emqtt, {git, "https://github.com/emqx/emqtt", {tag, "1.2.3.1"}}} From c950566294f6d0d2af6989984aed915630e31954 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 24 Nov 2021 14:22:51 -0300 Subject: [PATCH 03/23] chore(appup): minor fixes to update_appup.escript - Fixes clause error on `create_stub/1`. - Small optimization: do not download the same file multiple times with `wget`. --- scripts/update_appup.escript | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 39a71b492..738b65ac7 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -154,7 +154,7 @@ download_prev_release(Tag, #{binary_rel_url := {ok, URL0}, clone_url := Repo}) - Dir = filename:basename(Repo, ".git") ++ [$-|Tag], Filename = filename:join(BaseDir, Dir), Script = "mkdir -p ${OUTFILE} && - wget -O ${OUTFILE}.zip ${URL} && + wget -c -O ${OUTFILE}.zip ${URL} && unzip -n -d ${OUTFILE} ${OUTFILE}.zip", Env = [{"TAG", Tag}, {"OUTFILE", Filename}, {"URL", URL}], bash(Script, Env), @@ -303,7 +303,7 @@ create_stub(App) -> AppupFile = filename:basename(AppSrc) ++ ".appup.src", Default = {<<".*">>, []}, render_appfile(AppupFile, [Default], [Default]), - AppupFile; + {ok, AppupFile}; undefined -> false end. From 29f982385d2f118c652ff1ca0b6ec53e7e2c4da6 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 24 Nov 2021 14:58:55 -0300 Subject: [PATCH 04/23] chore(appup): remove old file extension and preserve dirname for apps --- scripts/update_appup.escript | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 738b65ac7..9fc8f618e 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -298,12 +298,14 @@ render_appfile(File, Upgrade, Downgrade) -> ok = file:write_file(File, IOList). create_stub(App) -> - case locate(src, App, ".app.src") of + case locate(src, App, Ext = ".app.src") of {ok, AppSrc} -> - AppupFile = filename:basename(AppSrc) ++ ".appup.src", + DirName = filename:dirname(AppSrc), + AppupFile = filename:basename(AppSrc, Ext) ++ ".appup.src", Default = {<<".*">>, []}, - render_appfile(AppupFile, [Default], [Default]), - {ok, AppupFile}; + AppupFileFullpath = filename:join(DirName, AppupFile), + render_appfile(AppupFileFullpath, [Default], [Default]), + {ok, AppupFileFullpath}; undefined -> false end. From f5ac6fb7142a4277d068abd7cba59438bebbf03a Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Thu, 25 Nov 2021 09:46:06 +0800 Subject: [PATCH 05/23] chore(appup): bump emqx_bridge_mqtt to 4.3.3 --- .../src/emqx_bridge_mqtt.app.src | 2 +- .../src/emqx_bridge_mqtt.appup.src | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.app.src b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.app.src index 650c9d7fa..e6d1c55c4 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.app.src +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.app.src @@ -1,6 +1,6 @@ {application, emqx_bridge_mqtt, [{description, "EMQ X Bridge to MQTT Broker"}, - {vsn, "4.3.2"}, % strict semver, bump manually! + {vsn, "4.3.3"}, % strict semver, bump manually! {modules, []}, {registered, []}, {applications, [kernel,stdlib,replayq,emqtt]}, diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src index b32d747f4..3b50949cd 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.appup.src @@ -1,18 +1,24 @@ %% -*-: erlang -*- -{VSN, +{"4.3.3", [ + {<<"4.3.[1-2]">>, [ + {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} + ]}, {"4.3.0", [ - {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []} - ]}, - {"4.3.1", []}, + {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []}, + {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} + ]}, {<<".*">>, []} ], [ - {"4.3.0", [ - {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []} + {<<"4.3.[1-2]">>, [ + {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} + ]}, + {"4.3.0", [ + {load_module, emqx_bridge_worker, brutal_purge, soft_purge, []}, + {load_module, emqx_bridge_mqtt_actions, brutal_purge, soft_purge, []} ]}, - {"4.3.1", []}, {<<".*">>, []} ] }. From 289415b5aac36b1229b5fa3feccec90d2cf54e8e Mon Sep 17 00:00:00 2001 From: JimMoen Date: Wed, 24 Nov 2021 19:08:43 +0800 Subject: [PATCH 06/23] fix(conf): change `max_topic_levels` default configuration --- etc/emqx.conf | 11 +++++++---- priv/emqx.schema | 2 +- test/emqx_channel_SUITE.erl | 3 +-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/etc/emqx.conf b/etc/emqx.conf index 152f28215..ae5c33508 100644 --- a/etc/emqx.conf +++ b/etc/emqx.conf @@ -663,9 +663,11 @@ mqtt.max_packet_size = 1MB mqtt.max_clientid_len = 65535 ## Maximum topic levels allowed. 0 means no limit. +## Depth so big may lead to subscribing performance issues. ## -## Value: Number -mqtt.max_topic_levels = 0 +## Value: Number [0-65535] +## Default: 128 +mqtt.max_topic_levels = 128 ## Maximum QoS allowed. ## @@ -769,8 +771,9 @@ zone.external.force_gc_policy = 16000|16MB ## Maximum topic levels allowed. 0 means no limit. ## -## Value: Number -## zone.external.max_topic_levels = 7 +## Value: Number [0-65535] +## Default: 7 +zone.external.max_topic_levels = 7 ## Maximum QoS allowed. ## diff --git a/priv/emqx.schema b/priv/emqx.schema index 86a2a2892..5f21c36d4 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -800,7 +800,7 @@ end}. %% @doc Set the Maximum topic levels. {mapping, "mqtt.max_topic_levels", "emqx.max_topic_levels", [ - {default, 0}, + {default, 128}, {datatype, integer} ]}. diff --git a/test/emqx_channel_SUITE.erl b/test/emqx_channel_SUITE.erl index 9558dfd28..3249eb991 100644 --- a/test/emqx_channel_SUITE.erl +++ b/test/emqx_channel_SUITE.erl @@ -83,7 +83,7 @@ t_chan_caps(_) -> #{max_clientid_len := 65535, max_qos_allowed := 2, max_topic_alias := 65535, - max_topic_levels := 0, + max_topic_levels := 128, retain_available := true, shared_subscription := true, subscription_identifiers := true, @@ -835,4 +835,3 @@ session(InitFields) when is_map(InitFields) -> quota() -> emqx_limiter:init(zone, [{conn_messages_routing, {5, 1}}, {overall_messages_routing, {10, 1}}]). - From 0260db664096f6b8f662f22602b3d735c3d34e88 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 24 Nov 2021 12:41:35 -0300 Subject: [PATCH 07/23] feat(sys_mon): Add proc_lib:initial_call/1 and current_stacktrace (4.3) (Same as #6289 ) This adds the information from `proc_lib:initial_call/1` and the current stacktrace from the process info to `emqx_sys_mon:procinfo/1` to aid in debugging some warnings with no context such as the following: ``` 2021-11-23T12:33:59.387818+00:00 [warning] info: [{old_heap_block_size,45988046},{heap_block_size,22177879},{mbuf_size,0},{stack_size,40},{old_heap_size,22354134},{heap_size,7106339}], line: 130, mfa: emqx_sys_mon:handle_info/2, msg: large_heap, procinfo: [{pid,<0.2667.0>},{memory,579763664},{total_heap_size,68510672},{heap_size,22177879},{stack_size,40},{min_heap_size,233},{initial_call,{proc_lib,init_p,5}},{current_function,{gen,do_call,4}},{registered_name,[]},{status,running},{message_queue_len,360945},{group_leader,<0.1660.0>},{priority,normal},{trap_exit,false},{reductions,16493271},{last_calls,false},{catchlevel,4},{trace,0},{suspending,[]},{sequential_trace_token,[]},{error_handler,error_handler}] ``` --- src/emqx_sys_mon.erl | 10 ++++++++- src/emqx_vm.erl | 2 +- test/emqx_sys_mon_SUITE.erl | 41 ++++++++++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/emqx_sys_mon.erl b/src/emqx_sys_mon.erl index 152f975eb..710895bcd 100644 --- a/src/emqx_sys_mon.erl +++ b/src/emqx_sys_mon.erl @@ -182,7 +182,15 @@ procinfo(Pid) -> case {emqx_vm:get_process_info(Pid), emqx_vm:get_process_gc_info(Pid)} of {undefined, _} -> undefined; {_, undefined} -> undefined; - {Info, GcInfo} -> Info ++ GcInfo + {Info, GcInfo} -> get_proc_lib_initial_call(Pid) ++ GcInfo ++ Info + end. + +get_proc_lib_initial_call(Pid) -> + case proc_lib:initial_call(Pid) of + false -> + []; + InitialCall -> + [{proc_lib_initial_call, InitialCall}] end. safe_publish(Event, WarnMsg) -> diff --git a/src/emqx_vm.erl b/src/emqx_vm.erl index 537330b01..dc841229a 100644 --- a/src/emqx_vm.erl +++ b/src/emqx_vm.erl @@ -62,7 +62,7 @@ ]). -define(PROCESS_INFO_KEYS, [initial_call, - current_function, + current_stacktrace, registered_name, status, message_queue_len, diff --git a/test/emqx_sys_mon_SUITE.erl b/test/emqx_sys_mon_SUITE.erl index 70f518ad5..63e7c376a 100644 --- a/test/emqx_sys_mon_SUITE.erl +++ b/test/emqx_sys_mon_SUITE.erl @@ -70,23 +70,51 @@ init_per_testcase(t_sys_mon2, Config) -> (_) -> ok end), Config; +init_per_testcase(t_procinfo, Config) -> + emqx_ct_helpers:boot_modules(all), + emqx_ct_helpers:start_apps([]), + ok = meck:new(emqx_vm, [passthrough, no_history]), + Config; init_per_testcase(_, Config) -> emqx_ct_helpers:boot_modules(all), emqx_ct_helpers:start_apps([]), Config. +end_per_testcase(t_procinfo, _Config) -> + ok = meck:unload(emqx_vm), + emqx_ct_helpers:stop_apps([]); end_per_testcase(_, _Config) -> emqx_ct_helpers:stop_apps([]). t_procinfo(_) -> - ok = meck:new(emqx_vm, [passthrough, no_history]), ok = meck:expect(emqx_vm, get_process_info, fun(_) -> [] end), ok = meck:expect(emqx_vm, get_process_gc_info, fun(_) -> [] end), ?assertEqual([], emqx_sys_mon:procinfo([])), ok = meck:expect(emqx_vm, get_process_info, fun(_) -> ok end), ok = meck:expect(emqx_vm, get_process_gc_info, fun(_) -> undefined end), - ?assertEqual(undefined, emqx_sys_mon:procinfo([])), - ok = meck:unload(emqx_vm). + ?assertEqual(undefined, emqx_sys_mon:procinfo([])). + +t_procinfo_initial_call_and_stacktrace(_) -> + SomePid = proc_lib:spawn(?MODULE, some_function, [self(), arg2]), + receive + {spawned, SomePid} -> + ok + after 100 -> + error(process_not_spawned) + end, + ProcInfo = emqx_sys_mon:procinfo(SomePid), + ?assertEqual( + {?MODULE, some_function, ['Argument__1','Argument__2']}, + proplists:get_value(proc_lib_initial_call, ProcInfo)), + ?assertMatch( + [{?MODULE, some_function, 2, + [{file, _}, + {line, _}]}, + {proc_lib, init_p_do_apply, 3, + [{file, _}, + {line, _}]}], + proplists:get_value(current_stacktrace, ProcInfo)), + SomePid ! stop. t_sys_mon(_Config) -> lists:foreach( @@ -120,3 +148,10 @@ validate_sys_mon_info(PidOrPort, SysMonName,ValidateInfo, InfoOrPort) -> concat_str(ValidateInfo, InfoOrPort, Info) -> WarnInfo = io_lib:format(ValidateInfo, [InfoOrPort, Info]), lists:flatten(WarnInfo). + +some_function(Parent, _Arg2) -> + Parent ! {spawned, self()}, + receive + stop -> + ok + end. From 64ce2eea1c35c6889770f0035b26574e3a6152a6 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 24 Nov 2021 16:29:25 -0300 Subject: [PATCH 08/23] chore(appup): run ./scripts/update_appup.escript to bump vsns --- .../src/emqx_auth_http.appup.src | 44 ++++----- apps/emqx_lwm2m/src/emqx_lwm2m.appup.src | 43 ++++----- apps/emqx_stomp/src/emqx_stomp.appup.src | 14 +-- .../emqx_web_hook/src/emqx_web_hook.appup.src | 14 ++- src/emqx.appup.src | 96 ++++++++++++++----- 5 files changed, 126 insertions(+), 85 deletions(-) diff --git a/apps/emqx_auth_http/src/emqx_auth_http.appup.src b/apps/emqx_auth_http/src/emqx_auth_http.appup.src index 8ebc195dd..208c655d1 100644 --- a/apps/emqx_auth_http/src/emqx_auth_http.appup.src +++ b/apps/emqx_auth_http/src/emqx_auth_http.appup.src @@ -1,26 +1,20 @@ -%% -*-: erlang -*- - +%% -*- mode: erlang -*- {VSN, - [ - {"4.3.2", [ - {apply, {application, stop, [emqx_auth_http]}}, - {load_module, emqx_auth_http_app, brutal_purge, soft_purge,[]}, - {load_module, emqx_auth_http_cli, brutal_purge, soft_purge,[]} - ]}, - {<<"4.3.[0-1]">>, [ - {restart_application, emqx_auth_http} - ]}, - {<<".*">>, []} - ], - [ - {"4.3.2", [ - {apply, {application, stop, [emqx_auth_http]}}, - {load_module, emqx_auth_http_app, brutal_purge, soft_purge,[]}, - {load_module, emqx_auth_http_cli, brutal_purge, soft_purge,[]} - ]}, - {<<"4.3.[0-1]">>, [ - {restart_application, emqx_auth_http} - ]}, - {<<".*">>, []} - ] -}. + [{"4.3.2", + [{apply,{application,stop,[emqx_auth_http]}}, + {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]}, + {<<"4.3.[0-1]">>, + [{load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}, + {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, + {restart_application,emqx_auth_http}]}, + {<<".*">>,[]}], + [{"4.3.2", + [{apply,{application,stop,[emqx_auth_http]}}, + {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]}, + {<<"4.3.[0-1]">>, + [{load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}, + {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, + {restart_application,emqx_auth_http}]}, + {<<".*">>,[]}]}. diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src b/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src index 6656eb149..73e451303 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src +++ b/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src @@ -1,27 +1,18 @@ -%% -*-: erlang -*- +%% -*- mode: erlang -*- {VSN, - [ - {<<"4\\.3\\.[0-1]">>, [ - {restart_application, emqx_lwm2m} - ]}, - {"4.3.2", [ - {load_module, emqx_lwm2m_message, brutal_purge, soft_purge, []} - ]}, - {"4.3.3", []}, %% only config change - {"4.3.4", [ - {load_module, emqx_lwm2m_protocol, brutal_purge, soft_purge, []} - ]} - ], - [ - {<<"4\\.3\\.[0-1]">>, [ - {restart_application, emqx_lwm2m} - ]}, - {"4.3.2", [ - {load_module, emqx_lwm2m_message, brutal_purge, soft_purge, []} - ]}, - {"4.3.3", []}, %% only config change - {"4.3.4", [ - {load_module, emqx_lwm2m_protocol, brutal_purge, soft_purge, []} - ]} - ] -}. + [{<<"4\\.3\\.[0-1]">>, + [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, + {restart_application,emqx_lwm2m}]}, + {"4.3.2", + [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, + {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, + {"4.3.3",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}, + {"4.3.4",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}], + [{<<"4\\.3\\.[0-1]">>, + [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, + {restart_application,emqx_lwm2m}]}, + {"4.3.2", + [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, + {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, + {"4.3.3",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}, + {"4.3.4",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}]}. diff --git a/apps/emqx_stomp/src/emqx_stomp.appup.src b/apps/emqx_stomp/src/emqx_stomp.appup.src index a29390bc1..8dc20e00d 100644 --- a/apps/emqx_stomp/src/emqx_stomp.appup.src +++ b/apps/emqx_stomp/src/emqx_stomp.appup.src @@ -1,17 +1,19 @@ %% -*- mode: erlang -*- {VSN, [{"4.3.2",[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}]}, - {"4.3.1",[ - {load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, + {"4.3.1", + [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{restart_application,emqx_stomp}, + [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, + {restart_application,emqx_stomp}, {apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]}, {<<".*">>,[]}], [{"4.3.2",[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}]}, - {"4.3.1",[ - {load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, + {"4.3.1", + [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{restart_application,emqx_stomp}]}, + [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, + {restart_application,emqx_stomp}]}, {<<".*">>,[]}]}. diff --git a/apps/emqx_web_hook/src/emqx_web_hook.appup.src b/apps/emqx_web_hook/src/emqx_web_hook.appup.src index 40bdfbdbf..5c801d24a 100644 --- a/apps/emqx_web_hook/src/emqx_web_hook.appup.src +++ b/apps/emqx_web_hook/src/emqx_web_hook.appup.src @@ -4,25 +4,31 @@ [{apply,{application,stop,[emqx_web_hook]}}, {load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, - {"4.3.5",[{load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, + {"4.3.5", + [{load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<"4.3.[0-2]">>, [{apply,{application,stop,[emqx_web_hook]}}, {load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<"4.3.[3-4]">>, - [{load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, + [{load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.7", [{apply,{application,stop,[emqx_web_hook]}}, {load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, - {"4.3.5",[{load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, + {"4.3.5", + [{load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<"4.3.[0-2]">>, [{apply,{application,stop,[emqx_web_hook]}}, {load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook,brutal_purge,soft_purge,[]}, {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<"4.3.[3-4]">>, - [{load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, + [{load_module,emqx_web_hook_app,brutal_purge,soft_purge,[]}, + {load_module,emqx_web_hook_actions,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}]}. diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 653249ccb..c510b3043 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -1,13 +1,19 @@ %% -*- mode: erlang -*- {VSN, [{"4.3.11", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]}, {"4.3.10", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.9", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -18,7 +24,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.8", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -29,7 +37,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.7", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -42,7 +52,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.6", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -56,7 +68,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.5", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, @@ -71,7 +85,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.4", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, @@ -87,7 +103,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.3", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, @@ -104,7 +122,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.2", - [{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_packet,brutal_purge,soft_purge,[]}, {load_module,emqx_shared_sub,brutal_purge,soft_purge,[]}, @@ -121,7 +141,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.1", - [{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_packet,brutal_purge,soft_purge,[]}, {load_module,emqx_shared_sub,brutal_purge,soft_purge,[]}, @@ -142,7 +164,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_mqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, @@ -168,13 +192,19 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.11", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}]}, {"4.3.10", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}]}, {"4.3.9", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -185,7 +215,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.8", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -196,7 +228,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.7", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -209,7 +243,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.6", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, @@ -223,7 +259,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.5", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, @@ -238,7 +276,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.4", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]}, @@ -254,7 +294,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.3", - [{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, @@ -271,7 +313,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.2", - [{load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_mqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, @@ -288,7 +332,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.1", - [{load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_mqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, @@ -309,7 +355,9 @@ {load_module,emqx_rpc,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, + [{load_module,emqx_vm,brutal_purge,soft_purge,[]}, + {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, + {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_packet,brutal_purge,soft_purge,[]}, {load_module,emqx_shared_sub,brutal_purge,soft_purge,[]}, From 5c693beadde5e4bf4042eadae5fd2d478431ef9e Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Thu, 25 Nov 2021 12:06:20 -0300 Subject: [PATCH 09/23] chore(appup): remove `load_module` instructions if `restart_application` > the restart_application instruction will be translated into module load instructions by otp release handler. --- apps/emqx_auth_http/src/emqx_auth_http.appup.src | 8 ++------ apps/emqx_lwm2m/src/emqx_lwm2m.appup.src | 6 ++---- apps/emqx_stomp/src/emqx_stomp.appup.src | 6 ++---- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/apps/emqx_auth_http/src/emqx_auth_http.appup.src b/apps/emqx_auth_http/src/emqx_auth_http.appup.src index 208c655d1..b6d11dd8c 100644 --- a/apps/emqx_auth_http/src/emqx_auth_http.appup.src +++ b/apps/emqx_auth_http/src/emqx_auth_http.appup.src @@ -5,16 +5,12 @@ {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]}, {<<"4.3.[0-1]">>, - [{load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}, - {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, - {restart_application,emqx_auth_http}]}, + [{restart_application,emqx_auth_http}]}, {<<".*">>,[]}], [{"4.3.2", [{apply,{application,stop,[emqx_auth_http]}}, {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]}, {<<"4.3.[0-1]">>, - [{load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}, - {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]}, - {restart_application,emqx_auth_http}]}, + [{restart_application,emqx_auth_http}]}, {<<".*">>,[]}]}. diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src b/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src index 73e451303..c2b7e7bc4 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src +++ b/apps/emqx_lwm2m/src/emqx_lwm2m.appup.src @@ -1,16 +1,14 @@ %% -*- mode: erlang -*- {VSN, [{<<"4\\.3\\.[0-1]">>, - [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, - {restart_application,emqx_lwm2m}]}, + [{restart_application,emqx_lwm2m}]}, {"4.3.2", [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, {"4.3.3",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}, {"4.3.4",[{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}]}], [{<<"4\\.3\\.[0-1]">>, - [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, - {restart_application,emqx_lwm2m}]}, + [{restart_application,emqx_lwm2m}]}, {"4.3.2", [{load_module,emqx_lwm2m_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_lwm2m_message,brutal_purge,soft_purge,[]}]}, diff --git a/apps/emqx_stomp/src/emqx_stomp.appup.src b/apps/emqx_stomp/src/emqx_stomp.appup.src index 8dc20e00d..0b5372dc9 100644 --- a/apps/emqx_stomp/src/emqx_stomp.appup.src +++ b/apps/emqx_stomp/src/emqx_stomp.appup.src @@ -5,8 +5,7 @@ [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, - {restart_application,emqx_stomp}, + [{restart_application,emqx_stomp}, {apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]}, {<<".*">>,[]}], [{"4.3.2",[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}]}, @@ -14,6 +13,5 @@ [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, {load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]}, {"4.3.0", - [{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]}, - {restart_application,emqx_stomp}]}, + [{restart_application,emqx_stomp}]}, {<<".*">>,[]}]}. From 0932920d3612a259c8f66710cb16bccfb1da32e9 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Thu, 25 Nov 2021 15:02:18 -0300 Subject: [PATCH 10/23] chore(appup): make update_appup.escript output only differences for external dependencies Currently, the update_appup.escript outputs as an error the full appup file for external dependencies, even if all the changes are already contained in the depency. Here, we make it only output the missing actions to be inserted, to aid in seeing what are the differences. --- scripts/update_appup.escript | 77 ++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 9fc8f618e..1de4ab899 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -99,8 +99,31 @@ main(Options, Baseline) -> [] -> ok; _ -> - set_invalid(), - log("ERROR: The appup files are incomplete. Missing changes:~n ~p", [AppupChanges]) + Diffs = + lists:filtermap( + fun({App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}) -> + DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), + DiffDown = diff_appup_instructions(Downgrade, OldDowngrade), + case {DiffUp, DiffDown} of + {[], []} -> + %% no diff for external dependency + false; + _ -> + Diffs = #{ up => DiffUp + , down => DiffDown + }, + {true, {App, Diffs}} + end + end, + AppupChanges), + case Diffs =:= [] of + true -> + ok; + false -> + set_invalid(), + log("ERROR: The appup files are incomplete. Missing changes:~n ~p", + [Diffs]) + end end; false -> update_appups(AppupChanges) @@ -189,9 +212,35 @@ find_appup_actions(App, CurrAppIdx, PrevAppIdx = #app{version = PrevVersion}) -> %% The appup file has been already updated: []; true -> - [{App, {Upgrade, Downgrade}}] + [{App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}] end. +%% For external dependencies, show only the changes that are missing +%% in their current appup. +diff_appup_instructions(ComputedChanges, PresentChanges) -> + lists:foldr( + fun({Vsn, ComputedActions}, Acc) -> + case find_matching_version(Vsn, PresentChanges) of + undefined -> + [{Vsn, ComputedActions} | Acc]; + PresentActions -> + DiffActions = ComputedActions -- PresentActions, + case DiffActions of + [] -> + %% no diff + Acc; + _ -> + [{Vsn, DiffActions} | Acc] + end + end + end, + [], + ComputedChanges). + +%% TODO: handle regexes +find_matching_version(Vsn, PresentChanges) -> + proplists:get_value(Vsn, PresentChanges). + find_old_appup_actions(App, PrevVersion) -> {Upgrade0, Downgrade0} = case locate(ebin_current, App, ".appup") of @@ -270,12 +319,12 @@ check_appup_files() -> update_appups(Changes) -> lists:foreach( - fun({App, {Upgrade, Downgrade}}) -> - do_update_appup(App, Upgrade, Downgrade) + fun({App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}) -> + do_update_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) end, Changes). -do_update_appup(App, Upgrade, Downgrade) -> +do_update_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) -> case locate(src, App, ".appup.src") of {ok, AppupFile} -> render_appfile(AppupFile, Upgrade, Downgrade); @@ -284,8 +333,20 @@ do_update_appup(App, Upgrade, Downgrade) -> {ok, AppupFile} -> render_appfile(AppupFile, Upgrade, Downgrade); false -> - set_invalid(), - log("ERROR: Appup file for the external dependency '~p' is not complete.~n Missing changes: ~p~n", [App, Upgrade]) + DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), + DiffDown = diff_appup_instructions(Downgrade, OldDowngrade), + case {DiffUp, DiffDown} of + {[], []} -> + %% no diff for external dependency; ignore + ok; + _ -> + set_invalid(), + Diffs = #{ up => DiffUp + , down => DiffDown + }, + log("ERROR: Appup file for the external dependency '~p' is not complete.~n Missing changes: ~100p~n", [App, Diffs]), + log("NOTE: Some changes above might be already covered by regexes.~n") + end end end. From 6eb919ea66c6042aad599fe6d2eebd90f41d8772 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Mon, 29 Nov 2021 14:20:57 +0800 Subject: [PATCH 11/23] chore(appup): bump ecpool to 0.5.2 --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 09e4d1e2b..82f029873 100644 --- a/rebar.config +++ b/rebar.config @@ -47,7 +47,7 @@ , {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.5.1"}}} , {cuttlefish, {git, "https://github.com/emqx/cuttlefish", {tag, "v3.3.6"}}} , {minirest, {git, "https://github.com/emqx/minirest", {tag, "0.3.7"}}} - , {ecpool, {git, "https://github.com/emqx/ecpool", {tag, "0.5.1"}}} + , {ecpool, {git, "https://github.com/emqx/ecpool", {tag, "0.5.2"}}} , {replayq, {git, "https://github.com/emqx/replayq", {tag, "0.3.2"}}} , {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {branch, "2.0.4"}}} , {emqtt, {git, "https://github.com/emqx/emqtt", {tag, "1.2.3.1"}}} From 93caddd448b75af2cc720da9a6e5bcae8fe70ae0 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Mon, 29 Nov 2021 10:23:54 -0300 Subject: [PATCH 12/23] refactor(review): factor out common functionality --- scripts/update_appup.escript | 42 +++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 1de4ab899..7674a941c 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -102,16 +102,11 @@ main(Options, Baseline) -> Diffs = lists:filtermap( fun({App, {Upgrade, Downgrade, OldUpgrade, OldDowngrade}}) -> - DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), - DiffDown = diff_appup_instructions(Downgrade, OldDowngrade), - case {DiffUp, DiffDown} of - {[], []} -> - %% no diff for external dependency + case parse_appup_diffs(Upgrade, OldUpgrade, + Downgrade, OldDowngrade) of + ok -> false; - _ -> - Diffs = #{ up => DiffUp - , down => DiffDown - }, + {diffs, Diffs} -> {true, {App, Diffs}} end end, @@ -237,6 +232,23 @@ diff_appup_instructions(ComputedChanges, PresentChanges) -> [], ComputedChanges). +%% For external dependencies, checks if any missing diffs are present +%% and groups them by `up' and `down' types. +parse_appup_diffs(Upgrade, OldUpgrade, Downgrade, OldDowngrade) -> + DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), + DiffDown = diff_appup_instructions(Downgrade, OldDowngrade), + case {DiffUp, DiffDown} of + {[], []} -> + %% no diff for external dependency; ignore + ok; + _ -> + set_invalid(), + Diffs = #{ up => DiffUp + , down => DiffDown + }, + {diffs, Diffs} + end. + %% TODO: handle regexes find_matching_version(Vsn, PresentChanges) -> proplists:get_value(Vsn, PresentChanges). @@ -333,17 +345,13 @@ do_update_appup(App, Upgrade, Downgrade, OldUpgrade, OldDowngrade) -> {ok, AppupFile} -> render_appfile(AppupFile, Upgrade, Downgrade); false -> - DiffUp = diff_appup_instructions(Upgrade, OldUpgrade), - DiffDown = diff_appup_instructions(Downgrade, OldDowngrade), - case {DiffUp, DiffDown} of - {[], []} -> + case parse_appup_diffs(Upgrade, OldUpgrade, + Downgrade, OldDowngrade) of + ok -> %% no diff for external dependency; ignore ok; - _ -> + {diffs, Diffs} -> set_invalid(), - Diffs = #{ up => DiffUp - , down => DiffDown - }, log("ERROR: Appup file for the external dependency '~p' is not complete.~n Missing changes: ~100p~n", [App, Diffs]), log("NOTE: Some changes above might be already covered by regexes.~n") end From 8aaa2e8333bbfbe49752fba8b9b2f28d0f3b7703 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 1 Dec 2021 17:00:07 +0800 Subject: [PATCH 13/23] feat(retainer): add option to stop publish clear message --- apps/emqx_retainer/etc/emqx_retainer.conf | 8 ++++++++ apps/emqx_retainer/priv/emqx_retainer.schema | 7 +++++++ apps/emqx_retainer/src/emqx_retainer.erl | 12 ++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/emqx_retainer/etc/emqx_retainer.conf b/apps/emqx_retainer/etc/emqx_retainer.conf index 0a883cee5..8b5c251c6 100644 --- a/apps/emqx_retainer/etc/emqx_retainer.conf +++ b/apps/emqx_retainer/etc/emqx_retainer.conf @@ -39,3 +39,11 @@ retainer.max_payload_size = 1MB ## ## Defaut: 0 retainer.expiry_interval = 0 + +## When the retained flag of the PUBLISH message is set and Payload is empty, +## whether to continue to publish the message. +## see: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718038 +## +## Value: Boolean +## Default: false +#retainer.stop_publish_clear_msg = false diff --git a/apps/emqx_retainer/priv/emqx_retainer.schema b/apps/emqx_retainer/priv/emqx_retainer.schema index e598864e1..5e998aa16 100644 --- a/apps/emqx_retainer/priv/emqx_retainer.schema +++ b/apps/emqx_retainer/priv/emqx_retainer.schema @@ -28,3 +28,10 @@ {default, 0}, {datatype, [integer, {duration, ms}]} ]}. + +%% Stop publish clear message +%% {$configurable} +{mapping, "retainer.stop_publish_clear_msg", "emqx_retainer.stop_publish_clear_msg", [ + {default, false}, + {datatype, {enum, [true, false]}} +]}. diff --git a/apps/emqx_retainer/src/emqx_retainer.erl b/apps/emqx_retainer/src/emqx_retainer.erl index 340e6929d..33220eb1f 100644 --- a/apps/emqx_retainer/src/emqx_retainer.erl +++ b/apps/emqx_retainer/src/emqx_retainer.erl @@ -83,9 +83,14 @@ dispatch(Pid, Topic) -> %% RETAIN flag set to 1 and payload containing zero bytes on_message_publish(Msg = #message{flags = #{retain := true}, topic = Topic, - payload = <<>>}, _Env) -> + payload = <<>>}, Env) -> mnesia:dirty_delete(?TAB, topic2tokens(Topic)), - {ok, Msg}; + case stop_publish_clear_msg(Env) of + true -> + {ok, emqx_message:set_header(allow_publish, false, Msg)}; + _ -> + {ok, Msg} + end; on_message_publish(Msg = #message{flags = #{retain := true}}, Env) -> Msg1 = emqx_message:set_header(retained, true, Msg), @@ -224,6 +229,9 @@ store_retained(Msg = #message{topic = Topic, payload = Payload}, Env) -> "for payload is too big!", [Topic, iolist_size(Payload)]) end. +stop_publish_clear_msg(Env) -> + proplists:get_bool(stop_publish_clear_msg, Env). + is_table_full(Env) -> Limit = proplists:get_value(max_retained_messages, Env, 0), Limit > 0 andalso (retained_count() > Limit). From e323b662854e81aeab52cdf7a3ec924b8692fcb3 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 1 Dec 2021 17:00:43 +0800 Subject: [PATCH 14/23] test(retainer): testcase for stop_publish_clear_msg --- apps/emqx_retainer/test/emqx_retainer_SUITE.erl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/emqx_retainer/test/emqx_retainer_SUITE.erl b/apps/emqx_retainer/test/emqx_retainer_SUITE.erl index 1df042dd9..28f667b53 100644 --- a/apps/emqx_retainer/test/emqx_retainer_SUITE.erl +++ b/apps/emqx_retainer/test/emqx_retainer_SUITE.erl @@ -42,6 +42,8 @@ init_per_testcase(TestCase, Config) -> case TestCase of t_message_expiry_2 -> application:set_env(emqx_retainer, expiry_interval, 2000); + t_stop_publish_clear_msg -> + application:set_env(emqx_retainer, stop_publish_clear_msg, true); _ -> application:set_env(emqx_retainer, expiry_interval, 0) end, @@ -173,6 +175,19 @@ t_clean(_) -> ok = emqtt:disconnect(C1). +t_stop_publish_clear_msg(_) -> + {ok, C1} = emqtt:start_link([{clean_start, true}, {proto_ver, v5}]), + {ok, _} = emqtt:connect(C1), + emqtt:publish(C1, <<"retained/0">>, <<"this is a retained message 0">>, [{qos, 0}, {retain, true}]), + + {ok, #{}, [0]} = emqtt:subscribe(C1, <<"retained/#">>, [{qos, 0}, {rh, 0}]), + ?assertEqual(1, length(receive_messages(1))), + + emqtt:publish(C1, <<"retained/0">>, <<"">>, [{qos, 0}, {retain, true}]), + ?assertEqual(0, length(receive_messages(1))), + + ok = emqtt:disconnect(C1). + %%-------------------------------------------------------------------- %% Helper functions %%-------------------------------------------------------------------- From 10ffe11ba09ee0787b133c2246fe44033ce0ab8b Mon Sep 17 00:00:00 2001 From: JianBo He Date: Wed, 1 Dec 2021 17:05:52 +0800 Subject: [PATCH 15/23] chore(retainer): update appup.src --- apps/emqx_retainer/src/emqx_retainer.app.src | 2 +- apps/emqx_retainer/src/emqx_retainer.appup.src | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_retainer/src/emqx_retainer.app.src b/apps/emqx_retainer/src/emqx_retainer.app.src index c3ffb9f90..c5ca7599d 100644 --- a/apps/emqx_retainer/src/emqx_retainer.app.src +++ b/apps/emqx_retainer/src/emqx_retainer.app.src @@ -1,6 +1,6 @@ {application, emqx_retainer, [{description, "EMQ X Retainer"}, - {vsn, "4.3.1"}, % strict semver, bump manually! + {vsn, "4.3.2"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_retainer_sup]}, {applications, [kernel,stdlib]}, diff --git a/apps/emqx_retainer/src/emqx_retainer.appup.src b/apps/emqx_retainer/src/emqx_retainer.appup.src index a17e6ee2f..19e8e835f 100644 --- a/apps/emqx_retainer/src/emqx_retainer.appup.src +++ b/apps/emqx_retainer/src/emqx_retainer.appup.src @@ -1,13 +1,13 @@ %% -*-: erlang -*- {VSN, [ - {"4.3.0", [ + {<<"4\\.3\\.[0-1]+">>, [ {load_module, emqx_retainer, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} ], [ - {"4.3.0", [ + {<<"4\\.3\\.[0-1]+">>, [ {load_module, emqx_retainer, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} From 41a547d36dd651e600ec87d7c4c0f1571cfe5a1b Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 2 Dec 2021 14:09:43 +0800 Subject: [PATCH 16/23] fix: e4.4.0 failed to join e4.3.0 cluster --- apps/emqx_sn/src/emqx_sn_registry.erl | 34 ++++++++------------ apps/emqx_sn/test/emqx_sn_registry_SUITE.erl | 3 +- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/apps/emqx_sn/src/emqx_sn_registry.erl b/apps/emqx_sn/src/emqx_sn_registry.erl index 4a3b22585..c97a49f5a 100644 --- a/apps/emqx_sn/src/emqx_sn_registry.erl +++ b/apps/emqx_sn/src/emqx_sn_registry.erl @@ -44,32 +44,16 @@ , code_change/3 ]). +-ifdef(TEST). +-export([create_table/0]). +-endif. + -define(TAB, ?MODULE). -record(state, {max_predef_topic_id = 0}). -record(emqx_sn_registry, {key, value}). -%% Mnesia bootstrap --export([mnesia/1]). - --boot_mnesia({mnesia, [boot]}). --copy_mnesia({mnesia, [copy]}). - - -%% @doc Create or replicate tables. --spec(mnesia(boot | copy) -> ok). -mnesia(boot) -> - %% Optimize storage - StoreProps = [{ets, [{read_concurrency, true}]}], - ok = ekka_mnesia:create_table(?MODULE, [ - {attributes, record_info(fields, emqx_sn_registry)}, - {ram_copies, [node()]}, - {storage_properties, StoreProps}]); - -mnesia(copy) -> - ok = ekka_mnesia:copy_table(?MODULE, ram_copies). - %%----------------------------------------------------------------------------- -spec(start_link(list()) -> {ok, pid()} | ignore | {error, Reason :: term()}). @@ -123,6 +107,7 @@ unregister_topic(ClientId) -> %%----------------------------------------------------------------------------- init([PredefTopics]) -> + create_table(), %% {predef, TopicId} -> TopicName %% {predef, TopicName} -> TopicId %% {ClientId, TopicId} -> TopicName @@ -137,6 +122,15 @@ init([PredefTopics]) -> end, 0, PredefTopics), {ok, #state{max_predef_topic_id = MaxPredefId}}. +create_table() -> + %% Optimize storage + StoreProps = [{ets, [{read_concurrency, true}]}], + ok = ekka_mnesia:create_table(?MODULE, [ + {attributes, record_info(fields, emqx_sn_registry)}, + {ram_copies, [node()]}, + {storage_properties, StoreProps}]), + ok = ekka_mnesia:copy_table(?MODULE, ram_copies). + handle_call({register, ClientId, TopicName}, _From, State = #state{max_predef_topic_id = PredefId}) -> case lookup_topic_id(ClientId, TopicName) of diff --git a/apps/emqx_sn/test/emqx_sn_registry_SUITE.erl b/apps/emqx_sn/test/emqx_sn_registry_SUITE.erl index 8d320d8ed..023d83ae5 100644 --- a/apps/emqx_sn/test/emqx_sn_registry_SUITE.erl +++ b/apps/emqx_sn/test/emqx_sn_registry_SUITE.erl @@ -42,7 +42,7 @@ end_per_suite(_Config) -> init_per_testcase(_TestCase, Config) -> ekka_mnesia:start(), - emqx_sn_registry:mnesia(boot), + emqx_sn_registry:create_table(), mnesia:clear_table(emqx_sn_registry), PredefTopics = application:get_env(emqx_sn, predefined, []), {ok, _Pid} = ?REGISTRY:start_link(PredefTopics), @@ -118,4 +118,3 @@ register_a_lot(N, Max) when N < Max -> Topic = iolist_to_binary(["Topic", integer_to_list(N)]), ?assertEqual(N, ?REGISTRY:register_topic(<<"ClientId">>, Topic)), register_a_lot(N+1, Max). - From f14a9d7da656c8b4ee7d72d0d6bb639af6fd2acf Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Thu, 2 Dec 2021 16:36:31 +0800 Subject: [PATCH 17/23] chore: bump emqx_sn to 4.3.4 --- apps/emqx_sn/src/emqx_sn.app.src | 2 +- apps/emqx_sn/src/emqx_sn.appup.src | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/emqx_sn/src/emqx_sn.app.src b/apps/emqx_sn/src/emqx_sn.app.src index c48a76496..a36166eae 100644 --- a/apps/emqx_sn/src/emqx_sn.app.src +++ b/apps/emqx_sn/src/emqx_sn.app.src @@ -1,6 +1,6 @@ {application, emqx_sn, [{description, "EMQ X MQTT-SN Plugin"}, - {vsn, "4.3.3"}, % strict semver, bump manually! + {vsn, "4.3.4"}, % strict semver, bump manually! {modules, []}, {registered, []}, {applications, [kernel,stdlib,esockd]}, diff --git a/apps/emqx_sn/src/emqx_sn.appup.src b/apps/emqx_sn/src/emqx_sn.appup.src index 2bd6f5646..0fbd16b1b 100644 --- a/apps/emqx_sn/src/emqx_sn.appup.src +++ b/apps/emqx_sn/src/emqx_sn.appup.src @@ -1,18 +1,24 @@ %% -*-: erlang -*- {VSN, [ - {"4.3.2", [ - {load_module, emqx_sn_gateway, brutal_purge, soft_purge, []} - ]}, - {<<"4.3.[0-1]">>, [ + {"4.3.3", [ + {load_module, emqx_sn_registry, brutal_purge, soft_purge, []} + ]}, + {"4.3.2", [ + {load_module, emqx_sn_gateway, brutal_purge, soft_purge, []} + ]}, + {<<"4\\.3\\.[0-1]">>, [ {restart_application, emqx_sn} ]} ], [ - {"4.3.2", [ - {load_module, emqx_sn_gateway, brutal_purge, soft_purge, []} + {"4.3.3", [ + {load_module, emqx_sn_registry, brutal_purge, soft_purge, []} ]}, - {<<"4.3.[0-1]">>, [ + {"4.3.2", [ + {load_module, emqx_sn_gateway, brutal_purge, soft_purge, []} + ]}, + {<<"4\\.3\\.[0-1]">>, [ {restart_application, emqx_sn} ]} ] From ef6f867304949786e7a15c9c2b77d2d4f622005e Mon Sep 17 00:00:00 2001 From: JianBo He Date: Thu, 2 Dec 2021 18:01:36 +0800 Subject: [PATCH 18/23] chore(conn): change terminated print to debug level --- src/emqx_connection.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqx_connection.erl b/src/emqx_connection.erl index b8d1c485d..5dfb3e220 100644 --- a/src/emqx_connection.erl +++ b/src/emqx_connection.erl @@ -517,7 +517,7 @@ terminate(Reason, State = #state{channel = Channel, transport = Transport, E : C : S -> ?tp(warning, unclean_terminate, #{exception => E, context => C, stacktrace => S}) end, - ?tp(info, terminate, #{reason => Reason}), + ?tp(debug, terminate, #{reason => Reason}), maybe_raise_excption(Reason). %% close socket, discard new state, always return ok. From 3d308cf5a2017ad4c96ed5ff4e25a80746a915b4 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Mon, 6 Dec 2021 09:21:13 -0300 Subject: [PATCH 19/23] chore(ekka): bump ekka to 0.8.1.6 We're doing this to remove some missing change warnings when updating emqx v4.3.10. Ekka's appup was updated in emqx/ekka#140 . --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 82f029873..bb9a48807 100644 --- a/rebar.config +++ b/rebar.config @@ -43,7 +43,7 @@ , {jiffy, {git, "https://github.com/emqx/jiffy", {tag, "1.0.5"}}} , {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.8.2"}}} , {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.8.0"}}} - , {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.8.1.5"}}} + , {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.8.1.6"}}} , {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.5.1"}}} , {cuttlefish, {git, "https://github.com/emqx/cuttlefish", {tag, "v3.3.6"}}} , {minirest, {git, "https://github.com/emqx/minirest", {tag, "0.3.7"}}} From ceed9678e3ab26d2bd2500245fa2022c480cc796 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Fri, 3 Dec 2021 15:26:33 +0800 Subject: [PATCH 20/23] fix(mgmt): node memory usage info --- apps/emqx_management/src/emqx_mgmt.erl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt.erl b/apps/emqx_management/src/emqx_mgmt.erl index bfba34603..5c17bdd7b 100644 --- a/apps/emqx_management/src/emqx_mgmt.erl +++ b/apps/emqx_management/src/emqx_mgmt.erl @@ -139,7 +139,7 @@ node_info(Node) when Node =:= node() -> Info#{node => node(), otp_release => iolist_to_binary(otp_rel()), memory_total => proplists:get_value(allocated, Memory), - memory_used => proplists:get_value(total, Memory), + memory_used => proplists:get_value(used, Memory), process_available => erlang:system_info(process_limit), process_used => erlang:system_info(process_count), max_fds => proplists:get_value(max_fds, lists:usort(lists:flatten(erlang:system_info(check_io)))), @@ -570,5 +570,3 @@ max_row_limit() -> application:get_env(?APP, max_row_limit, ?MAX_ROW_LIMIT). table_size(Tab) -> ets:info(Tab, size). - - From c5e28bd32b004d2dd55aa1e30bf2613397ee3125 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Thu, 25 Nov 2021 14:41:40 +0800 Subject: [PATCH 21/23] fix(vm): add literal_alloc memory calculation --- src/emqx_vm.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/emqx_vm.erl b/src/emqx_vm.erl index dc841229a..ae8e4c3e7 100644 --- a/src/emqx_vm.erl +++ b/src/emqx_vm.erl @@ -58,6 +58,7 @@ sl_alloc, ll_alloc, fix_alloc, + literal_alloc, std_alloc ]). From 14aa408b5e80534a17f7e2b802f566e6688b2073 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 6 Dec 2021 18:09:16 +0800 Subject: [PATCH 22/23] style: make elvis happy --- apps/emqx_management/src/emqx_mgmt.erl | 48 ++++++++++++++++---------- src/emqx_vm.erl | 11 +++--- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt.erl b/apps/emqx_management/src/emqx_mgmt.erl index 5c17bdd7b..39595b104 100644 --- a/apps/emqx_management/src/emqx_mgmt.erl +++ b/apps/emqx_management/src/emqx_mgmt.erl @@ -120,6 +120,7 @@ -define(APP, emqx_management). +-elvis([{elvis_style, god_modules, disable}]). %%-------------------------------------------------------------------- %% Node Info %%-------------------------------------------------------------------- @@ -142,7 +143,9 @@ node_info(Node) when Node =:= node() -> memory_used => proplists:get_value(used, Memory), process_available => erlang:system_info(process_limit), process_used => erlang:system_info(process_count), - max_fds => proplists:get_value(max_fds, lists:usort(lists:flatten(erlang:system_info(check_io)))), + max_fds => + proplists:get_value( max_fds + , lists:usort(lists:flatten(erlang:system_info(check_io)))), connections => ets:info(emqx_channel, size), node_status => 'Running', uptime => iolist_to_binary(proplists:get_value(uptime, BrokerInfo)), @@ -196,10 +199,12 @@ get_stats(Node) -> %%-------------------------------------------------------------------- lookup_client({clientid, ClientId}, FormatFun) -> - lists:append([lookup_client(Node, {clientid, ClientId}, FormatFun) || Node <- ekka_mnesia:running_nodes()]); + lists:append([lookup_client(Node, {clientid, ClientId}, FormatFun) + || Node <- ekka_mnesia:running_nodes()]); lookup_client({username, Username}, FormatFun) -> - lists:append([lookup_client(Node, {username, Username}, FormatFun) || Node <- ekka_mnesia:running_nodes()]). + lists:append([lookup_client(Node, {username, Username}, FormatFun) + || Node <- ekka_mnesia:running_nodes()]). lookup_client(Node, {clientid, ClientId}, {M,F}) when Node =:= node() -> lists:append(lists:map( @@ -222,10 +227,7 @@ lookup_client(Node, {username, Username}, FormatFun) -> kickout_client(ClientId) -> Results = [kickout_client(Node, ClientId) || Node <- ekka_mnesia:running_nodes()], - case lists:any(fun(Item) -> Item =:= ok end, Results) of - true -> ok; - false -> lists:last(Results) - end. + check_every_ok(Results). kickout_client(Node, ClientId) when Node =:= node() -> emqx_cm:kick_session(ClientId); @@ -238,10 +240,7 @@ list_acl_cache(ClientId) -> clean_acl_cache(ClientId) -> Results = [clean_acl_cache(Node, ClientId) || Node <- ekka_mnesia:running_nodes()], - case lists:any(fun(Item) -> Item =:= ok end, Results) of - true -> ok; - false -> lists:last(Results) - end. + check_every_ok(Results). clean_acl_cache(Node, ClientId) when Node =:= node() -> case emqx_cm:lookup_channels(ClientId) of @@ -281,7 +280,7 @@ call_client(ClientId, Req) -> end, Results), case Expected of [] -> {error, not_found}; - [Result|_] -> Result + [Result | _] -> Result end. %% @private @@ -292,7 +291,7 @@ call_client(Node, ClientId, Req) when Node =:= node() -> Pid = lists:last(Pids), case emqx_cm:get_chan_info(ClientId, Pid) of #{conninfo := #{conn_mod := ConnMod}} -> - ConnMod:call(Pid, Req); + erlang:apply(ConnMod, call, [Pid, Req]); undefined -> {error, not_found} end end; @@ -313,11 +312,12 @@ list_subscriptions(Node) -> rpc_call(Node, list_subscriptions, [Node]). list_subscriptions_via_topic(Topic, FormatFun) -> - lists:append([list_subscriptions_via_topic(Node, Topic, FormatFun) || Node <- ekka_mnesia:running_nodes()]). + lists:append([list_subscriptions_via_topic(Node, Topic, FormatFun) + || Node <- ekka_mnesia:running_nodes()]). list_subscriptions_via_topic(Node, Topic, {M,F}) when Node =:= node() -> MatchSpec = [{{{'_', '$1'}, '_'}, [{'=:=','$1', Topic}], ['$_']}], - M:F(ets:select(emqx_suboption, MatchSpec)); + erlang:apply(M, F, [ets:select(emqx_suboption, MatchSpec)]); list_subscriptions_via_topic(Node, Topic, FormatFun) -> rpc_call(Node, list_subscriptions_via_topic, [Node, Topic, FormatFun]). @@ -436,7 +436,8 @@ list_listeners(Node) when Node =:= node() -> Http = lists:map(fun({Protocol, Opts}) -> #{protocol => Protocol, listen_on => proplists:get_value(port, Opts), - acceptors => maps:get(num_acceptors, proplists:get_value(transport_options, Opts, #{}), 0), + acceptors => maps:get( num_acceptors + , proplists:get_value(transport_options, Opts, #{}), 0), max_conns => proplists:get_value(max_connections, Opts), current_conns => proplists:get_value(all_connections, Opts), shutdown_count => []} @@ -483,9 +484,12 @@ add_duration_field(Alarms) -> add_duration_field([], _Now, Acc) -> Acc; -add_duration_field([Alarm = #{activated := true, activate_at := ActivateAt}| Rest], Now, Acc) -> +add_duration_field([Alarm = #{activated := true, activate_at := ActivateAt} | Rest], Now, Acc) -> add_duration_field(Rest, Now, [Alarm#{duration => Now - ActivateAt} | Acc]); -add_duration_field([Alarm = #{activated := false, activate_at := ActivateAt, deactivate_at := DeactivateAt}| Rest], Now, Acc) -> +add_duration_field([Alarm = #{ activated := false + , activate_at := ActivateAt + , deactivate_at := DeactivateAt} + | Rest], Now, Acc) -> add_duration_field(Rest, Now, [Alarm#{duration => DeactivateAt - ActivateAt} | Acc]). %%-------------------------------------------------------------------- @@ -560,12 +564,18 @@ check_row_limit(Tables) -> check_row_limit([], _Limit) -> ok; -check_row_limit([Tab|Tables], Limit) -> +check_row_limit([Tab | Tables], Limit) -> case table_size(Tab) > Limit of true -> false; false -> check_row_limit(Tables, Limit) end. +check_every_ok(Results) -> + case lists:any(fun(Item) -> Item =:= ok end, Results) of + true -> ok; + false -> lists:last(Results) + end. + max_row_limit() -> application:get_env(?APP, max_row_limit, ?MAX_ROW_LIMIT). diff --git a/src/emqx_vm.erl b/src/emqx_vm.erl index ae8e4c3e7..adcbcabb0 100644 --- a/src/emqx_vm.erl +++ b/src/emqx_vm.erl @@ -318,7 +318,8 @@ get_process_gc_info(Pid) when is_pid(Pid) -> process_info(Pid, ?PROCESS_GC_KEYS). get_process_group_leader_info(LeaderPid) when is_pid(LeaderPid) -> - [{Key, Value}|| {Key, Value} <- process_info(LeaderPid), lists:member(Key, ?PROCESS_INFO_KEYS)]. + [{Key, Value} + || {Key, Value} <- process_info(LeaderPid), lists:member(Key, ?PROCESS_INFO_KEYS)]. get_process_limit() -> erlang:system_info(process_limit). @@ -340,12 +341,12 @@ get_ets_info(Tab) -> mapping(Entries) -> mapping(Entries, []). mapping([], Acc) -> Acc; -mapping([{owner, V}|Entries], Acc) when is_pid(V) -> +mapping([{owner, V} | Entries], Acc) when is_pid(V) -> OwnerInfo = process_info(V), Owner = proplists:get_value(registered_name, OwnerInfo, undefined), - mapping(Entries, [{owner, Owner}|Acc]); -mapping([{Key, Value}|Entries], Acc) -> - mapping(Entries, [{Key, Value}|Acc]). + mapping(Entries, [{owner, Owner} | Acc]); +mapping([{Key, Value} | Entries], Acc) -> + mapping(Entries, [{Key, Value} | Acc]). avg1() -> compat_windows(fun cpu_sup:avg1/0). From dc2c17826ed34464229e269c55389cb1cae99beb Mon Sep 17 00:00:00 2001 From: JimMoen Date: Mon, 6 Dec 2021 18:22:08 +0800 Subject: [PATCH 23/23] chore(appup): update appup.src --- apps/emqx_management/src/emqx_management.app.src | 2 +- apps/emqx_management/src/emqx_management.appup.src | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_management/src/emqx_management.app.src b/apps/emqx_management/src/emqx_management.app.src index 405b4c244..23f58c94a 100644 --- a/apps/emqx_management/src/emqx_management.app.src +++ b/apps/emqx_management/src/emqx_management.app.src @@ -1,6 +1,6 @@ {application, emqx_management, [{description, "EMQ X Management API and CLI"}, - {vsn, "4.3.8"}, % strict semver, bump manually! + {vsn, "4.3.9"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_management_sup]}, {applications, [kernel,stdlib,minirest]}, diff --git a/apps/emqx_management/src/emqx_management.appup.src b/apps/emqx_management/src/emqx_management.appup.src index e50724d6d..f0478add1 100644 --- a/apps/emqx_management/src/emqx_management.appup.src +++ b/apps/emqx_management/src/emqx_management.appup.src @@ -1,13 +1,13 @@ %% -*- mode: erlang -*- {VSN, - [ {<<"4\\.3\\.[0-7]+">>, + [ {<<"4\\.3\\.[0-8]+">>, [ {apply,{minirest,stop_http,['http:management']}}, {apply,{minirest,stop_http,['https:management']}}, {restart_application, emqx_management} ]}, {<<".*">>, []} ], - [ {<<"4\\.3\\.[0-7]+">>, + [ {<<"4\\.3\\.[0-8]+">>, [ {apply,{minirest,stop_http,['http:management']}}, {apply,{minirest,stop_http,['https:management']}}, {restart_application, emqx_management}