From 377f01e038016620fd1652d888aebd756a59dc17 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 10:53:10 +0100 Subject: [PATCH 01/84] refactor(xref): Add xref Makefile target --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index d82263f98..f0de0fd55 100644 --- a/Makefile +++ b/Makefile @@ -66,5 +66,9 @@ else endif $(REBAR) as $(@:deps-%=%) get-deps +.PHONY: xref +xref: + $(REBAR) as test xref + include packages.mk include docker.mk From 75645950f954e3a9518559eda68a7400e6db38f1 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 13:28:24 +0100 Subject: [PATCH 02/84] chore(xref): Ignore xref checks for enterprise modules Schema registry is so far only used in enterprise edition. --- rebar.config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rebar.config b/rebar.config index acaa17a35..4ce151a5b 100644 --- a/rebar.config +++ b/rebar.config @@ -49,3 +49,13 @@ , {rulesql, {git, "https://github.com/emqx/rulesql", {tag, "0.1.2"}}} , {getopt, "1.0.1"} ]}. + +{xref_ignores, + [ %% schema registry is for enterprise + {emqx_schema_registry,get_all_schemas,0}, + {emqx_schema_api,format_schema,1}, + {emqx_schema_api,make_schema_params,1}, + {emqx_schema_parser,decode,3}, + {emqx_schema_parser,encode,3}, + {emqx_schema_registry,add_schema,1} +]}. From 8a86593cae45102f0505a92d43ff2c950390577d Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 13:30:05 +0100 Subject: [PATCH 03/84] fix(xref): Ignore xref for generated modules for protobuf --- rebar.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index 4ce151a5b..8999d9e97 100644 --- a/rebar.config +++ b/rebar.config @@ -57,5 +57,7 @@ {emqx_schema_api,make_schema_params,1}, {emqx_schema_parser,decode,3}, {emqx_schema_parser,encode,3}, - {emqx_schema_registry,add_schema,1} + {emqx_schema_registry,add_schema,1}, + emqx_exhook_pb, % generated code for protobuf + emqx_exproto_pb % generated code for protobuf ]}. From ecf69b34649e614b5bf235d7c9e7e0f87e91fb8f Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 13:43:13 +0100 Subject: [PATCH 04/84] chore(emqx_lwm2m): Add TEST compiler condition for test code --- apps/emqx_lwm2m/src/emqx_lwm2m_tlv.erl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_tlv.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_tlv.erl index 3cc333849..9288f89fb 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_tlv.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_tlv.erl @@ -20,6 +20,11 @@ , encode/1 ]). + +-ifdef(TEST). +-export([binary_to_hex_string/1]). +-endif. + -include("emqx_lwm2m.hrl"). -define(LOG(Level, Format, Args), logger:Level("LWM2M-TLV: " ++ Format, Args)). From 558f28ba27f711da9bca6e029b151f1bc4f772e4 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 19:22:40 +0100 Subject: [PATCH 05/84] refactor(build): Add dialyzer Makefile target --- .github/workflows/run_test_case.yaml | 4 ++-- Makefile | 14 +++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/run_test_case.yaml b/.github/workflows/run_test_case.yaml index ef49d8696..0384af554 100644 --- a/.github/workflows/run_test_case.yaml +++ b/.github/workflows/run_test_case.yaml @@ -7,10 +7,10 @@ jobs: run_test_case: runs-on: ubuntu-latest - + container: image: erlang:22.1 - + steps: - uses: actions/checkout@v1 - name: Code dialyzer diff --git a/Makefile b/Makefile index f0de0fd55..7180e36d8 100644 --- a/Makefile +++ b/Makefile @@ -19,14 +19,6 @@ ensure-rebar3: $(REBAR): ensure-rebar3 -.PHONY: xref -xref: - $(REBAR) xref - -.PHONY: dialyzer -dialyzer: - $(REBAR) dialyzer - .PHONY: distclean distclean: @rm -rf _build @@ -67,8 +59,12 @@ endif $(REBAR) as $(@:deps-%=%) get-deps .PHONY: xref -xref: +xref: $(REBAR) $(REBAR) as test xref +.PHONY: dialyzer +dialyzer: $(REBAR) + $(REBAR) as test dialyzer + include packages.mk include docker.mk From 996b205299384a9abb5d4086eb5f3cbda420a077 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 20:10:13 +0100 Subject: [PATCH 06/84] fix(telemetry): Fix dialyzer warning in emqx_telemetry_api --- apps/emqx_telemetry/src/emqx_telemetry_api.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_telemetry/src/emqx_telemetry_api.erl b/apps/emqx_telemetry/src/emqx_telemetry_api.erl index dfbb42d54..afbc690f4 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry_api.erl +++ b/apps/emqx_telemetry/src/emqx_telemetry_api.erl @@ -103,7 +103,7 @@ get_data(_Bindings, _Params) -> return(get_telemetry_data()). enable_telemetry() -> - [enable_telemetry(Node) || Node <- ekka_mnesia:running_nodes()], ok. + lists:foreach(fun enable_telemetry/1, ekka_mnesia:running_nodes()). enable_telemetry(Node) when Node =:= node() -> emqx_telemetry:enable(); @@ -111,7 +111,7 @@ enable_telemetry(Node) -> rpc_call(Node, ?MODULE, enable_telemetry, [Node]). disable_telemetry() -> - [disable_telemetry(Node) || Node <- ekka_mnesia:running_nodes()], ok. + lists:foreach(fun disable_telemetry/1, ekka_mnesia:running_nodes()). disable_telemetry(Node) when Node =:= node() -> emqx_telemetry:disable(); @@ -128,4 +128,4 @@ rpc_call(Node, Module, Fun, Args) -> case rpc:call(Node, Module, Fun, Args) of {badrpc, Reason} -> {error, Reason}; Result -> Result - end. \ No newline at end of file + end. From bcae92ae6de2ed0bc0fbc8cb3caede8b382ccb9a Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 3 Nov 2020 21:34:06 +0100 Subject: [PATCH 07/84] fix(telemetry): Fix dialyzer warning about mnesia dirty op race --- apps/emqx_telemetry/src/emqx_telemetry.erl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/emqx_telemetry/src/emqx_telemetry.erl b/apps/emqx_telemetry/src/emqx_telemetry.erl index 0dbb2fc19..e98e08c90 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry.erl +++ b/apps/emqx_telemetry/src/emqx_telemetry.erl @@ -132,6 +132,12 @@ get_telemetry() -> %% gen_server callbacks %%-------------------------------------------------------------------- +%% This is to suppress dialyzer warnings for mnesia:dirty_write and +%% dirty_read race condition. Given that the init function is not evaluated +%% concurrently in one node, it should be free of race condition. +%% Given the chance of having two nodes bootstraping with the write +%% is very small, it should be safe to ignore. +-dialyzer([{nowarn_function, [init/1]}]). init([Opts]) -> State = #state{url = get_value(url, Opts), report_interval = timer:seconds(get_value(report_interval, Opts))}, @@ -409,4 +415,4 @@ module_attributes(Module) -> bin(L) when is_list(L) -> list_to_binary(L); bin(B) when is_binary(B) -> - B. \ No newline at end of file + B. From 760ef9210a76de98efb21980616168ad7ba4fdf3 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 13:07:42 +0100 Subject: [PATCH 08/84] fix(stomp): Fix dialyzer warnings --- apps/emqx_stomp/include/emqx_stomp.hrl | 2 +- apps/emqx_stomp/src/emqx_stomp_frame.erl | 6 +++++- apps/emqx_stomp/src/emqx_stomp_protocol.erl | 19 +++++++++---------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/emqx_stomp/include/emqx_stomp.hrl b/apps/emqx_stomp/include/emqx_stomp.hrl index 504191110..e2eeee7d8 100644 --- a/apps/emqx_stomp/include/emqx_stomp.hrl +++ b/apps/emqx_stomp/include/emqx_stomp.hrl @@ -24,7 +24,7 @@ %% STOMP Frame %%-------------------------------------------------------------------- --record(stomp_frame, {command, headers = [], body = <<>> :: iolist()}). +-record(stomp_frame, {command, headers = [], body = <<>> :: iodata()}). -type(stomp_frame() :: #stomp_frame{}). diff --git a/apps/emqx_stomp/src/emqx_stomp_frame.erl b/apps/emqx_stomp/src/emqx_stomp_frame.erl index e5795335a..20bbf513d 100644 --- a/apps/emqx_stomp/src/emqx_stomp_frame.erl +++ b/apps/emqx_stomp/src/emqx_stomp_frame.erl @@ -87,7 +87,11 @@ -define(IS_ESC(Ch), Ch == ?CR; Ch == ?LF; Ch == ?BSL; Ch == ?COLON). --record(parser_state, {cmd, headers = [], hdname, acc = <<>>, limit}). +-record(parser_state, {cmd, + headers = [], + hdname, + acc = <<>> :: binary(), + limit}). -record(frame_limit, {max_header_num, max_header_length, max_body_length}). diff --git a/apps/emqx_stomp/src/emqx_stomp_protocol.erl b/apps/emqx_stomp/src/emqx_stomp_protocol.erl index fa75f08e3..ff49cd381 100644 --- a/apps/emqx_stomp/src/emqx_stomp_protocol.erl +++ b/apps/emqx_stomp/src/emqx_stomp_protocol.erl @@ -99,12 +99,12 @@ received(#stomp_frame{command = <<"CONNECT">>, headers = Headers}, send(connected_frame([{<<"version">>, Version}, {<<"heart-beat">>, reverse_heartbeats(Heartbeats)}]), NewState); false -> - send(error_frame(undefined, <<"Login or passcode error!">>), State), + _ = send(error_frame(undefined, <<"Login or passcode error!">>), State), {error, login_or_passcode_error, State} end; {error, Msg} -> - send(error_frame([{<<"version">>, <<"1.0,1.1,1.2">>}, - {<<"content-type">>, <<"text/plain">>}], undefined, Msg), State), + _ = send(error_frame([{<<"version">>, <<"1.0,1.1,1.2">>}, + {<<"content-type">>, <<"text/plain">>}], undefined, Msg), State), {error, unsupported_version, State} end; @@ -114,10 +114,9 @@ received(#stomp_frame{command = <<"CONNECT">>}, State = #stomp_proto{connected = received(#stomp_frame{command = <<"SEND">>, headers = Headers, body = Body}, State) -> Topic = header(<<"destination">>, Headers), Action = fun(State0) -> - maybe_send_receipt(receipt_id(Headers), State0), - emqx_broker:publish( - make_mqtt_message(Topic, Headers, iolist_to_binary(Body)) - ), + _ = maybe_send_receipt(receipt_id(Headers), State0), + _ = emqx_broker:publish( + make_mqtt_message(Topic, Headers, iolist_to_binary(Body))), State0 end, case header(<<"transaction">>, Headers) of @@ -160,7 +159,7 @@ received(#stomp_frame{command = <<"UNSUBSCRIBE">>, headers = Headers}, received(#stomp_frame{command = <<"ACK">>, headers = Headers}, State) -> Id = header(<<"id">>, Headers), Action = fun(State0) -> - maybe_send_receipt(receipt_id(Headers), State0), + _ = maybe_send_receipt(receipt_id(Headers), State0), ack(Id, State0) end, case header(<<"transaction">>, Headers) of @@ -176,7 +175,7 @@ received(#stomp_frame{command = <<"ACK">>, headers = Headers}, State) -> received(#stomp_frame{command = <<"NACK">>, headers = Headers}, State) -> Id = header(<<"id">>, Headers), Action = fun(State0) -> - maybe_send_receipt(receipt_id(Headers), State0), + _ = maybe_send_receipt(receipt_id(Headers), State0), nack(Id, State0) end, case header(<<"transaction">>, Headers) of @@ -226,7 +225,7 @@ received(#stomp_frame{command = <<"ABORT">>, headers = Headers}, State) -> end; received(#stomp_frame{command = <<"DISCONNECT">>, headers = Headers}, State) -> - maybe_send_receipt(receipt_id(Headers), State), + _ = maybe_send_receipt(receipt_id(Headers), State), {stop, normal, State}. send(Msg = #message{topic = Topic, headers = Headers, payload = Payload}, From 2e5a0b799d6f5cb6bb0f1d4d8dd8437495f0e06e Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 13:15:40 +0100 Subject: [PATCH 09/84] fix(sn): Fix dialyzer warnings --- apps/emqx_sn/src/emqx_sn_gateway.erl | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/emqx_sn/src/emqx_sn_gateway.erl b/apps/emqx_sn/src/emqx_sn_gateway.erl index 213aaf385..a8f3bf8a3 100644 --- a/apps/emqx_sn/src/emqx_sn_gateway.erl +++ b/apps/emqx_sn/src/emqx_sn_gateway.erl @@ -473,10 +473,10 @@ handle_event(info, {datagram, SockPid, Data}, StateName, State = #state{sockpid = SockPid, channel = _Channel}) -> ?LOG(debug, "RECV ~p", [Data], State), Oct = iolist_size(Data), - emqx_pd:inc_counter(recv_oct, Oct), + inc_counter(recv_oct, Oct), try emqx_sn_frame:parse(Data) of {ok, Msg} -> - emqx_pd:inc_counter(recv_cnt, 1), + inc_counter(recv_cnt, 1), ?LOG(info, "RECV ~s at state ~s", [emqx_sn_frame:format(Msg), StateName], State), {keep_state, State, next_event({incoming, Msg})} @@ -597,8 +597,8 @@ handle_info(Info, State = #state{channel = Channel}) -> handle_return(emqx_channel:handle_info(Info, Channel), State). handle_ping(_PingReq, State) -> - emqx_pd:inc_counter(recv_oct, 2), - emqx_pd:inc_counter(recv_msg, 1), + inc_counter(recv_oct, 2), + inc_counter(recv_msg, 1), ok = send_message(?SN_PINGRESP_MSG(), State), {keep_state, State}. @@ -1075,18 +1075,24 @@ transform_fun() -> fun(Packet, State) -> transform(Packet, FunMsgIdToTopicId, State) end. inc_incoming_stats(Type) -> - emqx_pd:inc_counter(recv_pkt, 1), + inc_counter(recv_pkt, 1), case Type == ?PUBLISH of true -> - emqx_pd:inc_counter(recv_msg, 1), - emqx_pd:inc_counter(incoming_pubs, 1); + inc_counter(recv_msg, 1), + inc_counter(incoming_pubs, 1); false -> ok end. inc_outgoing_stats(Type) -> - emqx_pd:inc_counter(send_pkt, 1), - (Type == ?SN_PUBLISH) - andalso emqx_pd:inc_counter(send_msg, 1). + inc_counter(send_pkt, 1), + case Type =:= ?SN_PUBLISH of + true -> inc_counter(send_msg, 1); + false -> ok + end. next_event(Content) -> {next_event, cast, Content}. + +inc_counter(Key, Inc) -> + _ = emqx_pd:inc_counter(Key, Inc), + ok. From d4aa5ebf55ea0efeac72d57bcba91bb9f6d6ee6d Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 13:41:29 +0100 Subject: [PATCH 10/84] fix(emqx): Fix dialyzer warnings --- src/emqx.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emqx.erl b/src/emqx.erl index 2c6d444e7..4e4a62396 100644 --- a/src/emqx.erl +++ b/src/emqx.erl @@ -86,7 +86,7 @@ restart(ConfFile) -> reload_config(ConfFile), shutdown(), ok = application:stop(mnesia), - application:start(mnesia), + _ = application:start(mnesia), reboot(). %% @doc Stop emqx application. @@ -205,8 +205,8 @@ shutdown() -> shutdown(Reason) -> ?LOG(critical, "emqx shutdown for ~s", [Reason]), - emqx_alarm_handler:unload(), - emqx_plugins:unload(), + _ = emqx_alarm_handler:unload(), + _ = emqx_plugins:unload(), lists:foreach(fun application:stop/1, [emqx, ekka, cowboy, ranch, esockd, gproc]). reboot() -> From 0d90d5c66b4784429eebe2b0cb0a637ec66a142d Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 13:41:48 +0100 Subject: [PATCH 11/84] fix(emqx_acl_cache): Dialyzer warnings --- src/emqx_acl_cache.erl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/emqx_acl_cache.erl b/src/emqx_acl_cache.erl index ef549d8d3..5e327e210 100644 --- a/src/emqx_acl_cache.erl +++ b/src/emqx_acl_cache.erl @@ -107,9 +107,7 @@ put_acl_cache(PubSub, Topic, AclResult) -> %% delete all the acl entries -spec(empty_acl_cache() -> ok). empty_acl_cache() -> - map_acl_cache(fun({CacheK, _CacheV}) -> - erlang:erase(CacheK) - end), + foreach_acl_cache(fun({CacheK, _CacheV}) -> erlang:erase(CacheK) end), set_cache_size(0), keys_queue_set(queue:new()). @@ -139,9 +137,13 @@ get_cache_size() -> dump_acl_cache() -> map_acl_cache(fun(Cache) -> Cache end). + map_acl_cache(Fun) -> [Fun(R) || R = {{SubPub, _T}, _Acl} <- get(), SubPub =:= publish orelse SubPub =:= subscribe]. +foreach_acl_cache(Fun) -> + _ = map_acl_cache(Fun), + ok. %%-------------------------------------------------------------------- %% Internal functions From 3fb69cc407141e558bdd40d9d83c5638b937829c Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 15:52:56 +0100 Subject: [PATCH 12/84] fix(emqx_alarm): Dialyzer warnings --- src/emqx_alarm.erl | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/emqx_alarm.erl b/src/emqx_alarm.erl index 37d6fe1e8..a0e230c46 100644 --- a/src/emqx_alarm.erl +++ b/src/emqx_alarm.erl @@ -165,6 +165,10 @@ init([Opts]) -> size_limit = SizeLimit, validity_period = ValidityPeriod})}. +%% suppress dialyzer warning due to dirty read/write race condition. +%% TODO: change from dirty_read/write to transactional. +%% TODO: handle mnesia write errors. +-dialyzer([{nowarn_function, [handle_call/3]}]). handle_call({activate_alarm, Name, Details}, _From, State = #state{actions = Actions}) -> case mnesia:dirty_read(?ACTIVATED_ALARM, Name) of [#activated_alarm{name = Name}] -> @@ -211,7 +215,7 @@ handle_call({deactivate_alarm, Name}, _From, State = #state{actions = Actions, end; handle_call(delete_all_deactivated_alarms, _From, State) -> - mnesia:clear_table(?DEACTIVATED_ALARM), + clear_table(?DEACTIVATED_ALARM), {reply, ok, State}; handle_call({get_alarms, all}, _From, State) -> @@ -266,7 +270,17 @@ deactivate_all_alarms() -> message = Message, deactivate_at = erlang:system_time(microsecond)}) end, ets:tab2list(?ACTIVATED_ALARM)), - mnesia:clear_table(?ACTIVATED_ALARM). + clear_table(?ACTIVATED_ALARM). + +%% Delete all records from the given table, ignore result. +clear_table(TableName) -> + case mnesia:clear_table(TableName) of + {aborted, Reason} -> + ?LOG(warning, "Faile to clear table ~p reason: ~p", + [TableName, Reason]); + {atomic, ok} -> + ok + end. ensure_delete_timer(State = #state{validity_period = ValidityPeriod}) -> State#state{timer = emqx_misc:start_timer(ValidityPeriod div 1, delete_expired_deactivated_alarm)}. @@ -299,7 +313,8 @@ do_actions(Operation, Alarm, [publish | More]) -> {ok, Payload} = encode_to_json(Alarm), Message = emqx_message:make(?MODULE, 0, Topic, Payload, #{sys => true}, #{properties => #{'Content-Type' => <<"application/json">>}}), - emqx_broker:safe_publish(Message), + %% TODO log failed publishes + _ = emqx_broker:safe_publish(Message), do_actions(Operation, Alarm, More). encode_to_json(Alarm) -> From 0eb697fa6fd43e47d6831abaae25e3ebfdc85f58 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 17:20:54 +0100 Subject: [PATCH 13/84] fix(emqx_app): Dialyzer warnings --- src/emqx_alarm_handler.erl | 2 +- src/emqx_app.erl | 6 +++--- src/emqx_plugins.erl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/emqx_alarm_handler.erl b/src/emqx_alarm_handler.erl index 7f66f6eb1..667dc99e6 100644 --- a/src/emqx_alarm_handler.erl +++ b/src/emqx_alarm_handler.erl @@ -85,4 +85,4 @@ handle_call(_Query, State) -> terminate(swap, _State) -> {emqx_alarm_handler, []}; terminate(_, _) -> - ok. \ No newline at end of file + ok. diff --git a/src/emqx_app.erl b/src/emqx_app.erl index 689a1b69e..42196d70a 100644 --- a/src/emqx_app.erl +++ b/src/emqx_app.erl @@ -34,18 +34,18 @@ start(_Type, _Args) -> {ok, Sup} = emqx_sup:start_link(), ok = emqx_modules:load(), ok = emqx_plugins:init(), - emqx_plugins:load(), + _ = emqx_plugins:load(), emqx_boot:is_enabled(listeners) andalso (ok = emqx_listeners:start()), start_autocluster(), register(emqx, self()), - emqx_alarm_handler:load(), + ok = emqx_alarm_handler:load(), print_vsn(), {ok, Sup}. -spec(stop(State :: term()) -> term()). stop(_State) -> - emqx_alarm_handler:unload(), + ok = emqx_alarm_handler:unload(), emqx_boot:is_enabled(listeners) andalso emqx_listeners:stop(), emqx_modules:unload(). diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index 6c7408a28..b62e9eb85 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -59,7 +59,7 @@ init() -> end. %% @doc Load all plugins when the broker started. --spec(load() -> list() | {error, term()}). +-spec(load() -> ok | ignore | {error, term()}). load() -> load_expand_plugins(), case emqx:get_env(plugins_loaded_file) of @@ -103,7 +103,7 @@ unload(PluginName) when is_atom(PluginName) -> ?LOG(error, "Plugin ~s is not started", [PluginName]), {error, not_started}; {_, _} -> - unload_plugin(PluginName, true) + unload_plugin(PluginName, true) end. reload(PluginName) when is_atom(PluginName)-> From cfe52cbb8d70c4cc093a901c5cac96d653196245 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 17:23:05 +0100 Subject: [PATCH 14/84] fix(emqx_broker): Dialyzer warning --- src/emqx_broker.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/emqx_broker.erl b/src/emqx_broker.erl index 85c6ad070..c8d9c4b58 100644 --- a/src/emqx_broker.erl +++ b/src/emqx_broker.erl @@ -465,7 +465,8 @@ handle_cast({subscribe, Topic}, State) -> handle_cast({unsubscribed, Topic}, State) -> case ets:member(?SUBSCRIBER, Topic) of false -> - _ = emqx_router:do_delete_route(Topic); + _ = emqx_router:do_delete_route(Topic), + ok; true -> ok end, {noreply, State}; From 7dd67a6caf0690bdcb6cafaea1fa3ec8ef9f0b10 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 4 Nov 2020 17:25:40 +0100 Subject: [PATCH 15/84] fix(emqx_channel): Dialyzer warning --- src/emqx_channel.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 71b89f153..cc5394cd9 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -1540,15 +1540,20 @@ mabye_publish_will_msg(Channel = #channel{will_msg = undefined}) -> Channel; mabye_publish_will_msg(Channel = #channel{will_msg = WillMsg}) -> case will_delay_interval(WillMsg) of - 0 -> publish_will_msg(WillMsg), - Channel#channel{will_msg = undefined}; - I -> ensure_timer(will_timer, timer:seconds(I), Channel) + 0 -> + ok = publish_will_msg(WillMsg), + Channel#channel{will_msg = undefined}; + I -> + ensure_timer(will_timer, timer:seconds(I), Channel) end. will_delay_interval(WillMsg) -> maps:get('Will-Delay-Interval', emqx_message:get_header(properties, WillMsg), 0). -publish_will_msg(Msg) -> emqx_broker:publish(Msg). +publish_will_msg(Msg) -> + %% TODO check if we should discard result here + _ = emqx_broker:publish(Msg), + ok. %%-------------------------------------------------------------------- %% Disconnect Reason From 7a3947020077820af1e7da625ff3136cd7d6af06 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 13:48:07 +0100 Subject: [PATCH 16/84] fix(emqx_connection): Dialyzer warnings --- src/emqx_connection.erl | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/emqx_connection.erl b/src/emqx_connection.erl index 2ab7f6c1e..e59fd2223 100644 --- a/src/emqx_connection.erl +++ b/src/emqx_connection.erl @@ -239,6 +239,7 @@ run_loop(Parent, State = #state{transport = Transport, exit_on_sock_error(Reason) end. +-spec exit_on_sock_error(any()) -> no_return(). exit_on_sock_error(Reason) when Reason =:= einval; Reason =:= enotconn; Reason =:= closed -> @@ -330,7 +331,7 @@ handle_msg({'$gen_call', From, Req}, State) -> handle_msg({Inet, _Sock, Data}, State) when Inet == tcp; Inet == ssl -> ?LOG(debug, "RECV ~0p", [Data]), Oct = iolist_size(Data), - emqx_pd:inc_counter(incoming_bytes, Oct), + inc_counter(incoming_bytes, Oct), ok = emqx_metrics:inc('bytes.received', Oct), parse_incoming(Data, State); @@ -426,10 +427,11 @@ handle_msg(Msg, State) -> %%-------------------------------------------------------------------- %% Terminate +-spec terminate(any(), state()) -> no_return(). terminate(Reason, State = #state{channel = Channel}) -> ?LOG(debug, "Terminated due to ~p", [Reason]), emqx_channel:terminate(Reason, Channel), - close_socket(State), + _ = close_socket(State), exit(Reason). %%-------------------------------------------------------------------- @@ -597,7 +599,7 @@ serialize_and_inc_stats_fun(#state{serialize = Serialize}) -> send(IoData, #state{transport = Transport, socket = Socket}) -> Oct = iolist_size(IoData), ok = emqx_metrics:inc('bytes.sent', Oct), - emqx_pd:inc_counter(outgoing_bytes, Oct), + inc_counter(outgoing_bytes, Oct), case Transport:async_send(Socket, IoData) of ok -> ok; Error = {error, _Reason} -> @@ -693,23 +695,25 @@ close_socket(State = #state{transport = Transport, socket = Socket}) -> -compile({inline, [inc_incoming_stats/1]}). inc_incoming_stats(Packet = ?PACKET(Type)) -> - emqx_pd:inc_counter(recv_pkt, 1), - if - Type == ?PUBLISH -> - emqx_pd:inc_counter(recv_msg, 1), - emqx_pd:inc_counter(incoming_pubs, 1); - true -> ok + inc_counter(recv_pkt, 1), + case Type =:= ?PUBLISH of + true -> + inc_counter(recv_msg, 1), + inc_counter(incoming_pubs, 1); + false -> + ok end, emqx_metrics:inc_recv(Packet). -compile({inline, [inc_outgoing_stats/1]}). inc_outgoing_stats(Packet = ?PACKET(Type)) -> - emqx_pd:inc_counter(send_pkt, 1), - if - Type == ?PUBLISH -> - emqx_pd:inc_counter(send_msg, 1), - emqx_pd:inc_counter(outgoing_pubs, 1); - true -> ok + inc_counter(send_pkt, 1), + case Type =:= ?PUBLISH of + true -> + inc_counter(send_msg, 1), + inc_counter(outgoing_pubs, 1); + false -> + ok end, emqx_metrics:inc_sent(Packet). @@ -738,6 +742,10 @@ stop(Reason, State) -> stop(Reason, Reply, State) -> {stop, Reason, Reply, State}. +inc_counter(Key, Inc) -> + _ = emqx_pd:inc_counter(Key, Inc), + ok. + %%-------------------------------------------------------------------- %% For CT tests %%-------------------------------------------------------------------- From f3d973689b0c52fe600771054e0b72789a598362 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 13:49:29 +0100 Subject: [PATCH 17/84] fix(emqx_listeners): Dialyzer warnings --- src/emqx_listeners.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emqx_listeners.erl b/src/emqx_listeners.erl index ce256d147..3b642d55f 100644 --- a/src/emqx_listeners.erl +++ b/src/emqx_listeners.erl @@ -124,10 +124,10 @@ restart_listener(tcp, ListenOn, _Options) -> restart_listener(Proto, ListenOn, _Options) when Proto == ssl; Proto == tls -> esockd:reopen('mqtt:ssl', ListenOn); restart_listener(Proto, ListenOn, Options) when Proto == http; Proto == ws -> - cowboy:stop_listener(ws_name('mqtt:ws', ListenOn)), + _ = cowboy:stop_listener(ws_name('mqtt:ws', ListenOn)), start_listener(Proto, ListenOn, Options); restart_listener(Proto, ListenOn, Options) when Proto == https; Proto == wss -> - cowboy:stop_listener(ws_name('mqtt:wss', ListenOn)), + _ = cowboy:stop_listener(ws_name('mqtt:wss', ListenOn)), start_listener(Proto, ListenOn, Options); restart_listener(Proto, ListenOn, _Opts) -> esockd:reopen(Proto, ListenOn). From 5793ef6640a44c36186f006ac011366809558fe6 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 14:06:24 +0100 Subject: [PATCH 18/84] fix(emqx_mod_sup): Dialyzer warning All the callers of start_child API are discarding the return value. --- src/emqx_mod_sup.erl | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/emqx_mod_sup.erl b/src/emqx_mod_sup.erl index b5512013c..0f19a0cf5 100644 --- a/src/emqx_mod_sup.erl +++ b/src/emqx_mod_sup.erl @@ -40,11 +40,13 @@ start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). +-spec start_child(supervisor:child_spec()) -> ok. start_child(ChildSpec) when is_map(ChildSpec) -> - supervisor:start_child(?MODULE, ChildSpec). + assert_started(supervisor:start_child(?MODULE, ChildSpec)). +-spec start_child(atom(), atom()) -> ok. start_child(Mod, Type) when is_atom(Mod) andalso is_atom(Type) -> - supervisor:start_child(?MODULE, ?CHILD(Mod, Type)). + assert_started(supervisor:start_child(?MODULE, ?CHILD(Mod, Type))). -spec(stop_child(any()) -> ok | {error, term()}). stop_child(ChildId) -> @@ -61,3 +63,12 @@ init([]) -> ok = emqx_tables:new(emqx_modules, [set, public, {write_concurrency, true}]), {ok, {{one_for_one, 10, 100}, []}}. +%%-------------------------------------------------------------------- +%% Internal functions +%%-------------------------------------------------------------------- + +assert_started({ok, _Pid}) -> ok; +assert_started({ok, _Pid, _Info}) -> ok; +assert_started({error, {already_tarted, _Pid}}) -> ok; +assert_started({error, Reason}) -> erlang:error(Reason). + From ab5599b3ecf2cfd1995ebdee9f1c8c75438571ed Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 15:02:16 +0100 Subject: [PATCH 19/84] refactor(hook): Add emqx_hooks:put to hide already_exists error This also fixes dialyzer warnings in emqx_mod_presence --- src/emqx_hooks.erl | 9 +++++++++ src/emqx_mod_presence.erl | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/emqx_hooks.erl b/src/emqx_hooks.erl index 273071d75..9623a2007 100644 --- a/src/emqx_hooks.erl +++ b/src/emqx_hooks.erl @@ -31,6 +31,7 @@ -export([ add/2 , add/3 , add/4 + , put/2 , del/2 , run/2 , run_fold/3 @@ -111,6 +112,14 @@ add(HookPoint, Action, Priority) when is_integer(Priority) -> add(HookPoint, Action, Filter, Priority) when is_integer(Priority) -> add(HookPoint, #callback{action = Action, filter = Filter, priority = Priority}). +%% @doc Like add/2, it register a callback, discard 'already_exists' error. +-spec(put(hookpoint(), action() | #callback{}) -> ok). +put(HookPoint, Callback) -> + case add(HookPoint, Callback) of + ok -> ok; + {error, already_exists} -> ok + end. + %% @doc Unregister a callback. -spec(del(hookpoint(), function() | {module(), atom()}) -> ok). del(HookPoint, Action) -> diff --git a/src/emqx_mod_presence.erl b/src/emqx_mod_presence.erl index f5aa2279e..9a8d024fc 100644 --- a/src/emqx_mod_presence.erl +++ b/src/emqx_mod_presence.erl @@ -38,8 +38,8 @@ -endif. load(Env) -> - emqx_hooks:add('client.connected', {?MODULE, on_client_connected, [Env]}), - emqx_hooks:add('client.disconnected', {?MODULE, on_client_disconnected, [Env]}). + emqx_hooks:put('client.connected', {?MODULE, on_client_connected, [Env]}), + emqx_hooks:put('client.disconnected', {?MODULE, on_client_disconnected, [Env]}). unload(_Env) -> emqx_hooks:del('client.connected', {?MODULE, on_client_connected}), From 0f0ca1e9fd9800d37262046ebe5f8dd7cbecc097 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 15:03:53 +0100 Subject: [PATCH 20/84] fix(emqx_mod_rewrite): Dialyzer warnings --- src/emqx_mod_rewrite.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emqx_mod_rewrite.erl b/src/emqx_mod_rewrite.erl index 41f9020c9..a958e8a0f 100644 --- a/src/emqx_mod_rewrite.erl +++ b/src/emqx_mod_rewrite.erl @@ -45,9 +45,9 @@ load(RawRules) -> {PubRules, SubRules} = compile(RawRules), - emqx_hooks:add('client.subscribe', {?MODULE, rewrite_subscribe, [SubRules]}), - emqx_hooks:add('client.unsubscribe', {?MODULE, rewrite_unsubscribe, [SubRules]}), - emqx_hooks:add('message.publish', {?MODULE, rewrite_publish, [PubRules]}). + emqx_hooks:put('client.subscribe', {?MODULE, rewrite_subscribe, [SubRules]}), + emqx_hooks:put('client.unsubscribe', {?MODULE, rewrite_unsubscribe, [SubRules]}), + emqx_hooks:put('message.publish', {?MODULE, rewrite_publish, [PubRules]}). rewrite_subscribe(_ClientInfo, _Properties, TopicFilters, Rules) -> {ok, [{match_and_rewrite(Topic, Rules), Opts} || {Topic, Opts} <- TopicFilters]}. From d47a2294ca6de7b21aed131804523a0f068d70a6 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 15:09:51 +0100 Subject: [PATCH 21/84] fix(emqx_mod_topic_metrics): Dialyzer warnings --- src/emqx_mod_topic_metrics.erl | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/emqx_mod_topic_metrics.erl b/src/emqx_mod_topic_metrics.erl index 82999bb53..4b70c8e4b 100644 --- a/src/emqx_mod_topic_metrics.erl +++ b/src/emqx_mod_topic_metrics.erl @@ -102,14 +102,14 @@ load(_Env) -> emqx_mod_sup:start_child(?MODULE, worker), - emqx:hook('message.publish', {?MODULE, on_message_publish, []}), - emqx:hook('message.dropped', {?MODULE, on_message_dropped, []}), - emqx:hook('message.delivered', {?MODULE, on_message_delivered, []}). + emqx_hooks:put('message.publish', {?MODULE, on_message_publish, []}), + emqx_hooks:put('message.dropped', {?MODULE, on_message_dropped, []}), + emqx_hooks:put('message.delivered', {?MODULE, on_message_delivered, []}). unload(_Env) -> - emqx:unhook('message.publish', {?MODULE, on_message_publish}), - emqx:unhook('message.dropped', {?MODULE, on_message_dropped}), - emqx:unhook('message.delivered', {?MODULE, on_message_delivered}), + emqx_hooks:del('message.publish', {?MODULE, on_message_publish}), + emqx_hooks:del('message.dropped', {?MODULE, on_message_dropped}), + emqx_hooks:del('message.delivered', {?MODULE, on_message_delivered}), emqx_mod_sup:stop_child(?MODULE). description() -> @@ -118,7 +118,7 @@ description() -> on_message_publish(#message{topic = Topic, qos = QoS}) -> case is_registered(Topic) of true -> - inc(Topic, 'messages.in'), + try_inc(Topic, 'messages.in'), case QoS of ?QOS_0 -> inc(Topic, 'messages.qos0.in'); ?QOS_1 -> inc(Topic, 'messages.qos1.in'); @@ -131,7 +131,7 @@ on_message_publish(#message{topic = Topic, qos = QoS}) -> on_message_delivered(_, #message{topic = Topic, qos = QoS}) -> case is_registered(Topic) of true -> - inc(Topic, 'messages.out'), + try_inc(Topic, 'messages.out'), case QoS of ?QOS_0 -> inc(Topic, 'messages.qos0.out'); ?QOS_1 -> inc(Topic, 'messages.qos1.out'); @@ -155,6 +155,10 @@ start_link() -> stop() -> gen_server:stop(?MODULE). +try_inc(Topic, Metric) -> + _ = inc(Topic, Metric), + ok. + inc(Topic, Metric) -> inc(Topic, Metric, 1). From adc9cc30f684216907ef665fd25e27ae716ecce2 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 15:20:38 +0100 Subject: [PATCH 22/84] refactor(emqx_modules): Swallow errors when write modules --- src/emqx_modules.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emqx_modules.erl b/src/emqx_modules.erl index 55fb44001..f683ab1dd 100644 --- a/src/emqx_modules.erl +++ b/src/emqx_modules.erl @@ -125,7 +125,7 @@ load_module(ModuleName, Persistent) -> case ModuleName:load(Env) of ok -> ets:insert(?MODULE, {ModuleName, true}), - write_loaded(Persistent), + ok = write_loaded(Persistent), ?LOG(info, "Load ~s module successfully.", [ModuleName]); {error, Error} -> ?LOG(error, "Load module ~s failed, cannot load for ~0p", [ModuleName, Error]), @@ -152,7 +152,7 @@ unload_module(ModuleName, Persistent) -> case ModuleName:unload(Env) of ok -> ets:insert(?MODULE, {ModuleName, false}), - write_loaded(Persistent), + ok = write_loaded(Persistent), ?LOG(info, "Unload ~s module successfully.", [ModuleName]); {error, Error} -> ?LOG(error, "Unload module ~s failed, cannot unload for ~0p", [ModuleName, Error]) @@ -164,6 +164,6 @@ write_loaded(true) -> ok -> ok; {error, Error} -> ?LOG(error, "Write File ~p Error: ~p", [FilePath, Error]), - {error, Error} + ok end; write_loaded(false) -> ok. From 8d853a344532bc964699ec72d53a6246a423b815 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 17:16:41 +0100 Subject: [PATCH 23/84] fix(dialyzer/emqx_sn): Fix unmatched return value warning --- apps/emqx_sn/src/emqx_sn_gateway.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_sn/src/emqx_sn_gateway.erl b/apps/emqx_sn/src/emqx_sn_gateway.erl index a8f3bf8a3..9828ed383 100644 --- a/apps/emqx_sn/src/emqx_sn_gateway.erl +++ b/apps/emqx_sn/src/emqx_sn_gateway.erl @@ -947,7 +947,7 @@ do_publish_will(#state{will_msg = WillMsg, clientid = ClientId}) -> qos = QoS, retain = Retain}, variable = #mqtt_packet_publish{topic_name = Topic, packet_id = 1000}, payload = Payload}, - emqx_broker:publish(emqx_packet:to_message(Publish, ClientId)), + _ = emqx_broker:publish(emqx_packet:to_message(Publish, ClientId)), ok. do_puback(TopicId, MsgId, ReturnCode, _StateName, From eecd2b5f3545cdb148fd1e38bb6616b826efffb3 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 17:31:40 +0100 Subject: [PATCH 24/84] fix(emqx_types): Non mandatory map fields --- src/emqx_types.erl | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/emqx_types.erl b/src/emqx_types.erl index 291e35538..c1d3822cb 100644 --- a/src/emqx_types.erl +++ b/src/emqx_types.erl @@ -113,18 +113,18 @@ peername := peername(), peercert := nossl | undefined | esockd_peercert:peercert(), conn_mod := module(), - proto_name := binary(), - proto_ver := ver(), - clean_start := boolean(), - clientid := clientid(), - username := username(), - conn_props := properties(), - connected := boolean(), - connected_at := non_neg_integer(), + proto_name => binary(), + proto_ver => ver(), + clean_start => boolean(), + clientid => clientid(), + username => username(), + conn_props => properties(), + connected => boolean(), + connected_at => non_neg_integer(), disconnected_at => non_neg_integer(), - keepalive := 0..16#FFFF, - receive_maximum := non_neg_integer(), - expiry_interval := non_neg_integer(), + keepalive => 0..16#FFFF, + receive_maximum => non_neg_integer(), + expiry_interval => non_neg_integer(), atom() => term() }). -type(clientinfo() :: #{zone := zone(), From baaa4e847dacde040bc0515d2559f545438a3648 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 20:42:50 +0100 Subject: [PATCH 25/84] fix(emqx_sn_gateway): Dialyzer warnings --- apps/emqx_sn/src/emqx_sn_gateway.erl | 28 +++++++++++++++++----------- src/emqx_types.erl | 3 ++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/apps/emqx_sn/src/emqx_sn_gateway.erl b/apps/emqx_sn/src/emqx_sn_gateway.erl index 9828ed383..a1e062add 100644 --- a/apps/emqx_sn/src/emqx_sn_gateway.erl +++ b/apps/emqx_sn/src/emqx_sn_gateway.erl @@ -74,7 +74,7 @@ sockstate :: emqx_types:sockstate(), sockname :: {inet:ip_address(), inet:port()}, peername :: {inet:ip_address(), inet:port()}, - channel :: emqx_channel:channel(), + channel :: maybe(emqx_channel:channel()), registry :: emqx_sn_registry:registry(), clientid :: maybe(binary()), username :: maybe(binary()), @@ -105,6 +105,8 @@ -define(NO_PEERCERT, undefined). +%% TODO: fix when https://github.com/emqx/emqx-sn/pull/170 is merged +-dialyzer([{nowarn_function, [idle/3]}]). %%-------------------------------------------------------------------- %% Exported APIs @@ -136,7 +138,8 @@ init([{_, SockPid, Sock}, Peername, Options]) -> EnableStats = proplists:get_value(enable_stats, Options, false), case inet:sockname(Sock) of {ok, Sockname} -> - Channel = emqx_channel:init(#{sockname => Sockname, + Channel = emqx_channel:init(#{socktype => udp, + sockname => Sockname, peername => Peername, protocol => 'mqtt-sn', peercert => ?NO_PEERCERT, @@ -195,14 +198,18 @@ idle(cast, {incoming, ?SN_PUBLISH_MSG(_Flag, _TopicId, _MsgId, _Data)}, State = idle(cast, {incoming, ?SN_PUBLISH_MSG(#mqtt_sn_flags{qos = ?QOS_NEG1, topic_id_type = TopicIdType }, TopicId, _MsgId, Data)}, - State = #state{clientid = ClientId, registry = Registry}) -> + State = #state{clientid = ClientId, registry = Registry}) -> TopicName = case (TopicIdType =:= ?SN_SHORT_TOPIC) of - false -> - emqx_sn_registry:lookup_topic(Registry, ClientId, TopicId); + false -> emqx_sn_registry:lookup_topic(Registry, ClientId, TopicId); true -> <> end, - Msg = emqx_message:make(?NEG_QOS_CLIENT_ID, ?QOS_0, TopicName, Data), - (TopicName =/= undefined) andalso emqx_broker:publish(Msg), + case TopicName =/= undefined of + true -> + Msg = emqx_message:make(?NEG_QOS_CLIENT_ID, ?QOS_0, TopicName, Data), + emqx_broker:publish(Msg); + false -> + ok + end; ?LOG(debug, "Client id=~p receives a publish with QoS=-1 in idle mode!", [ClientId], State), {keep_state_and_data, State#state.idle_timeout}; @@ -562,10 +569,9 @@ terminate(Reason, _StateName, #state{clientid = ClientId, channel = Channel, registry = Registry}) -> emqx_sn_registry:unregister_topic(Registry, ClientId), - case {Channel, Reason} of - {undefined, _} -> ok; - {_, _} -> - emqx_channel:terminate(Reason, Channel) + case Channel =:= undefined of + true -> ok; + false -> emqx_channel:terminate(Reason, Channel) end. code_change(_Vsn, StateName, State, _Extra) -> diff --git a/src/emqx_types.erl b/src/emqx_types.erl index c1d3822cb..dd1bd71a9 100644 --- a/src/emqx_types.erl +++ b/src/emqx_types.erl @@ -148,7 +148,8 @@ -type(username() :: maybe(binary())). -type(password() :: maybe(binary())). -type(peerhost() :: inet:ip_address()). --type(peername() :: {inet:ip_address(), inet:port_number()}). +-type(peername() :: {inet:ip_address(), inet:port_number()} + | inet:returned_non_ip_address()). -type(protocol() :: mqtt | 'mqtt-sn' | coap | lwm2m | stomp | none | atom()). -type(auth_result() :: success | client_identifier_not_valid From 4cfe4e9940cd49e4627e466cce26520a39f0234a Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 6 Nov 2020 21:53:25 +0100 Subject: [PATCH 26/84] fix(eqmx_sasl): Dialyzer warning --- apps/emqx_sasl/src/emqx_sasl_app.erl | 4 ++-- apps/emqx_sasl/src/emqx_sasl_scram.erl | 8 ++------ apps/emqx_sn/src/emqx_sn_gateway.erl | 2 +- rebar.config | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/apps/emqx_sasl/src/emqx_sasl_app.erl b/apps/emqx_sasl/src/emqx_sasl_app.erl index 24c246ea9..9d0b5955c 100644 --- a/apps/emqx_sasl/src/emqx_sasl_app.erl +++ b/apps/emqx_sasl/src/emqx_sasl_app.erl @@ -30,7 +30,7 @@ start(_Type, _Args) -> ok = emqx_sasl:init(), - emqx_sasl:load(), + _ = emqx_sasl:load(), emqx_sasl_cli:load(), supervisor:start_link({local, ?MODULE}, ?MODULE, []). @@ -43,4 +43,4 @@ stop(_State) -> %%-------------------------------------------------------------------- init([]) -> - {ok, { {one_for_all, 1, 10}, []} }. \ No newline at end of file + {ok, { {one_for_all, 1, 10}, []} }. diff --git a/apps/emqx_sasl/src/emqx_sasl_scram.erl b/apps/emqx_sasl/src/emqx_sasl_scram.erl index f5aed5b3b..ba27f7784 100644 --- a/apps/emqx_sasl/src/emqx_sasl_scram.erl +++ b/apps/emqx_sasl/src/emqx_sasl_scram.erl @@ -217,12 +217,8 @@ nonce() -> base64:encode([$a + rand:uniform(26) || _ <- lists:seq(1, 10)]). pbkdf2_sha_1(Password, Salt, IterationCount) -> - case pbkdf2:pbkdf2(sha, Password, Salt, IterationCount) of - {ok, Bin} -> - pbkdf2:to_hex(Bin); - {error, Reason} -> - error(Reason) - end. + {ok, Bin} = pbkdf2:pbkdf2(sha, Password, Salt, IterationCount), + pbkdf2:to_hex(Bin). -if(?OTP_RELEASE >= 23). hmac(Key, Data) -> diff --git a/apps/emqx_sn/src/emqx_sn_gateway.erl b/apps/emqx_sn/src/emqx_sn_gateway.erl index a1e062add..ebe28cb1e 100644 --- a/apps/emqx_sn/src/emqx_sn_gateway.erl +++ b/apps/emqx_sn/src/emqx_sn_gateway.erl @@ -209,7 +209,7 @@ idle(cast, {incoming, ?SN_PUBLISH_MSG(#mqtt_sn_flags{qos = ?QOS_NEG1, emqx_broker:publish(Msg); false -> ok - end; + end, ?LOG(debug, "Client id=~p receives a publish with QoS=-1 in idle mode!", [ClientId], State), {keep_state_and_data, State#state.idle_timeout}; diff --git a/rebar.config b/rebar.config index 8999d9e97..146f46706 100644 --- a/rebar.config +++ b/rebar.config @@ -44,7 +44,7 @@ , {minirest, {git, "https://github.com/emqx/minirest", {tag, "0.3.2"}}} , {ecpool, {git, "https://github.com/emqx/ecpool", {tag, "0.5.0"}}} , {replayq, {git, "https://github.com/emqx/replayq", {tag, "v0.2.0"}}} - , {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {branch, "2.0.3"}}} + , {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {branch, "2.0.4"}}} , {emqtt, {git, "https://github.com/emqx/emqtt", {tag, "1.2.3"}}} , {rulesql, {git, "https://github.com/emqx/rulesql", {tag, "0.1.2"}}} , {getopt, "1.0.1"} From 6a1aae52eb1d072eebfdabe3f5dd2fc1b5f42934 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Sat, 7 Nov 2020 21:39:01 +0100 Subject: [PATCH 27/84] fix(emqx_rule_validator): Dialyzer warning --- .../src/emqx_rule_validator.erl | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_validator.erl b/apps/emqx_rule_engine/src/emqx_rule_validator.erl index 8e0ab82b8..6a75e5861 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_validator.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_validator.erl @@ -31,25 +31,31 @@ %% APIs %%------------------------------------------------------------------------------ -%% Validate the params according the spec and return a new spec. -%% Note that this function will throw out exceptions in case of -%% validation failure. --spec(validate_params(params(), params_spec()) -> params()). +%% Validate the params according the spec. +%% Note that this function throws exception in case of validation failure. +-spec(validate_params(params(), params_spec()) -> ok). validate_params(Params, ParamsSepc) -> - maps:map(fun(Name, Spec) -> + F = fun(Name, Spec) -> do_validate_param(Name, Spec, Params) - end, ParamsSepc), - ok. + end, + map_foreach(F, ParamsSepc). -spec(validate_spec(params_spec()) -> ok). -validate_spec(ParamsSepc) -> - maps:map(fun do_validate_spec/2, ParamsSepc), - ok. +validate_spec(ParamsSepc) -> map_foreach(fun do_validate_spec/2, ParamsSepc). %%------------------------------------------------------------------------------ %% Internal Functions %%------------------------------------------------------------------------------ +map_foreach(Fun, Map) -> + Iterator = maps:iterator(Map), + map_foreach_loop(Fun, maps:next(Iterator)). + +map_foreach_loop(_Fun, none) -> ok; +map_foreach_loop(Fun, {Key, Value, Iterator}) -> + _ = Fun(Key, Value), + map_foreach_loop(Fun, maps:next(Iterator)). + do_validate_param(Name, Spec = #{required := true}, Params) -> find_field(Name, Params, fun (not_found) -> error({required_field_missing, Name}); @@ -171,5 +177,5 @@ do_find_field([F | Fields], Spec, Func) -> end. bin(Atom) when is_atom(Atom) -> atom_to_binary(Atom, utf8); -bin(Str) when is_list(Str) -> atom_to_list(Str); +bin(Str) when is_list(Str) -> iolist_to_binary(Str); bin(Bin) when is_binary(Bin) -> Bin. From 764d5977c132fc2c62b5bd9e6353d5f921f0b919 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 21:28:58 +0100 Subject: [PATCH 28/84] fix(emqx_rule_engine): Dialyzer warning related to generated code --- .../src/emqx_rule_sqlparser.erl | 6 +++- .../src/emqx_rule_sqltester.erl | 36 +++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl b/apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl index 03a2e816e..f6db69e44 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqlparser.erl @@ -49,6 +49,10 @@ -export_type([select/0]). +%% Dialyzer gives up on the generated code. +%% probably due to stack depth, or inlines. +-dialyzer({nowarn_function, [parse_select/1]}). + %% Parse one select statement. -spec(parse_select(string() | binary()) -> {ok, select()} | {parse_error, term()} | {lex_error, term()}). @@ -76,7 +80,7 @@ parse_select(Sql) -> end catch _Error:Reason:StackTrace -> - {parse_error, Reason, StackTrace} + {parse_error, {Reason, StackTrace}} end. -spec(select_fields(select()) -> list(field())). diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl index aeb1bf588..bedfe324e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl @@ -21,24 +21,30 @@ -export([ test/1 ]). +%% Dialyzer gives up on the generated code. +%% probably due to stack depth, or inlines. +-dialyzer({nowarn_function, [test/1, + test_rule/4, + flatten/1, + sql_test_action/0, + fill_default_values/2 + ]}). + -spec(test(#{}) -> {ok, Result::map()} | no_return()). test(#{<<"rawsql">> := Sql, <<"ctx">> := Context}) -> - case emqx_rule_sqlparser:parse_select(Sql) of - {ok, Select} -> - InTopic = maps:get(<<"topic">>, Context, <<>>), - EventTopics = emqx_rule_sqlparser:select_from(Select), - case lists:all(fun is_publish_topic/1, EventTopics) of - true -> - %% test if the topic matches the topic filters in the rule - case emqx_rule_utils:can_topic_match_oneof(InTopic, EventTopics) of - true -> test_rule(Sql, Select, Context, EventTopics); - false -> {error, nomatch} - end; - false -> - %% the rule is for both publish and events, test it directly - test_rule(Sql, Select, Context, EventTopics) + {ok, Select} = emqx_rule_sqlparser:parse_select(Sql), + InTopic = maps:get(<<"topic">>, Context, <<>>), + EventTopics = emqx_rule_sqlparser:select_from(Select), + case lists:all(fun is_publish_topic/1, EventTopics) of + true -> + %% test if the topic matches the topic filters in the rule + case emqx_rule_utils:can_topic_match_oneof(InTopic, EventTopics) of + true -> test_rule(Sql, Select, Context, EventTopics); + false -> {error, nomatch} end; - Error -> error(Error) + false -> + %% the rule is for both publish and events, test it directly + test_rule(Sql, Select, Context, EventTopics) end. test_rule(Sql, Select, Context, EventTopics) -> From 42ed274ec397f0a1c88a5547a823d4658c16bd97 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 21:59:59 +0100 Subject: [PATCH 29/84] fix(emqx_rule_runtime): Dialyzer warnings --- apps/emqx_rule_engine/src/emqx_rule_runtime.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl index ef6bdea12..2098072d3 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl @@ -291,11 +291,11 @@ wait_action_on(Id, RetryN) -> handle_action_failure(continue, Id, Fallbacks, Selected, Envs, Reason) -> ?LOG(error, "Take action ~p failed, continue next action, reason: ~0p", [Id, Reason]), - take_actions(Fallbacks, Selected, Envs, continue), + _ = take_actions(Fallbacks, Selected, Envs, continue), failed; handle_action_failure(stop, Id, Fallbacks, Selected, Envs, Reason) -> ?LOG(error, "Take action ~p failed, skip all actions, reason: ~0p", [Id, Reason]), - take_actions(Fallbacks, Selected, Envs, continue), + _ = take_actions(Fallbacks, Selected, Envs, continue), error({take_action_failed, {Id, Reason}}). eval({path, [{key, <<"payload">>} | Path]}, #{payload := Payload}) -> From ff55b0ff457174166619eca75e80e3a3420549f8 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 22:53:12 +0100 Subject: [PATCH 30/84] fix(emqx_rule_runtime): Dialyzer warnings --- apps/emqx_rule_engine/src/emqx_rule_runtime.erl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl index 2098072d3..808cccb99 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl @@ -49,7 +49,7 @@ apply_rules([], _Input) -> apply_rules([#rule{enabled = false}|More], Input) -> apply_rules(More, Input); apply_rules([Rule = #rule{id = RuleID}|More], Input) -> - try apply_rule(Rule, Input) + try apply_rule_discard_result(Rule, Input) catch %% ignore the errors if select or match failed _:{select_and_transform_error, Error} -> @@ -70,6 +70,13 @@ apply_rules([Rule = #rule{id = RuleID}|More], Input) -> end, apply_rules(More, Input). +apply_rule_discard_result(Rule, Input) -> + %% TODO check if below two clauses are ok to discard: + %% {'error','nomatch'} + %% {'ok',[any()]} + _ = apply_rule(Rule, Input), + ok. + apply_rule(Rule = #rule{id = RuleID}, Input) -> clear_rule_payload(), do_apply_rule(Rule, add_metadata(Input, #{rule_id => RuleID})). @@ -160,6 +167,7 @@ select_and_collect([Field|More], Input, {Output, LastKV}) -> {nested_put(Key, Val, Output), LastKV}). %% Filter each item got from FOREACH +-dialyzer({nowarn_function, filter_collection/4}). filter_collection(Input, InCase, DoEach, {CollKey, CollVal}) -> lists:filtermap( fun(Item) -> From bdfcc2da0e86e98244b5b5bbc5ea4f7c11bf7fd2 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 22:57:03 +0100 Subject: [PATCH 31/84] fix(emqx_rule_engine_api): Dialyzer warnings for no_match --- apps/emqx_rule_engine/src/emqx_rule_engine_api.erl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl index a09d526ae..2a6ad1754 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl @@ -22,6 +22,9 @@ -import(minirest, [return/1]). +%% A lot of case clause no_match:es from rule_events.hrl +-dialyzer(no_match). + -rest_api(#{name => create_rule, method => 'POST', path => "/rules/", From a59218d00850fd7a94132aa30d031e73666b81e5 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 23:15:09 +0100 Subject: [PATCH 32/84] fix(emqx_plugin_template): Dialyzer wanrings --- .../src/emqx_plugin_template.erl | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/apps/emqx_plugin_template/src/emqx_plugin_template.erl b/apps/emqx_plugin_template/src/emqx_plugin_template.erl index 4c8f2c84a..4e408f527 100644 --- a/apps/emqx_plugin_template/src/emqx_plugin_template.erl +++ b/apps/emqx_plugin_template/src/emqx_plugin_template.erl @@ -52,25 +52,25 @@ %% Called when the plugin application start load(Env) -> - emqx:hook('client.connect', {?MODULE, on_client_connect, [Env]}), - emqx:hook('client.connack', {?MODULE, on_client_connack, [Env]}), - emqx:hook('client.connected', {?MODULE, on_client_connected, [Env]}), - emqx:hook('client.disconnected', {?MODULE, on_client_disconnected, [Env]}), - emqx:hook('client.authenticate', {?MODULE, on_client_authenticate, [Env]}), - emqx:hook('client.check_acl', {?MODULE, on_client_check_acl, [Env]}), - emqx:hook('client.subscribe', {?MODULE, on_client_subscribe, [Env]}), - emqx:hook('client.unsubscribe', {?MODULE, on_client_unsubscribe, [Env]}), - emqx:hook('session.created', {?MODULE, on_session_created, [Env]}), - emqx:hook('session.subscribed', {?MODULE, on_session_subscribed, [Env]}), - emqx:hook('session.unsubscribed',{?MODULE, on_session_unsubscribed, [Env]}), - emqx:hook('session.resumed', {?MODULE, on_session_resumed, [Env]}), - emqx:hook('session.discarded', {?MODULE, on_session_discarded, [Env]}), - emqx:hook('session.takeovered', {?MODULE, on_session_takeovered, [Env]}), - emqx:hook('session.terminated', {?MODULE, on_session_terminated, [Env]}), - emqx:hook('message.publish', {?MODULE, on_message_publish, [Env]}), - emqx:hook('message.delivered', {?MODULE, on_message_delivered, [Env]}), - emqx:hook('message.acked', {?MODULE, on_message_acked, [Env]}), - emqx:hook('message.dropped', {?MODULE, on_message_dropped, [Env]}). + hook('client.connect', {?MODULE, on_client_connect, [Env]}), + hook('client.connack', {?MODULE, on_client_connack, [Env]}), + hook('client.connected', {?MODULE, on_client_connected, [Env]}), + hook('client.disconnected', {?MODULE, on_client_disconnected, [Env]}), + hook('client.authenticate', {?MODULE, on_client_authenticate, [Env]}), + hook('client.check_acl', {?MODULE, on_client_check_acl, [Env]}), + hook('client.subscribe', {?MODULE, on_client_subscribe, [Env]}), + hook('client.unsubscribe', {?MODULE, on_client_unsubscribe, [Env]}), + hook('session.created', {?MODULE, on_session_created, [Env]}), + hook('session.subscribed', {?MODULE, on_session_subscribed, [Env]}), + hook('session.unsubscribed',{?MODULE, on_session_unsubscribed, [Env]}), + hook('session.resumed', {?MODULE, on_session_resumed, [Env]}), + hook('session.discarded', {?MODULE, on_session_discarded, [Env]}), + hook('session.takeovered', {?MODULE, on_session_takeovered, [Env]}), + hook('session.terminated', {?MODULE, on_session_terminated, [Env]}), + hook('message.publish', {?MODULE, on_message_publish, [Env]}), + hook('message.delivered', {?MODULE, on_message_delivered, [Env]}), + hook('message.acked', {?MODULE, on_message_acked, [Env]}), + hook('message.dropped', {?MODULE, on_message_dropped, [Env]}). %%-------------------------------------------------------------------- %% Client Lifecircle Hooks @@ -186,3 +186,8 @@ unload() -> emqx:unhook('message.acked', {?MODULE, on_message_acked}), emqx:unhook('message.dropped', {?MODULE, on_message_dropped}). +hook(Name, MFA) -> + case emqx:hook(Name, MFA) of + ok -> ok; + {error, already_exists} -> ok + end. From e58abd916c714bb27db256f6676aaa6227652101 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Mon, 9 Nov 2020 23:27:50 +0100 Subject: [PATCH 33/84] fix(rule_engine.hrl): Type spec, args map is keyed by binary --- apps/emqx_rule_engine/include/rule_engine.hrl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/include/rule_engine.hrl b/apps/emqx_rule_engine/include/rule_engine.hrl index 9d01fefad..39c4daf69 100644 --- a/apps/emqx_rule_engine/include/rule_engine.hrl +++ b/apps/emqx_rule_engine/include/rule_engine.hrl @@ -60,7 +60,7 @@ { id :: action_instance_id() , name :: action_name() , fallbacks :: list(#action_instance{}) - , args :: #{atom() => term()} %% the args got from API for initializing action_instance + , args :: #{binary() => term()} %% the args got from API for initializing action_instance }). -record(rule, From a5045390974b5efd913f3568a35fc607ee3fc1ee Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 10 Nov 2020 16:38:01 +0100 Subject: [PATCH 34/84] fix(emqx_rule_registry): Dialyzer warning --- apps/emqx_rule_engine/src/emqx_rule_metrics.erl | 2 +- apps/emqx_rule_engine/src/emqx_rule_registry.erl | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl index c24954f94..48058eed2 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl @@ -99,7 +99,7 @@ -record(state, { metric_ids = sets:new(), - rule_speeds :: #{rule_id() => #rule_speed{}}, + rule_speeds :: undefined | #{rule_id() => #rule_speed{}}, overall_rule_speed :: #rule_speed{} }). diff --git a/apps/emqx_rule_engine/src/emqx_rule_registry.erl b/apps/emqx_rule_engine/src/emqx_rule_registry.erl index 9681f8daa..395e13eff 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_registry.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_registry.erl @@ -166,6 +166,10 @@ start_link() -> get_rules() -> get_all_records(?RULE_TAB). +%% TODO: emqx_rule_utils:can_topic_match_oneof(Topic::any(), For::atom()) +%% will never return since it differs in the 2nd argument from the success +%% typing arguments: (any(), [binary() | ['' | '#' | '+' | binary()]]) +-dialyzer([{nowarn_function, get_rules_for/1}]). -spec(get_rules_for(Topic :: binary()) -> list(emqx_rule_engine:rule())). get_rules_for(Topic) -> [Rule || Rule = #rule{for = For} <- get_rules(), @@ -329,9 +333,10 @@ remove_resource_params(ResId) -> %% @private delete_resource(ResId) -> - [[ResId =:= ResId1 andalso throw({dependency_exists, {rule, Id}}) - || #action_instance{args = #{<<"$resource">> := ResId1}} <- Actions] - || #rule{id = Id, actions = Actions} <- get_rules()], + %% TODO, change to foreache:s + _ = [[ResId =:= ResId1 andalso throw({dependency_exists, {rule, Id}}) + || #action_instance{args = #{<<"$resource">> := ResId1}} <- Actions] + || #rule{id = Id, actions = Actions} <- get_rules()], mnesia:delete(?RES_TAB, ResId, write). %% @private From 526d6f74bb358525759893bca69aef3972104402 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 10 Nov 2020 16:41:19 +0100 Subject: [PATCH 35/84] fix(emqx_rule_metrics): Fix type specs --- apps/emqx_rule_engine/src/emqx_rule_metrics.erl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl index 48058eed2..7631435a4 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_metrics.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_metrics.erl @@ -106,11 +106,11 @@ %%------------------------------------------------------------------------------ %% APIs %%------------------------------------------------------------------------------ --spec(create_rule_metrics(rule_id()) -> Ref :: reference()). +-spec(create_rule_metrics(rule_id()) -> Ref :: counters:counters_ref()). create_rule_metrics(Id) -> gen_server:call(?MODULE, {create_rule_metrics, Id}). --spec(create_metrics(rule_id()) -> Ref :: reference()). +-spec(create_metrics(rule_id()) -> Ref :: counters:counters_ref()). create_metrics(Id) -> gen_server:call(?MODULE, {create_metrics, Id}). @@ -133,7 +133,7 @@ get(Id, Metric) -> get_overall(Metric) -> emqx_metrics:val(Metric). --spec(get_rule_speed(atom()) -> map()). +-spec(get_rule_speed(rule_id()) -> map()). get_rule_speed(Id) -> gen_server:call(?MODULE, {get_rule_speed, Id}). @@ -157,14 +157,16 @@ get_action_metrics(Id) -> taken => get_actions_taken(Id) }. --spec(inc(rule_id(), atom()) -> ok). +-spec inc(rule_id(), atom()) -> ok. inc(Id, Metric) -> inc(Id, Metric, 1). + +-spec inc(rule_id(), atom(), pos_integer()) -> ok. inc(Id, Metric, Val) -> counters:add(couters_ref(Id), metrics_idx(Metric), Val), inc_overall(Metric, Val). --spec(inc_overall(rule_id(), atom()) -> ok). +-spec(inc_overall(atom(), pos_integer()) -> ok). inc_overall(Metric, Val) -> emqx_metrics:inc(Metric, Val). From 3dc11bc9e1aaeac9f95b2bc6755eed1d9814b38a Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 10 Nov 2020 21:28:01 +0100 Subject: [PATCH 36/84] fix(emqx_rule_funcs): Fix strng:pad calls --- apps/emqx_rule_engine/src/emqx_rule_funcs.erl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index a45ac1beb..96634a13d 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -587,25 +587,28 @@ sprintf_s(Format, Args) when is_list(Args) -> erlang:iolist_to_binary(io_lib:format(binary_to_list(Format), Args)). pad(S, Len) when is_binary(S), is_integer(Len) -> - iolist_to_binary(string:pad(S, Len, trailing)). + iolist_to_binary(string:pad(S, Len, trailing)). pad(S, Len, <<"trailing">>) when is_binary(S), is_integer(Len) -> - iolist_to_binary(string:pad(S, Len, trailing)); + iolist_to_binary(string:pad(S, Len, trailing)); pad(S, Len, <<"both">>) when is_binary(S), is_integer(Len) -> - iolist_to_binary(string:pad(S, Len, both)); + iolist_to_binary(string:pad(S, Len, both)); pad(S, Len, <<"leading">>) when is_binary(S), is_integer(Len) -> - iolist_to_binary(string:pad(S, Len, leading)). + iolist_to_binary(string:pad(S, Len, leading)). pad(S, Len, <<"trailing">>, Char) when is_binary(S), is_integer(Len), is_binary(Char) -> - iolist_to_binary(string:pad(S, Len, trailing, Char)); + Chars = unicode:characters_to_list(Char, utf8), + iolist_to_binary(string:pad(S, Len, trailing, Chars)); pad(S, Len, <<"both">>, Char) when is_binary(S), is_integer(Len), is_binary(Char) -> - iolist_to_binary(string:pad(S, Len, both, Char)); + Chars = unicode:characters_to_list(Char, utf8), + iolist_to_binary(string:pad(S, Len, both, Chars)); pad(S, Len, <<"leading">>, Char) when is_binary(S), is_integer(Len), is_binary(Char) -> - iolist_to_binary(string:pad(S, Len, leading, Char)). + Chars = unicode:characters_to_list(Char, utf8), + iolist_to_binary(string:pad(S, Len, leading, Chars)). replace(SrcStr, P, RepStr) when is_binary(SrcStr), is_binary(P), is_binary(RepStr) -> iolist_to_binary(string:replace(SrcStr, P, RepStr, all)). From 692f59afaf2fc89f4a38bfa8abe9f24c43e797ee Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 10 Nov 2020 21:28:35 +0100 Subject: [PATCH 37/84] fix(emqx_rule_events): Dialyzer warnings --- apps/emqx_rule_engine/src/emqx_rule_events.erl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_events.erl b/apps/emqx_rule_engine/src/emqx_rule_events.erl index 0e0f01c5d..c9e6a32b3 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_events.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_events.erl @@ -56,9 +56,10 @@ -endif. load(Env) -> - [emqx_hooks:add(HookPoint, {?MODULE, hook_fun(HookPoint), [hook_conf(HookPoint, Env)]}) - || HookPoint <- ?SUPPORTED_HOOK], - ok. + lists:foreach( + fun(HookPoint) -> + ok = emqx_hooks:put(HookPoint, {?MODULE, hook_fun(HookPoint), [hook_conf(HookPoint, Env)]}) + end, ?SUPPORTED_HOOK). unload(_Env) -> [emqx_hooks:del(HookPoint, {?MODULE, hook_fun(HookPoint)}) @@ -291,7 +292,8 @@ may_publish_and_apply(EventName, GenEventMsg, #{enabled := true, qos := QoS}) -> EventMsg = GenEventMsg(), case emqx_json:safe_encode(EventMsg) of {ok, Payload} -> - emqx_broker:safe_publish(make_msg(QoS, EventTopic, Payload)); + _ = emqx_broker:safe_publish(make_msg(QoS, EventTopic, Payload)), + ok; {error, _Reason} -> ?LOG(error, "Failed to encode event msg for ~p, msg: ~p", [EventName, EventMsg]) end, From 8bb8dc5363db56641eaeff4f05ce9981d82a1d53 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 11 Nov 2020 14:03:58 +0100 Subject: [PATCH 38/84] fix(emqx_rule_engine): Dialyzer warnings --- apps/emqx_rule_engine/src/emqx_rule_engine.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 1b74a00a0..315637a12 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -154,6 +154,7 @@ module_attributes(Module) -> %% APIs for rules and resources %%------------------------------------------------------------------------------ +-dialyzer([{nowarn_function, create_rule/1}]). -spec(create_rule(#{}) -> {ok, rule()} | no_return()). create_rule(Params = #{rawsql := Sql, actions := Actions}) -> case emqx_rule_sqlparser:parse_select(Sql) of @@ -178,7 +179,7 @@ create_rule(Params = #{rawsql := Sql, actions := Actions}) -> Error -> error(Error) end. --spec(update_rule(#{}) -> {ok, rule()} | no_return()). +-spec(update_rule(#{id := binary(), _=>_}) -> {ok, rule()} | no_return()). update_rule(Params = #{id := RuleId}) -> case emqx_rule_registry:get_rule(RuleId) of {ok, Rule0} -> @@ -364,8 +365,7 @@ with_resource_params(Args = #{<<"$resource">> := ResId}) -> end; with_resource_params(Args) -> Args. -may_update_rule_params(Rule, Params) when map_size(Params) =:= 0 -> - Rule; +-dialyzer([{nowarn_function, may_update_rule_params/2}]). may_update_rule_params(Rule, Params = #{rawsql := SQL}) -> case emqx_rule_sqlparser:parse_select(SQL) of {ok, Select} -> From 39883bdab1800ebdaa235f4cd53a6b1e115dfdb9 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 11 Nov 2020 14:04:39 +0100 Subject: [PATCH 39/84] fix(emqx_retainer): Dialyzer warnings --- apps/emqx_retainer/src/emqx_retainer.erl | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/emqx_retainer/src/emqx_retainer.erl b/apps/emqx_retainer/src/emqx_retainer.erl index 3d8206077..75c75e2a2 100644 --- a/apps/emqx_retainer/src/emqx_retainer.erl +++ b/apps/emqx_retainer/src/emqx_retainer.erl @@ -56,8 +56,9 @@ %%-------------------------------------------------------------------- load(Env) -> - emqx:hook('session.subscribed', fun ?MODULE:on_session_subscribed/3, []), - emqx:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]). + _ = emqx:hook('session.subscribed', fun ?MODULE:on_session_subscribed/3, []), + _ = emqx:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]), + ok. unload() -> emqx:unhook('message.publish', fun ?MODULE:on_message_publish/2), @@ -169,15 +170,17 @@ handle_info(stats, State = #state{stats_fun = StatsFun}) -> {noreply, State, hibernate}; handle_info(expire, State) -> - expire_messages(), + ok = expire_messages(), {noreply, State, hibernate}; handle_info(Info, State) -> ?LOG(error, "Unexpected info: ~p", [Info]), {noreply, State}. -terminate(_Reason, _State = #state{stats_timer = TRef1, expiry_timer = TRef2}) -> - timer:cancel(TRef1), timer:cancel(TRef2). +terminate(_Reason, #state{stats_timer = TRef1, expiry_timer = TRef2} = State) -> + _ = timer:cancel(TRef1), + _ = timer:cancel(TRef2), + ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. @@ -248,11 +251,12 @@ expire_messages() -> NowMs = erlang:system_time(millisecond), MsHd = #retained{topic = '$1', msg = '_', expiry_time = '$3'}, Ms = [{MsHd, [{'=/=','$3',0}, {'<','$3',NowMs}], ['$1']}], - mnesia:transaction( + {atomic, _} = mnesia:transaction( fun() -> Keys = mnesia:select(?TAB, Ms, write), lists:foreach(fun(Key) -> mnesia:delete({?TAB, Key}) end, Keys) - end). + end), + ok. -spec(read_messages(emqx_types:topic()) -> [emqx_types:message()]). From 18ae158f45be67d93a8f3123a357b250cc685ddc Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 13 Nov 2020 00:33:49 +0100 Subject: [PATCH 40/84] fix(emqx_plugins, emqx_sys, emqx_sys_mon, emqx_ws_connection): Dialyzer warnings --- src/emqx_plugins.erl | 8 ++++---- src/emqx_sys.erl | 14 +++++++------- src/emqx_sys_mon.erl | 4 ++-- src/emqx_ws_connection.erl | 28 ++++++++++++++-------------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index b62e9eb85..37bfcf7ba 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -65,7 +65,7 @@ load() -> case emqx:get_env(plugins_loaded_file) of undefined -> ignore; %% No plugins available File -> - ensure_file(File), + _ = ensure_file(File), with_loaded_file(File, fun(Names) -> load_plugins(Names, false) end) end. @@ -165,7 +165,7 @@ load_expand_plugins() -> load_expand_plugin(PluginDir) -> init_expand_plugin_config(PluginDir), Ebin = filename:join([PluginDir, "ebin"]), - code:add_patha(Ebin), + _ = code:add_patha(Ebin), Modules = filelib:wildcard(filename:join([Ebin, "*.beam"])), lists:foreach(fun(Mod) -> Module = list_to_atom(filename:basename(Mod, ".beam")), @@ -246,7 +246,7 @@ apply_configs([{App, Config} | More]) -> %% Stop plugins stop_plugins(Names) -> - [stop_app(App) || App <- Names], + _ = [stop_app(App) || App <- Names], ok. plugin(AppName, Type) -> @@ -297,7 +297,7 @@ start_app(App, SuccFun) -> unload_plugin(App, Persistent) -> case stop_app(App) of ok -> - plugin_unloaded(App, Persistent), ok; + _ = plugin_unloaded(App, Persistent), ok; {error, Reason} -> {error, Reason} end. diff --git a/src/emqx_sys.erl b/src/emqx_sys.erl index 38387b3ce..c77c23c49 100644 --- a/src/emqx_sys.erl +++ b/src/emqx_sys.erl @@ -151,16 +151,16 @@ handle_cast(Msg, State) -> {noreply, State}. handle_info({timeout, TRef, heartbeat}, State = #state{heartbeat = TRef}) -> - publish(uptime, iolist_to_binary(uptime(State))), - publish(datetime, iolist_to_binary(datetime())), + _ = publish(uptime, iolist_to_binary(uptime(State))), + _ = publish(datetime, iolist_to_binary(datetime())), {noreply, heartbeat(State)}; handle_info({timeout, TRef, tick}, State = #state{ticker = TRef, version = Version, sysdescr = Descr}) -> - publish(version, Version), - publish(sysdescr, Descr), - publish(brokers, ekka_mnesia:running_nodes()), - publish(stats, emqx_stats:getstats()), - publish(metrics, emqx_metrics:all()), + _ = publish(version, Version), + _ = publish(sysdescr, Descr), + _ = publish(brokers, ekka_mnesia:running_nodes()), + _ = publish(stats, emqx_stats:getstats()), + _ = publish(metrics, emqx_metrics:all()), {noreply, tick(State), hibernate}; handle_info(Info, State) -> diff --git a/src/emqx_sys_mon.erl b/src/emqx_sys_mon.erl index 5ee22c563..632dcf579 100644 --- a/src/emqx_sys_mon.erl +++ b/src/emqx_sys_mon.erl @@ -55,7 +55,7 @@ start_link(Opts) -> %%-------------------------------------------------------------------- init([Opts]) -> - erlang:system_monitor(self(), parse_opt(Opts)), + _ = erlang:system_monitor(self(), parse_opt(Opts)), emqx_logger:set_proc_metadata(#{sysmon => true}), %% Monitor cluster partition event @@ -174,7 +174,7 @@ suppress(Key, SuccFun, State = #{events := Events}) -> true -> {noreply, State}; false -> - SuccFun(), + _ = SuccFun(), {noreply, State#{events := [Key|Events]}} end. diff --git a/src/emqx_ws_connection.erl b/src/emqx_ws_connection.erl index 33b882768..b87251640 100644 --- a/src/emqx_ws_connection.erl +++ b/src/emqx_ws_connection.erl @@ -63,7 +63,7 @@ %% Simulate the active_n opt active_n :: pos_integer(), %% MQTT Piggyback - mqtt_piggyback :: single | multiple, + mqtt_piggyback :: single | multiple, %% Limiter limiter :: maybe(emqx_limiter:limiter()), %% Limit Timer @@ -535,7 +535,7 @@ handle_outgoing(Packets, State = #state{active_n = ActiveN, mqtt_piggyback = MQT postpone({check_gc, Stats}, State); false -> State end, - + {case MQTTPiggyback of single -> [{binary, IoData}]; multiple -> lists:map(fun(Bin) -> {binary, Bin} end, IoData) @@ -568,33 +568,33 @@ serialize_and_inc_stats_fun(#state{serialize = Serialize}) -> ]}). inc_recv_stats(Cnt, Oct) -> - emqx_pd:inc_counter(incoming_bytes, Oct), - emqx_pd:inc_counter(recv_cnt, Cnt), - emqx_pd:inc_counter(recv_oct, Oct), + _ = emqx_pd:inc_counter(incoming_bytes, Oct), + _ = emqx_pd:inc_counter(recv_cnt, Cnt), + _ = emqx_pd:inc_counter(recv_oct, Oct), emqx_metrics:inc('bytes.received', Oct). inc_incoming_stats(Packet = ?PACKET(Type)) -> - emqx_pd:inc_counter(recv_pkt, 1), + _ = emqx_pd:inc_counter(recv_pkt, 1), if Type == ?PUBLISH -> - emqx_pd:inc_counter(recv_msg, 1), - emqx_pd:inc_counter(incoming_pubs, 1); + _ = emqx_pd:inc_counter(recv_msg, 1), + _ = emqx_pd:inc_counter(incoming_pubs, 1); true -> ok end, emqx_metrics:inc_recv(Packet). inc_outgoing_stats(Packet = ?PACKET(Type)) -> - emqx_pd:inc_counter(send_pkt, 1), + _ = emqx_pd:inc_counter(send_pkt, 1), if Type == ?PUBLISH -> - emqx_pd:inc_counter(send_msg, 1), - emqx_pd:inc_counter(outgoing_pubs, 1); + _ = emqx_pd:inc_counter(send_msg, 1), + _ = emqx_pd:inc_counter(outgoing_pubs, 1); true -> ok end, emqx_metrics:inc_sent(Packet). inc_sent_stats(Cnt, Oct) -> - emqx_pd:inc_counter(outgoing_bytes, Oct), - emqx_pd:inc_counter(send_cnt, Cnt), - emqx_pd:inc_counter(send_oct, Oct), + _ = emqx_pd:inc_counter(outgoing_bytes, Oct), + _ = emqx_pd:inc_counter(send_cnt, Cnt), + _ = emqx_pd:inc_counter(send_oct, Oct), emqx_metrics:inc('bytes.sent', Oct). %%-------------------------------------------------------------------- From db256604970e54524cc28f789f815ebedaf4a4f2 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Sun, 15 Nov 2020 22:33:41 +0100 Subject: [PATCH 41/84] fix(emqx_auth_http_app): Dialyzer warnings --- apps/emqx_auth_http/src/emqx_auth_http_app.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_auth_http/src/emqx_auth_http_app.erl b/apps/emqx_auth_http/src/emqx_auth_http_app.erl index 1d235ca2a..59f34a265 100644 --- a/apps/emqx_auth_http/src/emqx_auth_http_app.erl +++ b/apps/emqx_auth_http/src/emqx_auth_http_app.erl @@ -36,8 +36,8 @@ start(_StartType, _StartArgs) -> ok -> {ok, PoolOpts} = application:get_env(?APP, pool_opts), {ok, Sup} = emqx_http_client_sup:start_link(?APP, ssl(inet(PoolOpts))), - with_env(auth_req, fun load_auth_hook/1), - with_env(acl_req, fun load_acl_hook/1), + _ = with_env(auth_req, fun load_auth_hook/1), + _ = with_env(acl_req, fun load_acl_hook/1), {ok, Sup}; {error, Reason} -> {error, Reason} @@ -144,4 +144,4 @@ same_host_and_port([{_, {Host, Port, _}}, {_, {Host, Port, _}}]) -> same_host_and_port([{_, {Host, Port, _}}, URL = {_, {Host, Port, _}} | Rest]) -> same_host_and_port([URL | Rest]); same_host_and_port(_) -> - false. \ No newline at end of file + false. From 9db6b3b430c040bbed7239bbe04a9bea7108d1bb Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Mon, 16 Nov 2020 00:20:22 +0100 Subject: [PATCH 42/84] fix(emqx_auth_mnesia_app): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl index cfc9df995..2de2672f8 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl @@ -38,8 +38,8 @@ start(_StartType, _StartArgs) -> emqx_ctl:register_command(username, {emqx_auth_mnesia_cli, auth_username_cli}, []), emqx_ctl:register_command(user, {emqx_auth_mnesia_cli, auth_username_cli}, []), emqx_ctl:register_command(acl, {emqx_acl_mnesia_cli, cli}, []), - load_auth_hook(), - load_acl_hook(), + _ = load_auth_hook(), + _ = load_acl_hook(), {ok, Sup}. prep_stop(State) -> From 62e0a21ad097759594b4bb03b45452784081de58 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Tue, 17 Nov 2020 10:16:32 +0100 Subject: [PATCH 43/84] fix(emqx_auth_sys, emqx_ws_connection): Dialyzer warnings --- src/emqx_sys.erl | 18 +++++++++++------- src/emqx_ws_connection.erl | 23 +++++++++++++---------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/emqx_sys.erl b/src/emqx_sys.erl index c77c23c49..9b256df0b 100644 --- a/src/emqx_sys.erl +++ b/src/emqx_sys.erl @@ -151,16 +151,16 @@ handle_cast(Msg, State) -> {noreply, State}. handle_info({timeout, TRef, heartbeat}, State = #state{heartbeat = TRef}) -> - _ = publish(uptime, iolist_to_binary(uptime(State))), - _ = publish(datetime, iolist_to_binary(datetime())), + publish_any(uptime, iolist_to_binary(uptime(State))), + publish_any(datetime, iolist_to_binary(datetime())), {noreply, heartbeat(State)}; handle_info({timeout, TRef, tick}, State = #state{ticker = TRef, version = Version, sysdescr = Descr}) -> - _ = publish(version, Version), - _ = publish(sysdescr, Descr), - _ = publish(brokers, ekka_mnesia:running_nodes()), - _ = publish(stats, emqx_stats:getstats()), - _ = publish(metrics, emqx_metrics:all()), + publish_any(version, Version), + publish_any(sysdescr, Descr), + publish_any(brokers, ekka_mnesia:running_nodes()), + publish_any(stats, emqx_stats:getstats()), + publish_any(metrics, emqx_metrics:all()), {noreply, tick(State), hibernate}; handle_info(Info, State) -> @@ -192,6 +192,10 @@ uptime(hours, H) -> uptime(days, D) -> [integer_to_list(D), " days, "]. +publish_any(Name, Value) -> + _ = publish(Name, Value), + ok. + publish(uptime, Uptime) -> safe_publish(systop(uptime), Uptime); publish(datetime, Datetime) -> diff --git a/src/emqx_ws_connection.erl b/src/emqx_ws_connection.erl index b87251640..8e65785c6 100644 --- a/src/emqx_ws_connection.erl +++ b/src/emqx_ws_connection.erl @@ -568,16 +568,16 @@ serialize_and_inc_stats_fun(#state{serialize = Serialize}) -> ]}). inc_recv_stats(Cnt, Oct) -> - _ = emqx_pd:inc_counter(incoming_bytes, Oct), - _ = emqx_pd:inc_counter(recv_cnt, Cnt), - _ = emqx_pd:inc_counter(recv_oct, Oct), + inc_counter(incoming_bytes, Oct), + inc_counter(recv_cnt, Cnt), + inc_counter(recv_oct, Oct), emqx_metrics:inc('bytes.received', Oct). inc_incoming_stats(Packet = ?PACKET(Type)) -> _ = emqx_pd:inc_counter(recv_pkt, 1), if Type == ?PUBLISH -> - _ = emqx_pd:inc_counter(recv_msg, 1), - _ = emqx_pd:inc_counter(incoming_pubs, 1); + inc_counter(recv_msg, 1), + inc_counter(incoming_pubs, 1); true -> ok end, emqx_metrics:inc_recv(Packet). @@ -585,18 +585,21 @@ inc_incoming_stats(Packet = ?PACKET(Type)) -> inc_outgoing_stats(Packet = ?PACKET(Type)) -> _ = emqx_pd:inc_counter(send_pkt, 1), if Type == ?PUBLISH -> - _ = emqx_pd:inc_counter(send_msg, 1), - _ = emqx_pd:inc_counter(outgoing_pubs, 1); + inc_counter(send_msg, 1), + inc_counter(outgoing_pubs, 1); true -> ok end, emqx_metrics:inc_sent(Packet). inc_sent_stats(Cnt, Oct) -> - _ = emqx_pd:inc_counter(outgoing_bytes, Oct), - _ = emqx_pd:inc_counter(send_cnt, Cnt), - _ = emqx_pd:inc_counter(send_oct, Oct), + inc_counter(outgoing_bytes, Oct), + inc_counter(send_cnt, Cnt), + inc_counter(send_oct, Oct), emqx_metrics:inc('bytes.sent', Oct). +inc_counter(Name, Value) -> + _ = emqx_pd:inc_counter(Name, Value), + ok. %%-------------------------------------------------------------------- %% Helper functions %%-------------------------------------------------------------------- From 5bb1da5896033098abd55b4dba2d882fb85d99f6 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 17 Nov 2020 12:56:13 +0100 Subject: [PATCH 44/84] fix(emqx_rule_engine_sup): discard ets:new return value --- apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl index 454c8ac6e..6f2e0018f 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_sup.erl @@ -31,8 +31,8 @@ start_link() -> init([]) -> Opts = [public, named_table, set, {read_concurrency, true}], - ets:new(?ACTION_INST_PARAMS_TAB, [{keypos, #action_instance_params.id}|Opts]), - ets:new(?RES_PARAMS_TAB, [{keypos, #resource_params.id}|Opts]), + _ = ets:new(?ACTION_INST_PARAMS_TAB, [{keypos, #action_instance_params.id}|Opts]), + _ = ets:new(?RES_PARAMS_TAB, [{keypos, #resource_params.id}|Opts]), Registry = #{id => emqx_rule_registry, start => {emqx_rule_registry, start_link, []}, restart => permanent, From c8b866dc63f80bad1cadf1e3e94cf5ddbc565747 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Wed, 18 Nov 2020 11:16:47 +0100 Subject: [PATCH 45/84] fix(emqx_rule_engine): Dialyzer warnings --- apps/emqx_rule_engine/include/rule_engine.hrl | 2 +- .../emqx_rule_engine/src/emqx_rule_engine.erl | 29 ++++++++++++------- .../src/emqx_rule_engine_api.erl | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/apps/emqx_rule_engine/include/rule_engine.hrl b/apps/emqx_rule_engine/include/rule_engine.hrl index 39c4daf69..49024bada 100644 --- a/apps/emqx_rule_engine/include/rule_engine.hrl +++ b/apps/emqx_rule_engine/include/rule_engine.hrl @@ -82,7 +82,7 @@ { id :: resource_id() , type :: resource_type_name() , config :: #{} %% the configs got from API for initializing resource - , created_at :: erlang:timestamp() + , created_at :: integer() %% epoch in millisecond precision , description :: binary() }). diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 315637a12..fc40ff38e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -39,6 +39,7 @@ , get_resource_status/1 , get_resource_params/1 , delete_resource/1 + , ensure_resource_deleted/1 ]). -export([ init_resource/4 @@ -154,7 +155,7 @@ module_attributes(Module) -> %% APIs for rules and resources %%------------------------------------------------------------------------------ --dialyzer([{nowarn_function, create_rule/1}]). +-dialyzer([{nowarn_function, [create_rule/1, rule_id/0]}]). -spec(create_rule(#{}) -> {ok, rule()} | no_return()). create_rule(Params = #{rawsql := Sql, actions := Actions}) -> case emqx_rule_sqlparser:parse_select(Sql) of @@ -179,7 +180,7 @@ create_rule(Params = #{rawsql := Sql, actions := Actions}) -> Error -> error(Error) end. --spec(update_rule(#{id := binary(), _=>_}) -> {ok, rule()} | no_return()). +-spec(update_rule(#{id := binary(), _=>_}) -> {ok, rule()} | {error, {not_found, rule_id()}}). update_rule(Params = #{id := RuleId}) -> case emqx_rule_registry:get_rule(RuleId) of {ok, Rule0} -> @@ -206,7 +207,7 @@ delete_rule(RuleId) -> ok end. --spec(create_resource(#{}) -> {ok, resource()} | {error, Reason :: term()}). +-spec(create_resource(#{type := _, config := _, _ => _}) -> {ok, resource()} | {error, Reason :: term()}). create_resource(#{type := Type, config := Config} = Params) -> case emqx_rule_registry:find_resource_type(Type) of {ok, #resource_type{on_create = {M, F}, params_spec = ParamSpec}} -> @@ -215,7 +216,9 @@ create_resource(#{type := Type, config := Config} = Params) -> Resource = #resource{id = ResId, type = Type, config = Config, - description = iolist_to_binary(maps:get(description, Params, ""))}, + description = iolist_to_binary(maps:get(description, Params, "")), + created_at = erlang:system_time(millisecond) + }, ok = emqx_rule_registry:add_resource(Resource), %% Note that we will return OK in case of resource creation failure, %% users can always re-start the resource later. @@ -231,14 +234,14 @@ start_resource(ResId) -> {ok, #resource{type = ResType, config = Config}} -> {ok, #resource_type{on_create = {Mod, Create}}} = emqx_rule_registry:find_resource_type(ResType), - init_resource(Mod, Create, ResId, Config), + _ = init_resource(Mod, Create, ResId, Config), refresh_actions_of_a_resource(ResId), ok; not_found -> {error, {resource_not_found, ResId}} end. --spec(test_resource(#{}) -> ok | {error, Reason :: term()}). +-spec(test_resource(#{type := _, config := _, _ => _}) -> ok | {error, Reason :: term()}). test_resource(#{type := Type, config := Config}) -> case emqx_rule_registry:find_resource_type(Type) of {ok, #resource_type{on_create = {ModC,Create}, on_destroy = {ModD,Destroy}, params_spec = ParamSpec}} -> @@ -284,6 +287,12 @@ delete_resource(ResId) -> {error, {resource_not_found, ResId}} end. +%% @doc Ensure resource deleted. `resource_not_found` error is discarded. +-spec(ensure_resource_deleted(resource_id()) -> ok). +ensure_resource_deleted(ResId) -> + _ = delete_resource(ResId), + ok. + %%------------------------------------------------------------------------------ %% Re-establish resources %%------------------------------------------------------------------------------ @@ -530,12 +539,12 @@ fetch_resource_status(Module, OnStatus, ResId) -> end. refresh_actions_of_a_resource(ResId) -> - [refresh_actions(Actions, - fun (#action_instance{args = #{<<"$resource">> := ResId0}}) + R = fun (#action_instance{args = #{<<"$resource">> := ResId0}}) when ResId0 =:= ResId -> true; (_) -> false - end) - || #rule{actions = Actions} <- emqx_rule_registry:get_rules()]. + end, + F = fun(#rule{actions = Actions}) -> refresh_actions(Actions, R) end, + lists:foreach(F, emqx_rule_registry:get_rules()). refresh_actions(Actions) -> refresh_actions(Actions, fun(_) -> true end). diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl index 2a6ad1754..131ea9651 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl @@ -355,7 +355,7 @@ start_resource(#{id := Id}, _Params) -> delete_resource(#{id := Id}, _Params) -> try - emqx_rule_engine:delete_resource(Id), + ok = emqx_rule_engine:ensure_resource_deleted(Id), return(ok) catch _Error:{throw,Reason} -> From b9b20ba2681976096962946ac7d89d483eb35fc1 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:14:37 +0100 Subject: [PATCH 46/84] fix(emqx.erl): Dialyzer warnings --- src/emqx.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqx.erl b/src/emqx.erl index 4e4a62396..2912c4402 100644 --- a/src/emqx.erl +++ b/src/emqx.erl @@ -184,7 +184,7 @@ hook(HookPoint, Action, InitArgs) when is_list(InitArgs) -> hook(HookPoint, Action, Filter, Priority) -> emqx_hooks:add(HookPoint, Action, Filter, Priority). --spec(unhook(emqx_hooks:hookpoint(), function() | {module(), atom()}) -> ok). +-spec(unhook(emqx_hooks:hookpoint(), fun() | {module(), atom()}) -> ok). unhook(HookPoint, Action) -> emqx_hooks:del(HookPoint, Action). From d8c9547a5e2161cf20474b76925fac8c9c0be9fc Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:23:50 +0100 Subject: [PATCH 47/84] fix(emqx_auth_http): Dialyzer warnings --- apps/emqx_auth_http/src/emqx_auth_http.erl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/emqx_auth_http/src/emqx_auth_http.erl b/apps/emqx_auth_http/src/emqx_auth_http.erl index 20026d6ee..21fe2d325 100644 --- a/apps/emqx_auth_http/src/emqx_auth_http.erl +++ b/apps/emqx_auth_http/src/emqx_auth_http.erl @@ -29,6 +29,10 @@ , feedvar/2 ]). +-type http_request() :: #http_request{method::'get' | 'post',params::[any()]}. +%-type http_opts() :: #{clientid:=_, peerhost:=_, protocol:=_, _=>_}. +%-type retry_opts() :: #{backoff:=_, interval:=_, times:=_, _=>_}. + %% Callbacks -export([ register_metrics/0 , check/3 @@ -80,7 +84,7 @@ authenticate(PoolName, #http_request{path = Path, request_timeout = RequestTimeout}, ClientInfo) -> request(PoolName, Method, Path, Headers, feedvar(Params, ClientInfo), RequestTimeout). --spec(is_superuser(atom(), maybe(#http_request{}), emqx_types:client()) -> boolean()). +-spec(is_superuser(atom(), maybe(http_request()), emqx_types:client()) -> boolean()). is_superuser(_PoolName, undefined, _ClientInfo) -> false; is_superuser(PoolName, #http_request{path = Path, From dc27900260918e3e64847aa460d9a1110f8d9714 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:32:10 +0100 Subject: [PATCH 48/84] fix(emqx_auth_jwt_app): Dialyzer warnings --- apps/emqx_auth_jwt/src/emqx_auth_jwt_app.erl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/emqx_auth_jwt/src/emqx_auth_jwt_app.erl b/apps/emqx_auth_jwt/src/emqx_auth_jwt_app.erl index 736fb28b9..0926bf697 100644 --- a/apps/emqx_auth_jwt/src/emqx_auth_jwt_app.erl +++ b/apps/emqx_auth_jwt/src/emqx_auth_jwt_app.erl @@ -33,11 +33,10 @@ start(_Type, _Args) -> {ok, Pid} = start_auth_server(jwks_svr_options()), ok = emqx_auth_jwt:register_metrics(), - AuthEnv0 = auth_env(), AuthEnv1 = AuthEnv0#{pid => Pid}, - emqx:hook('client.authenticate', {emqx_auth_jwt, check, [AuthEnv1]}), + _ = emqx:hook('client.authenticate', {emqx_auth_jwt, check, [AuthEnv1]}), {ok, Sup, AuthEnv1}. stop(AuthEnv) -> From 4905b98c26f2cf71e044e9f30e1b62850a60fb55 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:34:34 +0100 Subject: [PATCH 49/84] fix(emqx_auth_ldap_app): Dialyzer warnings --- apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl b/apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl index 5922950f0..94c741945 100644 --- a/apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl +++ b/apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl @@ -30,11 +30,11 @@ start(_StartType, _StartArgs) -> {ok, Sup} = emqx_auth_ldap_sup:start_link(), - if_enabled([device_dn, match_objectclass, + _ = if_enabled([device_dn, match_objectclass, username_attr, password_attr, filters, custom_base_dn, bind_as_user], fun load_auth_hook/1), - if_enabled([device_dn, match_objectclass, + _ = if_enabled([device_dn, match_objectclass, username_attr, password_attr, filters, custom_base_dn, bind_as_user], fun load_acl_hook/1), @@ -60,8 +60,7 @@ load_acl_hook(DeviceDn) -> if_enabled(Cfgs, Fun) -> case get_env(Cfgs) of - {ok, InitArgs} -> Fun(InitArgs); - [] -> ok + {ok, InitArgs} -> Fun(InitArgs) end. get_env(Cfgs) -> From 7ba5c1787baeb0408b7579319ef50837fab5ce17 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:36:41 +0100 Subject: [PATCH 50/84] fix(emqx_auth_mnesia_cli): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl index b937eb238..cd31675aa 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl @@ -68,13 +68,8 @@ do_update_user(User = #emqx_user{login = Login}) -> -spec(lookup_user(tuple()) -> list()). lookup_user(undefined) -> []; lookup_user(Login) -> - case mnesia:dirty_read(?TABLE, Login) of - {error, Reason} -> - ?LOG(error, "[Mnesia] do_check_user error: ~p~n", [Reason]), - []; - Re -> - lists:sort(fun comparing/2, Re) - end. + Re = mnesia:dirty_read(?TABLE, Login), + lists:sort(fun comparing/2, Re). %% @doc Remove user -spec(remove_user(tuple()) -> ok | {error, any()}). @@ -88,7 +83,6 @@ all_users() -> mnesia:dirty_all_keys(?TABLE). all_users(clientid) -> MatchSpec = ets:fun2ms(fun({?TABLE, {clientid, Clientid}, Password, CreatedAt}) -> {?TABLE, {clientid, Clientid}, Password, CreatedAt} end), lists:sort(fun comparing/2, ets:select(?TABLE, MatchSpec)); - all_users(username) -> MatchSpec = ets:fun2ms(fun({?TABLE, {username, Username}, Password, CreatedAt}) -> {?TABLE, {username, Username}, Password, CreatedAt} end), lists:sort(fun comparing/2, ets:select(?TABLE, MatchSpec)). From 0e24e59366d16fe467fe9c510cdf7bf46959efd1 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:44:30 +0100 Subject: [PATCH 51/84] fix(emqx_auth_mysql_app): Dialyzer warnings --- apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl b/apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl index 26895cd9a..3936f6c4c 100644 --- a/apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl +++ b/apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl @@ -36,8 +36,8 @@ start(_StartType, _StartArgs) -> {ok, Sup} = emqx_auth_mysql_sup:start_link(), - if_enabled(auth_query, fun load_auth_hook/1), - if_enabled(acl_query, fun load_acl_hook/1), + _ = if_enabled(auth_query, fun load_auth_hook/1), + _ = if_enabled(acl_query, fun load_acl_hook/1), {ok, Sup}. From b5e0386c98e39ded41129d12d1fe4db6beb24c6e Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:45:35 +0100 Subject: [PATCH 52/84] fix(emqx_auth_redis_app): Dialyzer warnings --- apps/emqx_auth_redis/src/emqx_auth_redis_app.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_auth_redis/src/emqx_auth_redis_app.erl b/apps/emqx_auth_redis/src/emqx_auth_redis_app.erl index 345f9f87d..619b3f78d 100644 --- a/apps/emqx_auth_redis/src/emqx_auth_redis_app.erl +++ b/apps/emqx_auth_redis/src/emqx_auth_redis_app.erl @@ -28,8 +28,8 @@ start(_StartType, _StartArgs) -> {ok, Sup} = emqx_auth_redis_sup:start_link(), - if_cmd_enabled(auth_cmd, fun load_auth_hook/1), - if_cmd_enabled(acl_cmd, fun load_acl_hook/1), + _ = if_cmd_enabled(auth_cmd, fun load_auth_hook/1), + _ = if_cmd_enabled(acl_cmd, fun load_acl_hook/1), {ok, Sup}. stop(_State) -> From 822460377c12af0f1408aeae5f1c71752454a65b Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:46:46 +0100 Subject: [PATCH 53/84] fix(emqx_auth_redis_cli): Dialyzer warnings --- apps/emqx_auth_redis/src/emqx_auth_redis_cli.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_auth_redis/src/emqx_auth_redis_cli.erl b/apps/emqx_auth_redis/src/emqx_auth_redis_cli.erl index 31cb67505..26550dff4 100644 --- a/apps/emqx_auth_redis/src/emqx_auth_redis_cli.erl +++ b/apps/emqx_auth_redis/src/emqx_auth_redis_cli.erl @@ -38,7 +38,7 @@ connect(Opts) -> Host = case Sentinel =:= "" of true -> get_value(host, Opts); false -> - eredis_sentinel:start_link(get_value(servers, Opts)), + _ = eredis_sentinel:start_link(get_value(servers, Opts)), "sentinel:" ++ Sentinel end, case eredis:start_link(Host, From 950430d5da42a336149cab491f204e73e88a27b4 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:49:28 +0100 Subject: [PATCH 54/84] fix(emqx_coap_ps_topics): Dialyzer warnings --- apps/emqx_coap/src/emqx_coap_ps_topics.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_coap/src/emqx_coap_ps_topics.erl b/apps/emqx_coap/src/emqx_coap_ps_topics.erl index 30e9d2623..b4affab28 100644 --- a/apps/emqx_coap/src/emqx_coap_ps_topics.erl +++ b/apps/emqx_coap/src/emqx_coap_ps_topics.erl @@ -104,7 +104,7 @@ lookup_topic_payload(Topic) -> %%-------------------------------------------------------------------- init([]) -> - ets:new(?COAP_TOPIC_TABLE, [set, named_table, protected]), + _ = ets:new(?COAP_TOPIC_TABLE, [set, named_table, protected]), ?LOG(debug, "Create the coap_topic table", []), {ok, #state{}}. From d54a5300fc7323f7d214f256e2449e4255706e8d Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:56:21 +0100 Subject: [PATCH 55/84] fix(emqx_coap_registry): Dialyzer warnings --- apps/emqx_coap/src/emqx_coap_registry.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_coap/src/emqx_coap_registry.erl b/apps/emqx_coap/src/emqx_coap_registry.erl index 369bf2787..8e1936a98 100644 --- a/apps/emqx_coap/src/emqx_coap_registry.erl +++ b/apps/emqx_coap/src/emqx_coap_registry.erl @@ -86,8 +86,8 @@ stop() -> %% ------------------------------------------------------------------ init([]) -> - ets:new(?RESPONSE_TAB, [set, named_table, protected]), - ets:new(?RESPONSE_REF_TAB, [set, named_table, protected]), + _ = ets:new(?RESPONSE_TAB, [set, named_table, protected]), + _ = ets:new(?RESPONSE_REF_TAB, [set, named_table, protected]), {ok, #state{}}. handle_call({register_name, Name, Pid}, _From, State) -> From cb4892b8c40aef1127465d76328c91f229635566 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 13:58:09 +0100 Subject: [PATCH 56/84] fix(emqx_dashboard_admin): Dialyzer warnings --- apps/emqx_dashboard/src/emqx_dashboard_admin.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl index 1a77b0d64..cbfb6c926 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl @@ -137,7 +137,7 @@ change_password_hash(Username, PasswordHash) -> update_pwd(Username, Fun) -> Trans = fun() -> - User = + User = case lookup_user(Username) of [Admin] -> Admin; [] -> @@ -180,7 +180,7 @@ check(Username, Password) -> init([]) -> %% Add default admin user - add_default_user(binenv(default_user_username), binenv(default_user_passwd)), + _ = add_default_user(binenv(default_user_username), binenv(default_user_passwd)), {ok, state}. handle_call(_Req, _From, State) -> @@ -210,7 +210,7 @@ md5_hash(SaltBin, Password) -> erlang:md5(<>). salt() -> - emqx_misc:rand_seed(), + _ = emqx_misc:rand_seed(), Salt = rand:uniform(16#ffffffff), <>. From b0ea0e2ddb988c47ec903abc7d09da7a268936be Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:02:02 +0100 Subject: [PATCH 57/84] fix(emqx_exhook_app): Dialyzer warnings --- apps/emqx_exhook/src/emqx_exhook_app.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_exhook/src/emqx_exhook_app.erl b/apps/emqx_exhook/src/emqx_exhook_app.erl index 1411b618d..e24002abb 100644 --- a/apps/emqx_exhook/src/emqx_exhook_app.erl +++ b/apps/emqx_exhook/src/emqx_exhook_app.erl @@ -45,7 +45,7 @@ start(_StartType, _StartArgs) -> load_all_servers(), %% Register all hooks - load_exhooks(), + _ = load_exhooks(), %% Register CLI emqx_ctl:register_command(exhook, {emqx_exhook_cli, cli}, []), @@ -53,8 +53,8 @@ start(_StartType, _StartArgs) -> prep_stop(State) -> emqx_ctl:unregister_command(exhook), - unload_exhooks(), - unload_all_servers(), + _ = unload_exhooks(), + _ = unload_all_servers(), State. stop(_State) -> From 31c6292008d2b211e0b150ff9e68d736a815d474 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:21:39 +0100 Subject: [PATCH 58/84] fix(emqx_exproto_conn): Dialyzer warnings --- apps/emqx_exproto/src/emqx_exproto_conn.erl | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/emqx_exproto/src/emqx_exproto_conn.erl b/apps/emqx_exproto/src/emqx_exproto_conn.erl index e6f7676a1..5ef6b5529 100644 --- a/apps/emqx_exproto/src/emqx_exproto_conn.erl +++ b/apps/emqx_exproto/src/emqx_exproto_conn.erl @@ -527,10 +527,10 @@ handle_timeout(TRef, Msg, State) -> process_incoming(Data, State = #state{idle_timer = IdleTimer}) -> ?LOG(debug, "RECV ~0p", [Data]), Oct = iolist_size(Data), - emqx_pd:inc_counter(incoming_bytes, Oct), - emqx_pd:inc_counter(incoming_pkt, 1), - emqx_pd:inc_counter(recv_pkt, 1), - emqx_pd:inc_counter(recv_msg, 1), + inc_counter(incoming_bytes, Oct), + inc_counter(incoming_pkt, 1), + inc_counter(recv_pkt, 1), + inc_counter(recv_msg, 1), % TODO: %ok = emqx_metrics:inc('bytes.received', Oct), @@ -561,10 +561,10 @@ handle_outgoing(IoData, State = #state{socket = Socket}) -> Oct = iolist_size(IoData), - emqx_pd:inc_counter(send_pkt, 1), - emqx_pd:inc_counter(send_msg, 1), - emqx_pd:inc_counter(outgoing_pkt, 1), - emqx_pd:inc_counter(outgoing_bytes, Oct), + inc_counter(send_pkt, 1), + inc_counter(send_msg, 1), + inc_counter(outgoing_pkt, 1), + inc_counter(outgoing_bytes, Oct), %% FIXME: %%ok = emqx_metrics:inc('bytes.sent', Oct), @@ -680,3 +680,7 @@ stop(Reason, State) -> stop(Reason, Reply, State) -> {stop, Reason, Reply, State}. + +inc_counter(Name, Value) -> + _ = emqx_pd:inc_counter(Name, Value), + ok. From 59d69b730ba10c4f2b5954806bc8e4ecce00de42 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:23:40 +0100 Subject: [PATCH 59/84] fix(emqx_logger): Dialyzer warnings --- src/emqx_logger.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqx_logger.erl b/src/emqx_logger.erl index 5436a7194..5c6808840 100644 --- a/src/emqx_logger.erl +++ b/src/emqx_logger.erl @@ -268,7 +268,7 @@ set_all_log_handlers_level([], _NewLevel, _NewHanlder) -> ok. rollback([{ID, Level} | List]) -> - set_log_handler_level(ID, Level), + _ = set_log_handler_level(ID, Level), rollback(List); rollback([]) -> ok. From a94b70a95e5d95e1486d3af857a2b0d18eebc5b4 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:33:45 +0100 Subject: [PATCH 60/84] fix(emqx_lua_hook): Dialyzer warnings --- apps/emqx_lua_hook/src/emqx_lua_hook.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_lua_hook/src/emqx_lua_hook.erl b/apps/emqx_lua_hook/src/emqx_lua_hook.erl index b17072eeb..afdb63f51 100644 --- a/apps/emqx_lua_hook/src/emqx_lua_hook.erl +++ b/apps/emqx_lua_hook/src/emqx_lua_hook.erl @@ -147,7 +147,7 @@ do_load(FileName) -> error; {Ret1, St1} -> ?LOG(debug, "Register lua script ~p", [FileName]), - do_register_hooks(Ret1, FileName, St1), + _ = do_register_hooks(Ret1, FileName, St1), {FileName, St1}; Other -> ?LOG(error, "Failed to load lua script ~p, register_hook() raise exception ~p", [FileName, Other]), From 8ed5dc0b787ca5f26238b92ffa81d9c2df9f8a2d Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:38:13 +0100 Subject: [PATCH 61/84] fix(emqx_lwm2m_timer): Dialyzer warnings --- apps/emqx_lwm2m/src/emqx_lwm2m_timer.erl | 2 +- apps/emqx_lwm2m/src/emqx_lwm2m_xml_object_db.erl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_timer.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_timer.erl index 928804ddc..1aaaf5fdb 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_timer.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_timer.erl @@ -33,7 +33,7 @@ logger:Level("LWM2M-TIMER: " ++ Format, Args)). cancel_timer(#timer_state{tref = TRef}) when is_reference(TRef) -> - erlang:cancel_timer(TRef), ok. + _ = erlang:cancel_timer(TRef), ok. refresh_timer(State=#timer_state{interval = Interval, message = Msg}) -> cancel_timer(State), start_timer(Interval, Msg). diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_xml_object_db.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_xml_object_db.erl index 2221c83f5..873a9f27b 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_xml_object_db.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_xml_object_db.erl @@ -86,8 +86,8 @@ stop() -> %% ------------------------------------------------------------------ init([]) -> - ets:new(?LWM2M_OBJECT_DEF_TAB, [set, named_table, protected]), - ets:new(?LWM2M_OBJECT_NAME_TO_ID_TAB, [set, named_table, protected]), + _ = ets:new(?LWM2M_OBJECT_DEF_TAB, [set, named_table, protected]), + _ = ets:new(?LWM2M_OBJECT_NAME_TO_ID_TAB, [set, named_table, protected]), PluginsEtcDir = emqx:get_env(plugins_etc_dir), DefBaseDir = re:replace(PluginsEtcDir, "plugins", "lwm2m_xml", [{return, list}]), BaseDir = application:get_env(emqx_lwm2m, xml_dir, DefBaseDir), From 37e3b11263b4ba2b576aab5e7490de896abc6e58 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 14:42:42 +0100 Subject: [PATCH 62/84] fix(emqx_mgmt_api_alarms): Dialyzer warnings --- apps/emqx_management/src/emqx_mgmt_api_alarms.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api_alarms.erl b/apps/emqx_management/src/emqx_mgmt_api_alarms.erl index db4e518d3..a274b899c 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_alarms.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_alarms.erl @@ -111,7 +111,7 @@ deactivate(_Bindings, Params) -> do_deactivate(Node, Name). delete_deactivated(Bindings, _Params) when map_size(Bindings) == 0 -> - emqx_mgmt:delete_all_deactivated_alarms(), + _ = emqx_mgmt:delete_all_deactivated_alarms(), {ok, #{code => ?SUCCESS}}; delete_deactivated(#{node := Node}, _Params) -> @@ -134,4 +134,4 @@ do_deactivate(Node, Name) -> minirest:return(); {error, Reason} -> minirest:return({error, Reason}) - end. \ No newline at end of file + end. From 1a8baa9d8af3c424773b385c43d9c96c6b5b676e Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 15:05:15 +0100 Subject: [PATCH 63/84] fix(emqx_management): Dialyzer warnings --- apps/emqx_management/src/emqx_mgmt_api_data.erl | 10 +++++----- apps/emqx_management/src/emqx_mgmt_app.erl | 2 +- apps/emqx_management/src/emqx_mgmt_cli.erl | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api_data.erl b/apps/emqx_management/src/emqx_mgmt_api_data.erl index a449141ce..f6c7350fe 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_data.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_data.erl @@ -187,11 +187,11 @@ do_import(Filename) -> emqx_mgmt:import_applications(maps:get(<<"apps">>, Data, [])), emqx_mgmt:import_users(maps:get(<<"users">>, Data, [])), emqx_mgmt:import_modules(maps:get(<<"modules">>, Data, [])), - emqx_mgmt:import_auth_clientid(maps:get(<<"auth_clientid">>, Data, [])), - emqx_mgmt:import_auth_username(maps:get(<<"auth_username">>, Data, [])), - emqx_mgmt:import_auth_mnesia(maps:get(<<"auth_mnesia">>, Data, []), Version), - emqx_mgmt:import_acl_mnesia(maps:get(<<"acl_mnesia">>, Data, []), Version), - emqx_mgmt:import_schemas(maps:get(<<"schemas">>, Data, [])), + _ = emqx_mgmt:import_auth_clientid(maps:get(<<"auth_clientid">>, Data, [])), + _ = emqx_mgmt:import_auth_username(maps:get(<<"auth_username">>, Data, [])), + _ = emqx_mgmt:import_auth_mnesia(maps:get(<<"auth_mnesia">>, Data, []), Version), + _ = emqx_mgmt:import_acl_mnesia(maps:get(<<"acl_mnesia">>, Data, []), Version), + _ = emqx_mgmt:import_schemas(maps:get(<<"schemas">>, Data, [])), logger:debug("The emqx data has been imported successfully"), ok catch Class:Reason:Stack -> diff --git a/apps/emqx_management/src/emqx_mgmt_app.erl b/apps/emqx_management/src/emqx_mgmt_app.erl index 7217304b2..e2ec6385c 100644 --- a/apps/emqx_management/src/emqx_mgmt_app.erl +++ b/apps/emqx_management/src/emqx_mgmt_app.erl @@ -26,7 +26,7 @@ start(_Type, _Args) -> {ok, Sup} = emqx_mgmt_sup:start_link(), - emqx_mgmt_auth:add_default_app(), + _ = emqx_mgmt_auth:add_default_app(), emqx_mgmt_http:start_listeners(), emqx_mgmt_cli:load(), {ok, Sup}. diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index b0870cbf3..2ddd8d459 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -606,11 +606,11 @@ data(["import", Filename]) -> emqx_mgmt:import_blacklist(maps:get(<<"blacklist">>, Data, [])), emqx_mgmt:import_applications(maps:get(<<"apps">>, Data, [])), emqx_mgmt:import_users(maps:get(<<"users">>, Data, [])), - emqx_mgmt:import_auth_clientid(maps:get(<<"auth_clientid">>, Data, [])), - emqx_mgmt:import_auth_username(maps:get(<<"auth_username">>, Data, [])), - emqx_mgmt:import_auth_mnesia(maps:get(<<"auth_mnesia">>, Data, [])), - emqx_mgmt:import_acl_mnesia(maps:get(<<"acl_mnesia">>, Data, [])), - emqx_mgmt:import_schemas(maps:get(<<"schemas">>, Data, [])), + _ = emqx_mgmt:import_auth_clientid(maps:get(<<"auth_clientid">>, Data, [])), + _ = emqx_mgmt:import_auth_username(maps:get(<<"auth_username">>, Data, [])), + _ = emqx_mgmt:import_auth_mnesia(maps:get(<<"auth_mnesia">>, Data, [])), + _ = emqx_mgmt:import_acl_mnesia(maps:get(<<"acl_mnesia">>, Data, [])), + _ = emqx_mgmt:import_schemas(maps:get(<<"schemas">>, Data, [])), emqx_ctl:print("The emqx data has been imported successfully.~n") catch Class:Reason:Stack -> emqx_ctl:print("The emqx data import failed due: ~0p~n", [{Class,Reason,Stack}]) From 7116a22fa5a0cf0d685c57fc9a81d3f4811ee76b Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 15:13:15 +0100 Subject: [PATCH 64/84] fix(emqx_psk_file): Dialyzer warnings --- apps/emqx_psk_file/src/emqx_psk_file.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_psk_file/src/emqx_psk_file.erl b/apps/emqx_psk_file/src/emqx_psk_file.erl index 1f9ad5a4b..be438aa06 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file.erl +++ b/apps/emqx_psk_file/src/emqx_psk_file.erl @@ -37,7 +37,7 @@ load(Env) -> ets:new(?TAB, [set, named_table, {keypos, #psk_entry.psk_id}]), {ok, PskFile} = file:open(get_value(path, Env), [read, raw, binary, read_ahead]), preload_psks(PskFile, bin(get_value(delimiter, Env))), - file:close(PskFile), + _ = file:close(PskFile), emqx:hook('tls_handshake.psk_lookup', fun ?MODULE:on_psk_lookup/2, []). %% Called when the plugin application stop From 01fe9d3ee78374ae099c00298ad2f65f42e30120 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Fri, 20 Nov 2020 15:16:38 +0100 Subject: [PATCH 65/84] fix(emqx_psk_file_app): Dialyzer warnings --- apps/emqx_psk_file/src/emqx_psk_file_app.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_psk_file/src/emqx_psk_file_app.erl b/apps/emqx_psk_file/src/emqx_psk_file_app.erl index eca7bb21c..be7440150 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file_app.erl +++ b/apps/emqx_psk_file/src/emqx_psk_file_app.erl @@ -25,7 +25,7 @@ start(_StartType, _StartArgs) -> {ok, Sup} = emqx_psk_file_sup:start_link(), - emqx_psk_file:load( + _ = emqx_psk_file:load( application:get_all_env(emqx_psk_file)), {ok, Sup}. From 80f56654e22cfdd9ab8f7cce4af046e1fa74366c Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Mon, 23 Nov 2020 21:41:55 +0100 Subject: [PATCH 66/84] fix(emqx_psk_file): Dialyzer warnings --- apps/emqx_psk_file/src/emqx_psk_file.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_psk_file/src/emqx_psk_file.erl b/apps/emqx_psk_file/src/emqx_psk_file.erl index be438aa06..ca9bc1292 100644 --- a/apps/emqx_psk_file/src/emqx_psk_file.erl +++ b/apps/emqx_psk_file/src/emqx_psk_file.erl @@ -34,7 +34,7 @@ %% Called when the plugin application start load(Env) -> - ets:new(?TAB, [set, named_table, {keypos, #psk_entry.psk_id}]), + _ = ets:new(?TAB, [set, named_table, {keypos, #psk_entry.psk_id}]), {ok, PskFile} = file:open(get_value(path, Env), [read, raw, binary, read_ahead]), preload_psks(PskFile, bin(get_value(delimiter, Env))), _ = file:close(PskFile), From a03d7045cfaadac1aaa910abaf0a99a5001978e0 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Mon, 23 Nov 2020 21:51:35 +0100 Subject: [PATCH 67/84] fix(emqx_lwm2m_protocol): Dialyzer warnings --- apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl index a1cbddee0..6e413ca45 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl @@ -109,7 +109,7 @@ post_init(Lwm2mState = #lwm2m_state{endpoint_name = _EndpointName, Topic = downlink_topic(<<"register">>, Lwm2mState), subscribe(Topic, Lwm2mState), %% - report the registration info - send_to_broker(<<"register">>, #{<<"data">> => RegInfo}, Lwm2mState), + _ = send_to_broker(<<"register">>, #{<<"data">> => RegInfo}, Lwm2mState), Lwm2mState#lwm2m_state{mqtt_topic = Topic}. update_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, register_info = RegInfo, @@ -124,7 +124,7 @@ update_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, regi end, %% - flush cached donwlink commands - flush_cached_downlink_messages(CoapPid), + _ = flush_cached_downlink_messages(CoapPid), %% - update the life timer UpdatedLifeTimer = emqx_lwm2m_timer:refresh_timer( @@ -136,16 +136,16 @@ update_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, regi replace_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, coap_pid = CoapPid}) -> - send_to_broker(<<"register">>, #{<<"data">> => NewRegInfo}, Lwm2mState), + _ = send_to_broker(<<"register">>, #{<<"data">> => NewRegInfo}, Lwm2mState), %% - flush cached donwlink commands - flush_cached_downlink_messages(CoapPid), + _ = flush_cached_downlink_messages(CoapPid), %% - update the life timer UpdatedLifeTimer = emqx_lwm2m_timer:refresh_timer( maps:get(<<"lt">>, NewRegInfo), LifeTimer), - send_auto_observe(CoapPid, NewRegInfo), + _ = send_auto_observe(CoapPid, NewRegInfo), ?LOG(debug, "Replace RegInfo to: ~p", [NewRegInfo]), Lwm2mState#lwm2m_state{life_timer = UpdatedLifeTimer, @@ -153,13 +153,13 @@ replace_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, send_ul_data(_EventType, <<>>, _Lwm2mState) -> ok; send_ul_data(EventType, Payload, Lwm2mState=#lwm2m_state{coap_pid = CoapPid}) -> - send_to_broker(EventType, Payload, Lwm2mState), - flush_cached_downlink_messages(CoapPid), + _ = send_to_broker(EventType, Payload, Lwm2mState), + _ = flush_cached_downlink_messages(CoapPid), Lwm2mState. auto_observe(Lwm2mState = #lwm2m_state{register_info = RegInfo, coap_pid = CoapPid}) -> - send_auto_observe(CoapPid, RegInfo), + _ = send_auto_observe(CoapPid, RegInfo), Lwm2mState. deliver(#message{topic = Topic, payload = Payload}, Lwm2mState = #lwm2m_state{coap_pid = CoapPid, register_info = RegInfo, started_at = StartedAt}) -> @@ -297,7 +297,7 @@ observe_object(AlternatePath, ObjectPath, CoapPid) -> do_deliver_to_coap_slowly(CoapPid, CoapRequestList, Interval) -> erlang:spawn(fun() -> lists:foreach(fun({CoapRequest, Ref}) -> - do_deliver_to_coap(CoapPid, CoapRequest, Ref), + _ = do_deliver_to_coap(CoapPid, CoapRequest, Ref), timer:sleep(Interval) end, lists:reverse(CoapRequestList)) end). From 18ddde01745be73fce02a8d7b76e3db83352ca57 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Mon, 23 Nov 2020 23:15:32 +0100 Subject: [PATCH 68/84] fix(emqx_lwm2m_app): Dialyzer warnings --- apps/emqx_lwm2m/src/emqx_lwm2m_app.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_app.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_app.erl index 87dfe59b2..62d3adbbd 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_app.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_app.erl @@ -30,7 +30,7 @@ start(_Type, _Args) -> Pid = emqx_lwm2m_sup:start_link(), - lwm2m_coap_server:start_registry(), + _ = lwm2m_coap_server:start_registry(), lwm2m_coap_server_registry:add_handler([<<"rd">>], emqx_lwm2m_coap_resource, undefined), emqx_lwm2m_coap_server:start(application:get_all_env(?APP)), Pid. From 13b67c0d19cb695044fa710571ad31f3858ea0e4 Mon Sep 17 00:00:00 2001 From: Ayodele Date: Wed, 25 Nov 2020 21:33:38 +0100 Subject: [PATCH 69/84] Umbrella fix build (#5) * fix(emqx_auth_jwt): Dialyzer warnings * fix(emqx_auth_mnesia_cli): Dialyzer warnings * fix(emqx_bridge_mqtt_cli): Dialyzer warnings * fix(emqx_bridge_mqtt_cli): Dialyzer warnings * fix(emqx_auth_redis_sup): Dialyzer warnings * fix(emqx_bridge_mqtt): Dialyzer warnings * fix(emqx_auth_pgsql_cli): Dialyzer warnings * fix(emqx_bridge_mqtt_cli): Dialyzer warnings * fix(emqx_auth_mnesia_cli): Dialyzer warnings --- .../src/emqx_auth_mnesia_cli.erl | 6 ++++++ .../src/emqx_auth_pgsql_cli.erl | 4 ++++ apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.erl | 5 ++--- .../src/emqx_bridge_mqtt_cli.erl | 18 ++++++------------ 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl index cd31675aa..d6a8e8cb4 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl @@ -156,11 +156,17 @@ auth_username_cli(["add", Username, Password]) -> {error, Reason} -> emqx_ctl:print("Error: ~p~n", [Reason]) end; +<<<<<<< HEAD auth_username_cli(["update", Username, NewPassword]) -> case update_user({username, iolist_to_binary(Username)}, iolist_to_binary(NewPassword)) of ok -> emqx_ctl:print("ok~n"); {error, Reason} -> emqx_ctl:print("Error: ~p~n", [Reason]) end; +======= +acl_cli(["del", Login, Topic])-> + ok = remove_acl(iolist_to_binary(Login), iolist_to_binary(Topic)), + emqx_ctl:print("ok~n"); +>>>>>>> bb37bac5... Umbrella fix build (#5) auth_username_cli(["del", Username]) -> case remove_user({username, iolist_to_binary(Username)}) of diff --git a/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl b/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl index 27d25f35b..fdfd1b9b8 100644 --- a/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl +++ b/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl @@ -29,6 +29,8 @@ , equery/3 ]). +-type client_info() :: #{username:=_, clientid:=_, peerhost:=_, _=>_}. + %%-------------------------------------------------------------------- %% Avoid SQL Injection: Parse SQL to Parameter Query. %%-------------------------------------------------------------------- @@ -104,9 +106,11 @@ conn_opts([Opt = {ssl_opts, _}|Opts], Acc) -> conn_opts([_Opt|Opts], Acc) -> conn_opts(Opts, Acc). +-spec(equery(atom(), string() | epgsql:statement(), Parameters::[any()]) -> {ok, ColumnsDescription :: [any()], RowsValues :: [any()]} | {error, any()} ). equery(Pool, Sql, Params) -> ecpool:with_client(Pool, fun(C) -> epgsql:prepared_query(C, Sql, Params) end). +-spec(equery(atom(), string() | epgsql:statement(), Parameters::[any()], client_info()) -> {ok, ColumnsDescription :: [any()], RowsValues :: [any()]} | {error, any()} ). equery(Pool, Sql, Params, ClientInfo) -> ecpool:with_client(Pool, fun(C) -> epgsql:prepared_query(C, Sql, replvar(Params, ClientInfo)) end). diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.erl b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.erl index 19c0c5711..c5f688753 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.erl +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt.erl @@ -186,6 +186,5 @@ replvar([Key|More], Options) -> %% ${node} => node() feedvar(clientid, ClientId, _) -> - iolist_to_binary(re:replace(ClientId, "\\${node}", atom_to_list(node()))); -feedvar(_, Val, _) -> - Val. + iolist_to_binary(re:replace(ClientId, "\\${node}", atom_to_list(node()))). + diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_cli.erl b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_cli.erl index 1ee5a90c6..c6d6e2378 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_cli.erl +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_mqtt_cli.erl @@ -56,16 +56,12 @@ cli(["forwards", Name]) -> end, emqx_bridge_worker:get_forwards(Name)); cli(["add-forward", Name, Topic]) -> - case emqx_bridge_worker:ensure_forward_present(Name, iolist_to_binary(Topic)) of - ok -> emqx_ctl:print("Add-forward topic successfully.~n"); - {error, Reason} -> emqx_ctl:print("Add-forward failed reason: ~p.~n", [Reason]) - end; + ok = emqx_bridge_worker:ensure_forward_present(Name, iolist_to_binary(Topic)), + emqx_ctl:print("Add-forward topic successfully.~n"); cli(["del-forward", Name, Topic]) -> - case emqx_bridge_worker:ensure_forward_absent(Name, iolist_to_binary(Topic)) of - ok -> emqx_ctl:print("Del-forward topic successfully.~n"); - {error, Reason} -> emqx_ctl:print("Del-forward failed reason: ~p.~n", [Reason]) - end; + ok = emqx_bridge_worker:ensure_forward_absent(Name, iolist_to_binary(Topic)), + emqx_ctl:print("Del-forward topic successfully.~n"); cli(["subscriptions", Name]) -> foreach(fun({Topic, Qos}) -> @@ -79,10 +75,8 @@ cli(["add-subscription", Name, Topic, Qos]) -> end; cli(["del-subscription", Name, Topic]) -> - case emqx_bridge_worker:ensure_subscription_absent(Name, Topic) of - ok -> emqx_ctl:print("Del-subscription topic successfully.~n"); - {error, Reason} -> emqx_ctl:print("Del-subscription failed reason: ~p.~n", [Reason]) - end; + ok = emqx_bridge_worker:ensure_subscription_absent(Name, Topic), + emqx_ctl:print("Del-subscription topic successfully.~n"); cli(_) -> emqx_ctl:usage([{"bridges list", "List bridges"}, From 0cb9cbce718045755d83d68f633293cc1fc16787 Mon Sep 17 00:00:00 2001 From: Ayodele Date: Thu, 26 Nov 2020 14:26:19 +0100 Subject: [PATCH 70/84] Umbrella fix build (#6) * fix(emqx_bridge_rpc): Dialyzer warnings * fix(emqx_coap_app): Dialyzer warnings * fix(emqx_coap_mqtt_adapter): Dialyzer warnings * fix(emqx_lwm2m_json): Dialyzer warnings * fix(emqx_lwm2m_message): Dialyzer warnings * fix(emqx_mgmt): Dialyzer warnings * fix(emqx_mgmt_cli): Dialyzer warnings * fix(emqx_mgmt): Dialyzer warnings * fix(emqx_bridge_rpc): Dialyzer warnings * fix(emqx_mgmt): Dialyzer warnings * fix(emqx_exproto_gcli): Dialyzer warnings --- apps/emqx_bridge_mqtt/src/emqx_bridge_rpc.erl | 3 +- apps/emqx_coap/src/emqx_coap_app.erl | 2 +- apps/emqx_coap/src/emqx_coap_mqtt_adapter.erl | 6 +--- apps/emqx_exproto/src/emqx_exproto_gcli.erl | 33 ++++++++++--------- apps/emqx_lwm2m/src/emqx_lwm2m_json.erl | 4 +-- apps/emqx_lwm2m/src/emqx_lwm2m_message.erl | 4 +-- apps/emqx_management/src/emqx_mgmt.erl | 20 +++++------ apps/emqx_management/src/emqx_mgmt_cli.erl | 2 +- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_rpc.erl b/apps/emqx_bridge_mqtt/src/emqx_bridge_rpc.erl index 92ef0c60a..73b0df8d3 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_rpc.erl +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_rpc.erl @@ -33,6 +33,7 @@ -type ack_ref() :: emqx_bridge_worker:ack_ref(). -type batch() :: emqx_bridge_worker:batch(). +-type node_or_tuple() :: atom() | {atom(), term()}. -define(HEARTBEAT_INTERVAL, timer:seconds(1)). @@ -61,7 +62,7 @@ stop(#{client_pid := Pid}) when is_pid(Pid) -> ok. %% @doc Callback for `emqx_bridge_connect' behaviour --spec send(node(), batch()) -> {ok, ack_ref()} | {error, any()}. +-spec send(#{address:=node_or_tuple(), _=>_}, batch()) -> {ok, ack_ref()} | {error, any()}. send(#{address := Remote}, Batch) -> case ?RPC:call(Remote, ?MODULE, handle_send, [Batch]) of ok -> diff --git a/apps/emqx_coap/src/emqx_coap_app.erl b/apps/emqx_coap/src/emqx_coap_app.erl index eaabd356b..4e7655a74 100644 --- a/apps/emqx_coap/src/emqx_coap_app.erl +++ b/apps/emqx_coap/src/emqx_coap_app.erl @@ -30,7 +30,7 @@ start(_Type, _Args) -> {ok, Sup} = emqx_coap_sup:start_link(), coap_server_registry:add_handler([<<"mqtt">>], emqx_coap_resource, undefined), coap_server_registry:add_handler([<<"ps">>], emqx_coap_ps_resource, undefined), - emqx_coap_ps_topics:start_link(), + _ = emqx_coap_ps_topics:start_link(), emqx_coap_server:start(application:get_all_env(?APP)), {ok,Sup}. diff --git a/apps/emqx_coap/src/emqx_coap_mqtt_adapter.erl b/apps/emqx_coap/src/emqx_coap_mqtt_adapter.erl index 4c508c272..da0dade5b 100644 --- a/apps/emqx_coap/src/emqx_coap_mqtt_adapter.erl +++ b/apps/emqx_coap/src/emqx_coap_mqtt_adapter.erl @@ -136,7 +136,7 @@ handle_call({unsubscribe, Topic, _CoapPid}, _From, State=#state{sub_topics = Top {reply, ok, State#state{sub_topics = NewTopics}, hibernate}; handle_call({publish, Topic, Payload}, _From, State) -> - chann_publish(Topic, Payload, State), + _ = chann_publish(Topic, Payload, State), {reply, ok, State}; handle_call(info, _From, State) -> @@ -233,10 +233,6 @@ do_deliver({Topic, Payload}, Subscribers) -> %% handle PUBLISH packet from broker ?LOG(debug, "deliver message from broker Topic=~p, Payload=~p", [Topic, Payload]), deliver_to_coap(Topic, Payload, Subscribers), - ok; - -do_deliver(Pkt, _Subscribers) -> - ?LOG(warning, "unknown packet type to deliver, pkt=~p,", [Pkt]), ok. deliver_to_coap(_TopicName, _Payload, []) -> diff --git a/apps/emqx_exproto/src/emqx_exproto_gcli.erl b/apps/emqx_exproto/src/emqx_exproto_gcli.erl index 5ae9b0209..69784b70c 100644 --- a/apps/emqx_exproto/src/emqx_exproto_gcli.erl +++ b/apps/emqx_exproto/src/emqx_exproto_gcli.erl @@ -74,22 +74,24 @@ handle_call(_Request, _From, State) -> {reply, ok, State}. handle_cast({rpc, Fun, Req, Options, From}, State) -> - case catch apply(?CONN_ADAPTER_MOD, Fun, [Req, Options]) of - {ok, Resp, _Metadata} -> - ?LOG(debug, "~p got {ok, ~0p, ~0p}", [Fun, Resp, _Metadata]), - reply(From, Fun, {ok, Resp}); - {error, {Code, Msg}, _Metadata} -> - ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) response errcode: ~0p, errmsg: ~0p", + try + case apply(?CONN_ADAPTER_MOD, Fun, [Req, Options]) of + {ok, Resp, _Metadata} -> + ?LOG(debug, "~p got {ok, ~0p, ~0p}", [Fun, Resp, _Metadata]), + reply(From, Fun, {ok, Resp}); + {error, {Code, Msg}, _Metadata} -> + ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) response errcode: ~0p, errmsg: ~0p", [?CONN_ADAPTER_MOD, Fun, Req, Options, Code, Msg]), - reply(From, Fun, {error, {Code, Msg}}); - {error, Reason} -> - ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) error: ~0p", + reply(From, Fun, {error, {Code, Msg}}); + {error, Reason} -> + ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) error: ~0p", [?CONN_ADAPTER_MOD, Fun, Req, Options, Reason]), - reply(From, Fun, {error, Reason}); - {'EXIT', {Reason, Stk}} -> - ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) throw an exception: ~0p, stacktrace: ~0p", - [?CONN_ADAPTER_MOD, Fun, Req, Options, Reason, Stk]), - reply(From, Fun, {error, Reason}) + reply(From, Fun, {error, Reason}) + end + catch _ : Rsn : Stk -> + ?LOG(error, "CALL ~0p:~0p(~0p, ~0p) throw an exception: ~0p, stacktrace: ~0p", + [?CONN_ADAPTER_MOD, Fun, Req, Options, Rsn, Stk]), + reply(From, Fun, {error, Rsn}) end, {noreply, State}. @@ -107,4 +109,5 @@ code_change(_OldVsn, State, _Extra) -> %%-------------------------------------------------------------------- reply(Pid, Fun, Result) -> - Pid ! {hreply, Fun, Result}. + Pid ! {hreply, Fun, Result}, + ok. diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl index f63e46b18..77fc0619c 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl @@ -251,7 +251,7 @@ insert_resource_into_object_instance([ResourceId], Value, Acc) -> ?LOG(debug, "insert_resource_into_object_instance2() ResourceId=~p, Value=~p, Acc=~p", [ResourceId, Value, Acc]), NewMap = #{tlv_resource_with_value=>integer(ResourceId), value=>Value}, case find_resource(ResourceId, Acc) of - undeinfed -> + undefined -> Acc ++ [NewMap]; Resource -> Acc2 = lists:delete(Resource, Acc), @@ -262,7 +262,7 @@ insert_resource_instance_into_resource(ResourceInstanceId, Value, Acc) -> ?LOG(debug, "insert_resource_instance_into_resource() ResourceInstanceId=~p, Value=~p, Acc=~p", [ResourceInstanceId, Value, Acc]), NewMap = #{tlv_resource_instance=>integer(ResourceInstanceId), value=>Value}, case find_resource_instance(ResourceInstanceId, Acc) of - undeinfed -> + undefined -> Acc ++ [NewMap]; Resource -> Acc2 = lists:delete(Resource, Acc), diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_message.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_message.erl index 7c1d49ad7..e5cc704ef 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_message.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_message.erl @@ -229,7 +229,7 @@ insert_resource_into_object_instance([ResourceId, ResourceInstanceId], Value, Ac insert_resource_into_object_instance([ResourceId], Value, Acc) -> NewMap = #{tlv_resource_with_value=>integer(ResourceId), value=>Value}, case find_resource(ResourceId, Acc) of - undeinfed -> + undefined -> Acc ++ [NewMap]; Resource -> Acc2 = lists:delete(Resource, Acc), @@ -239,7 +239,7 @@ insert_resource_into_object_instance([ResourceId], Value, Acc) -> insert_resource_instance_into_resource(ResourceInstanceId, Value, Acc) -> NewMap = #{tlv_resource_instance=>integer(ResourceInstanceId), value=>Value}, case find_resource_instance(ResourceInstanceId, Acc) of - undeinfed -> + undefined -> Acc ++ [NewMap]; Resource -> Acc2 = lists:delete(Resource, Acc), diff --git a/apps/emqx_management/src/emqx_mgmt.erl b/apps/emqx_management/src/emqx_mgmt.erl index b5a319278..1098cbf73 100644 --- a/apps/emqx_management/src/emqx_mgmt.erl +++ b/apps/emqx_management/src/emqx_mgmt.erl @@ -585,7 +585,7 @@ delete_all_deactivated_alarms() -> delete_all_deactivated_alarms(Node) when Node =:= node() -> emqx_alarm:delete_all_deactivated_alarms(); -delete_all_deactivated_alarms(Node) -> +delete_all_deactivated_alarms(Node) -> rpc_call(Node, delete_deactivated_alarms, [Node]). %%-------------------------------------------------------------------- @@ -664,7 +664,7 @@ export_auth_username() -> export_auth_mnesia() -> case ets:info(emqx_user) of undefined -> []; - _ -> + _ -> lists:foldl(fun({_, Login, Password, IsSuperuser}, Acc) -> [[{login, Login}, {password, Password}, {is_superuser, IsSuperuser}] | Acc] end, [], ets:tab2list(emqx_user)) @@ -764,7 +764,7 @@ import_auth_clientid(Lists) -> case ets:info(emqx_auth_clientid) of undefined -> ok; _ -> - [ mnesia:dirty_write({emqx_auth_clientid, ClientId, Password}) || #{<<"clientid">> := ClientId, + [ mnesia:dirty_write({emqx_auth_clientid, ClientId, Password}) || #{<<"clientid">> := ClientId, <<"password">> := Password} <- Lists ] end. @@ -772,14 +772,14 @@ import_auth_username(Lists) -> case ets:info(emqx_auth_username) of undefined -> ok; _ -> - [ mnesia:dirty_write({emqx_auth_username, Username, Password}) || #{<<"username">> := Username, + [ mnesia:dirty_write({emqx_auth_username, Username, Password}) || #{<<"username">> := Username, <<"password">> := Password} <- Lists ] end. import_auth_mnesia(Auths) -> case ets:info(emqx_user) of undefined -> ok; - _ -> + _ -> [ mnesia:dirty_write({emqx_user, Login, Password, IsSuperuser}) || #{<<"login">> := Login, <<"password">> := Password, <<"is_superuser">> := IsSuperuser} <- Auths ] @@ -788,14 +788,14 @@ import_auth_mnesia(Auths) -> import_acl_mnesia(Acls) -> case ets:info(emqx_acl) of undefined -> ok; - _ -> - [ mnesia:dirty_write({emqx_acl ,Login, Topic, Action, Allow}) || #{<<"login">> := Login, + _ -> + [ mnesia:dirty_write({emqx_acl ,Login, Topic, Action, Allow}) || #{<<"login">> := Login, <<"topic">> := Topic, <<"action">> := Action, <<"allow">> := Allow} <- Acls ] end. -import_schemas(Schemas) -> +import_schemas(Schemas) -> case ets:info(emqx_schema) of undefined -> ok; _ -> [emqx_schema_registry:add_schema(emqx_schema_api:make_schema_params(Schema)) || Schema <- Schemas] @@ -817,7 +817,7 @@ to_version(Version) when is_list(Version) -> %%-------------------------------------------------------------------- enable_telemetry() -> - [enable_telemetry(Node) || Node <- ekka_mnesia:running_nodes()], ok. + lists:foreach(fun enable_telemetry/1,ekka_mnesia:running_nodes()). enable_telemetry(Node) when Node =:= node() -> emqx_telemetry:enable(); @@ -825,7 +825,7 @@ enable_telemetry(Node) -> rpc_call(Node, enable_telemetry, [Node]). disable_telemetry() -> - [disable_telemetry(Node) || Node <- ekka_mnesia:running_nodes()], ok. + lists:foreach(fun disable_telemetry/1,ekka_mnesia:running_nodes()). disable_telemetry(Node) when Node =:= node() -> emqx_telemetry:disable(); diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index 2ddd8d459..591dfa8b4 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -416,7 +416,7 @@ log(["primary-level"]) -> emqx_ctl:print("~s~n", [Level]); log(["primary-level", Level]) -> - emqx_logger:set_primary_log_level(list_to_atom(Level)), + _ = emqx_logger:set_primary_log_level(list_to_atom(Level)), emqx_ctl:print("~s~n", [emqx_logger:get_primary_log_level()]); log(["handlers", "list"]) -> From ff99bc10adf89b1520ecc1403a0fc77429f8098a Mon Sep 17 00:00:00 2001 From: Ayodele Date: Fri, 27 Nov 2020 12:45:25 +0100 Subject: [PATCH 71/84] Umbrella fix build (#7) * fix(emqx_auth_mongo): Dialyzer warnings * fix(emqx_auth_mnesia_api): Dialyzer warnings * fix(emqx_exhook): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl | 6 ++++-- apps/emqx_auth_mongo/src/emqx_auth_mongo.erl | 2 -- apps/emqx_exhook/src/emqx_exhook.erl | 4 ++-- apps/emqx_exhook/src/emqx_exhook_app.erl | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl index ee52fcf36..353ac553c 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl @@ -145,7 +145,7 @@ do_add_clientid(Params) -> Password = urldecode(get_value(<<"password">>, Params)), Login = {clientid, Clientid}, case validate([login, password], [Login, Password]) of - ok -> + ok -> emqx_auth_mnesia_cli:add_user(Login, Password); Err -> Err end. @@ -221,7 +221,9 @@ paginate(Tables, MatchSpec, Params, ComparingFun, RowFun) -> Limit = limit(Params), Cursor = qlc:cursor(Qh), case Page > 1 of - true -> qlc:next_answers(Cursor, (Page - 1) * Limit); + true -> + _ = qlc:next_answers(Cursor, (Page - 1) * Limit), + ok; false -> ok end, Rows = qlc:next_answers(Cursor, Limit), diff --git a/apps/emqx_auth_mongo/src/emqx_auth_mongo.erl b/apps/emqx_auth_mongo/src/emqx_auth_mongo.erl index 4880e6fb9..133bcac70 100644 --- a/apps/emqx_auth_mongo/src/emqx_auth_mongo.erl +++ b/apps/emqx_auth_mongo/src/emqx_auth_mongo.erl @@ -82,8 +82,6 @@ description() -> "Authentication with MongoDB". %%-------------------------------------------------------------------- %% Is Superuser? %%-------------------------------------------------------------------- - --spec(is_superuser(string(), maybe(#superquery{}), emqx_types:clientinfo()) -> boolean()). is_superuser(_Pool, undefined, _ClientInfo) -> false; is_superuser(Pool, #superquery{collection = Coll, field = Field, selector = Selector}, ClientInfo) -> diff --git a/apps/emqx_exhook/src/emqx_exhook.erl b/apps/emqx_exhook/src/emqx_exhook.erl index c464f31b5..9f6d27b26 100644 --- a/apps/emqx_exhook/src/emqx_exhook.erl +++ b/apps/emqx_exhook/src/emqx_exhook.erl @@ -64,9 +64,9 @@ disable(Name) -> unsave(Name) end. --spec disable_all() -> [term()]. +-spec disable_all() -> ok. disable_all() -> - [begin disable(Name), Name end || Name <- running()]. + lists:foreach(fun disable/1, running()). %%---------------------------------------------------------- %% Dispatch APIs diff --git a/apps/emqx_exhook/src/emqx_exhook_app.erl b/apps/emqx_exhook/src/emqx_exhook_app.erl index e24002abb..b008c251a 100644 --- a/apps/emqx_exhook/src/emqx_exhook_app.erl +++ b/apps/emqx_exhook/src/emqx_exhook_app.erl @@ -54,7 +54,7 @@ start(_StartType, _StartArgs) -> prep_stop(State) -> emqx_ctl:unregister_command(exhook), _ = unload_exhooks(), - _ = unload_all_servers(), + ok = unload_all_servers(), State. stop(_State) -> From 19edda4136ab3d7b56991e3f8083c2bfe734e7b2 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Sat, 28 Nov 2020 16:03:48 +0100 Subject: [PATCH 72/84] fix(emqx_lwm2m): bump to lwm2m_coap 1.1.2 --- apps/emqx_lwm2m/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_lwm2m/rebar.config b/apps/emqx_lwm2m/rebar.config index 8d5d54e7c..8d8da18fe 100644 --- a/apps/emqx_lwm2m/rebar.config +++ b/apps/emqx_lwm2m/rebar.config @@ -1,5 +1,5 @@ {deps, - [{lwm2m_coap, {git, "https://github.com/emqx/lwm2m-coap", {tag, "v1.1.1"}}} + [{lwm2m_coap, {git, "https://github.com/emqx/lwm2m-coap", {tag, "v1.1.2"}}} ]}. {profiles, From d3fda0f9441ee7f2b8b5a0d656b9dc842aa30201 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 1 Dec 2020 10:01:08 +0100 Subject: [PATCH 73/84] refactor(emqx_coap): pin gen_coap 0.3.1 for dialyzer warning fix --- apps/emqx_coap/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_coap/rebar.config b/apps/emqx_coap/rebar.config index dd1ad613e..0b85b4f18 100644 --- a/apps/emqx_coap/rebar.config +++ b/apps/emqx_coap/rebar.config @@ -1,6 +1,6 @@ {deps, [ - {gen_coap, {git, "https://github.com/emqx/gen_coap", {tag, "v0.3.0"}}} + {gen_coap, {git, "https://github.com/emqx/gen_coap", {tag, "v0.3.1"}}} ]}. {edoc_opts, [{preprocess, true}]}. From fb5ad0559f46d6b22e4e4163eb8d3f486eaa97f8 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Tue, 1 Dec 2020 13:40:31 +0100 Subject: [PATCH 74/84] fix(emqx_exproto_conn): dialyzer warning --- apps/emqx_exproto/src/emqx_exproto_conn.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_exproto/src/emqx_exproto_conn.erl b/apps/emqx_exproto/src/emqx_exproto_conn.erl index 5ef6b5529..3b05e91be 100644 --- a/apps/emqx_exproto/src/emqx_exproto_conn.erl +++ b/apps/emqx_exproto/src/emqx_exproto_conn.erl @@ -52,7 +52,7 @@ -record(state, { %% TCP/SSL/UDP/DTLS Wrapped Socket - socket :: esockd:socket(), + socket :: {esockd_transport, esockd:socket()} | {udp, _, _}, %% Peername of the connection peername :: emqx_types:peername(), %% Sockname of the connection From 56d7b3deb1248e3a05e5c2e3db09dae71da27f4e Mon Sep 17 00:00:00 2001 From: Ayodele Date: Tue, 1 Dec 2020 14:39:41 +0100 Subject: [PATCH 75/84] Umbrella fix build (#8) --- .../src/emqx_auth_mnesia_cli.erl | 7 ------- .../src/emqx_auth_pgsql_cli.erl | 3 --- .../src/emqx_bridge_worker.erl | 18 +++++------------- apps/emqx_exproto/src/emqx_exproto_channel.erl | 2 +- apps/emqx_exproto/src/emqx_exproto_conn.erl | 4 ++-- apps/emqx_lua_hook/src/emqx_lua_hook.erl | 2 +- apps/emqx_lwm2m/src/emqx_lwm2m_json.erl | 6 +++--- apps/emqx_management/src/emqx_mgmt_api.erl | 4 +++- src/emqx_modules.erl | 7 +++++-- 9 files changed, 20 insertions(+), 33 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl index d6a8e8cb4..19ade2aec 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_cli.erl @@ -156,18 +156,11 @@ auth_username_cli(["add", Username, Password]) -> {error, Reason} -> emqx_ctl:print("Error: ~p~n", [Reason]) end; -<<<<<<< HEAD auth_username_cli(["update", Username, NewPassword]) -> case update_user({username, iolist_to_binary(Username)}, iolist_to_binary(NewPassword)) of ok -> emqx_ctl:print("ok~n"); {error, Reason} -> emqx_ctl:print("Error: ~p~n", [Reason]) end; -======= -acl_cli(["del", Login, Topic])-> - ok = remove_acl(iolist_to_binary(Login), iolist_to_binary(Topic)), - emqx_ctl:print("ok~n"); ->>>>>>> bb37bac5... Umbrella fix build (#5) - auth_username_cli(["del", Username]) -> case remove_user({username, iolist_to_binary(Username)}) of ok -> emqx_ctl:print("ok~n"); diff --git a/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl b/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl index fdfd1b9b8..dbb13c278 100644 --- a/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl +++ b/apps/emqx_auth_pgsql/src/emqx_auth_pgsql_cli.erl @@ -64,9 +64,6 @@ connect(Opts) -> {ok, C} -> conn_post(C), {ok, C}; - {error, Reason = econnrefused} -> - ?LOG(error, "[Postgres] Can't connect to Postgres server: Connection refused."), - {error, Reason}; {error, Reason = invalid_authorization_specification} -> ?LOG(error, "[Postgres] Can't connect to Postgres server: Invalid authorization specification."), {error, Reason}; diff --git a/apps/emqx_bridge_mqtt/src/emqx_bridge_worker.erl b/apps/emqx_bridge_mqtt/src/emqx_bridge_worker.erl index 768cd3258..81954c62b 100644 --- a/apps/emqx_bridge_mqtt/src/emqx_bridge_worker.erl +++ b/apps/emqx_bridge_mqtt/src/emqx_bridge_worker.erl @@ -307,7 +307,7 @@ idle({call, From}, ensure_started, State) -> case do_connect(State) of {ok, State1} -> {next_state, connected, State1, [{reply, From, ok}, {state_timeout, 0, connected}]}; - {error, Reason} -> + {error, Reason, _State} -> {keep_state_and_data, [{reply, From, {error, Reason}}]} end; %% @doc Standing by for manual start. @@ -320,12 +320,8 @@ idle(state_timeout, reconnect, State) -> connecting(State); idle(info, {batch_ack, Ref}, State) -> - case do_ack(State, Ref) of - {ok, NewState} -> - {keep_state, NewState}; - _ -> - keep_state_and_data - end; + {ok, NewState} = do_ack(State, Ref), + {keep_state, NewState}; idle(Type, Content, State) -> common(idle, Type, Content, State). @@ -359,12 +355,8 @@ connected(info, {disconnected, Conn, Reason}, keep_state_and_data end; connected(info, {batch_ack, Ref}, State) -> - case do_ack(State, Ref) of - {ok, NewState} -> - {keep_state, NewState, {next_event, internal, maybe_send}}; - _ -> - keep_state_and_data - end; + {ok, NewState} = do_ack(State, Ref), + {keep_state, NewState, {next_event, internal, maybe_send}}; connected(Type, Content, State) -> common(connected, Type, Content, State). diff --git a/apps/emqx_exproto/src/emqx_exproto_channel.erl b/apps/emqx_exproto/src/emqx_exproto_channel.erl index 9786c12c2..4865cca58 100644 --- a/apps/emqx_exproto/src/emqx_exproto_channel.erl +++ b/apps/emqx_exproto/src/emqx_exproto_channel.erl @@ -331,7 +331,7 @@ handle_call({publish, Topic, Qos, Payload}, _ -> Msg = emqx_message:make(From, Qos, Topic, Payload), NMsg = emqx_mountpoint:mount(Mountpoint, Msg), - emqx:publish(NMsg), + _ = emqx:publish(NMsg), {reply, ok, Channel} end; diff --git a/apps/emqx_exproto/src/emqx_exproto_conn.erl b/apps/emqx_exproto/src/emqx_exproto_conn.erl index 3b05e91be..cfd908d64 100644 --- a/apps/emqx_exproto/src/emqx_exproto_conn.erl +++ b/apps/emqx_exproto/src/emqx_exproto_conn.erl @@ -451,8 +451,8 @@ handle_msg(Msg, State) -> terminate(Reason, State = #state{channel = Channel}) -> ?LOG(debug, "Terminated due to ~p", [Reason]), - emqx_exproto_channel:terminate(Reason, Channel), - close_socket(State), + _ = emqx_exproto_channel:terminate(Reason, Channel), + _ = close_socket(State), exit(Reason). %%-------------------------------------------------------------------- diff --git a/apps/emqx_lua_hook/src/emqx_lua_hook.erl b/apps/emqx_lua_hook/src/emqx_lua_hook.erl index afdb63f51..6f3f42368 100644 --- a/apps/emqx_lua_hook/src/emqx_lua_hook.erl +++ b/apps/emqx_lua_hook/src/emqx_lua_hook.erl @@ -184,7 +184,7 @@ do_register(Hook, ScriptName, _St) -> do_register_hooks([], _ScriptName, _St) -> ok; do_register_hooks([H|T], ScriptName, St) -> - do_register(H, ScriptName, St), + _ = do_register(H, ScriptName, St), do_register_hooks(T, ScriptName, St); do_register_hooks(Hook = <<$o, $n, _Rest/binary>>, ScriptName, St) -> do_register(Hook, ScriptName, St); diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl index 77fc0619c..3da69c6c4 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_json.erl @@ -240,10 +240,10 @@ insert_resource_into_object_instance([ResourceId, ResourceInstanceId], Value, Ac ?LOG(debug, "insert_resource_into_object_instance1() ResourceId=~p, ResourceInstanceId=~p, Value=~p, Acc=~p", [ResourceId, ResourceInstanceId, Value, Acc]), case find_resource(ResourceId, Acc) of undefined -> - NewList = insert_resource_instance_into_resource(ResourceInstanceId, Value, []), + NewList = insert_resource_instance_into_resource([ResourceInstanceId], Value, []), Acc++[#{tlv_multiple_resource=>integer(ResourceId), value=>NewList}]; Resource = #{value:=List}-> - NewList = insert_resource_instance_into_resource(ResourceInstanceId, Value, List), + NewList = insert_resource_instance_into_resource([ResourceInstanceId], Value, List), Acc2 = lists:delete(Resource, Acc), Acc2 ++ [Resource#{value=>NewList}] end; @@ -258,7 +258,7 @@ insert_resource_into_object_instance([ResourceId], Value, Acc) -> Acc2 ++ [NewMap] end. -insert_resource_instance_into_resource(ResourceInstanceId, Value, Acc) -> +insert_resource_instance_into_resource([ResourceInstanceId], Value, Acc) -> ?LOG(debug, "insert_resource_instance_into_resource() ResourceInstanceId=~p, Value=~p, Acc=~p", [ResourceInstanceId, Value, Acc]), NewMap = #{tlv_resource_instance=>integer(ResourceInstanceId), value=>Value}, case find_resource_instance(ResourceInstanceId, Acc) of diff --git a/apps/emqx_management/src/emqx_mgmt_api.erl b/apps/emqx_management/src/emqx_mgmt_api.erl index f24d30a8a..38b9d4db0 100644 --- a/apps/emqx_management/src/emqx_mgmt_api.erl +++ b/apps/emqx_management/src/emqx_mgmt_api.erl @@ -37,7 +37,9 @@ paginate(Tables, Params, RowFun) -> Limit = limit(Params), Cursor = qlc:cursor(Qh), case Page > 1 of - true -> qlc:next_answers(Cursor, (Page - 1) * Limit); + true -> + _ = qlc:next_answers(Cursor, (Page - 1) * Limit), + ok; false -> ok end, Rows = qlc:next_answers(Cursor, Limit), diff --git a/src/emqx_modules.erl b/src/emqx_modules.erl index f683ab1dd..47d24671a 100644 --- a/src/emqx_modules.erl +++ b/src/emqx_modules.erl @@ -77,14 +77,17 @@ unload(ModuleName) -> unload_module(ModuleName, true) end. +-spec(reload(module()) -> ok | ignore | {error, any()}). reload(emqx_mod_acl_internal) -> Modules = emqx:get_env(modules, []), Env = proplists:get_value(emqx_mod_acl_internal, Modules, undefined), case emqx_mod_acl_internal:reload(Env) of ok -> - ?LOG(info, "Reload ~s module successfully.", [emqx_mod_acl_internal]); + ?LOG(info, "Reload ~s module successfully.", [emqx_mod_acl_internal]), + ok; {error, Error} -> - ?LOG(error, "Reload module ~s failed, cannot start for ~0p", [emqx_mod_acl_internal, Error]) + ?LOG(error, "Reload module ~s failed, cannot start for ~0p", [emqx_mod_acl_internal, Error]), + {error, Error} end; reload(_) -> ignore. From ded92cc10bdb58df2eee0357920fe463432f9439 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Thu, 10 Dec 2020 11:42:58 +0100 Subject: [PATCH 76/84] chore(Makefile): delete stamp clean --- Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 7180e36d8..8c3dd6639 100644 --- a/Makefile +++ b/Makefile @@ -38,14 +38,10 @@ $(PROFILES:%=build-%): $(REBAR) # rebar clean .PHONY: clean $(PROFILES:%=clean-%) -clean: $(PROFILES:%=clean-%) clean-stamps +clean: $(PROFILES:%=clean-%) $(PROFILES:%=clean-%): $(REBAR) $(REBAR) as $(@:clean-%=%) clean -.PHONY: clean-stamps -clean-stamps: - find -L _build -name '.stamp' -type f | xargs rm -f - .PHONY: deps-all deps-all: $(REBAR) $(PROFILES:%=deps-%) $(PKG_PROFILES:%=deps-%) From b2d33583685c946307412a1e969956fc4c11e0d1 Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Thu, 10 Dec 2020 11:43:28 +0100 Subject: [PATCH 77/84] chore(rebar): Move no_debug_info to per-profile config --- rebar.config | 5 ++--- rebar.config.erl | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rebar.config b/rebar.config index 146f46706..aba0e498b 100644 --- a/rebar.config +++ b/rebar.config @@ -9,12 +9,11 @@ {minimum_otp_vsn, "21.3"}. {edoc_opts, [{preprocess,true}]}. {erl_opts, [warn_unused_vars,warn_shadow_vars,warn_unused_import, - warn_obsolete_guard,no_debug_info,compressed]}. + warn_obsolete_guard,compressed]}. -{overrides,[{add,[{erl_opts,[no_debug_info,compressed,deterministic, +{overrides,[{add,[{erl_opts,[compressed,deterministic, {parse_transform,mod_vsn}]}]}]}. - {xref_checks,[undefined_function_calls,undefined_functions,locals_not_used, deprecated_function_calls,warnings_as_errors, deprecated_functions]}. diff --git a/rebar.config.erl b/rebar.config.erl index 01425810a..6c7edd9cc 100644 --- a/rebar.config.erl +++ b/rebar.config.erl @@ -34,12 +34,16 @@ test_deps() -> profiles() -> [ {'emqx', [ {relx, relx('emqx')} + , {erl_opts, [no_debug_info]} ]} , {'emqx-pkg', [ {relx, relx('emqx-pkg')} + , {erl_opts, [no_debug_info]} ]} , {'emqx-edge', [ {relx, relx('emqx-edge')} + , {erl_opts, [no_debug_info]} ]} , {'emqx-edge-pkg', [ {relx, relx('emqx-edge-pkg')} + , {erl_opts, [no_debug_info]} ]} , {test, [ {deps, test_deps()} , {erl_opts, [debug_info]} From 93a35c48142da9b4fab8f17f1b53fa564278c29d Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Thu, 10 Dec 2020 12:03:16 +0100 Subject: [PATCH 78/84] chore(build): add 'check' profile for xref and dialyzer --- Makefile | 6 +++--- rebar.config.erl | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 8c3dd6639..4b9cc7863 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ REBAR_VERSION = 3.14.3-emqx-1 REBAR = ./rebar3 PROFILE ?= emqx -PROFILES := emqx emqx-edge +PROFILES := emqx emqx-edge check test PKG_PROFILES := emqx-pkg emqx-edge-pkg export REBAR_GIT_CLONE_OPTIONS += --depth=1 @@ -56,11 +56,11 @@ endif .PHONY: xref xref: $(REBAR) - $(REBAR) as test xref + $(REBAR) as check xref .PHONY: dialyzer dialyzer: $(REBAR) - $(REBAR) as test dialyzer + $(REBAR) as check dialyzer include packages.mk include docker.mk diff --git a/rebar.config.erl b/rebar.config.erl index 6c7edd9cc..63437e82f 100644 --- a/rebar.config.erl +++ b/rebar.config.erl @@ -45,6 +45,8 @@ profiles() -> , {'emqx-edge-pkg', [ {relx, relx('emqx-edge-pkg')} , {erl_opts, [no_debug_info]} ]} + , {check, [ {erl_opts, [debug_info]} + ]} , {test, [ {deps, test_deps()} , {erl_opts, [debug_info]} ]} From 69738378292a2d857642c7b48688939d2d1610ac Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 12:57:15 +0100 Subject: [PATCH 79/84] fix(emqx_plugins): Dialyzer warnings --- src/emqx_plugins.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emqx_plugins.erl b/src/emqx_plugins.erl index 37bfcf7ba..878c3432b 100644 --- a/src/emqx_plugins.erl +++ b/src/emqx_plugins.erl @@ -287,7 +287,7 @@ start_app(App, SuccFun) -> {ok, Started} -> ?LOG(info, "Started plugins: ~p", [Started]), ?LOG(info, "Load plugin ~s successfully", [App]), - SuccFun(App), + _ = SuccFun(App), ok; {error, {ErrApp, Reason}} -> ?LOG(error, "Load plugin ~s failed, cannot start plugin ~s for ~0p", [App, ErrApp, Reason]), From b08d9d5d9b6b45628571cf1de618bf0270250e79 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 13:08:16 +0100 Subject: [PATCH 80/84] fix(emqx_auth_jwt_svr): Dialyzer warnings --- apps/emqx_auth_jwt/src/emqx_auth_jwt_svr.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_auth_jwt/src/emqx_auth_jwt_svr.erl b/apps/emqx_auth_jwt/src/emqx_auth_jwt_svr.erl index b347d0e0b..00cc590e9 100644 --- a/apps/emqx_auth_jwt/src/emqx_auth_jwt_svr.erl +++ b/apps/emqx_auth_jwt/src/emqx_auth_jwt_svr.erl @@ -176,7 +176,7 @@ reset_timer(State = #state{intv = Intv}) -> cancel_timer(State = #state{tref = undefined}) -> State; cancel_timer(State = #state{tref = TRef}) -> - erlang:cancel_timer(TRef), + _ = erlang:cancel_timer(TRef), State#state{tref = undefined}. do_verify(_JwsCompated, []) -> From 5644fdc1f0c9db902a6502b2104e306de6a28d78 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 13:22:07 +0100 Subject: [PATCH 81/84] fix(emqx_acl_mnesia): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl b/apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl index 8f858dfa6..fbf1089e8 100644 --- a/apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl +++ b/apps/emqx_auth_mnesia/src/emqx_acl_mnesia_api.erl @@ -151,7 +151,7 @@ do_add(Params) -> Action = urldecode(get_value(<<"action">>, Params)), Access = urldecode(get_value(<<"access">>, Params)), Re = case validate([login, topic, action, access], [Login, Topic, Action, Access]) of - ok -> + ok -> emqx_acl_mnesia_cli:add_acl(Login, Topic, erlang:binary_to_atom(Action, utf8), erlang:binary_to_atom(Access, utf8)); Err -> Err end, @@ -163,7 +163,7 @@ do_add(Params) -> all -> #{all => '$all'}; _ -> maps:from_list([Login]) end). - + delete(#{clientid := Clientid, topic := Topic}, _) -> return(emqx_acl_mnesia_cli:remove_acl({clientid, urldecode(Clientid)}, urldecode(Topic))); delete(#{username := Username, topic := Topic}, _) -> @@ -202,12 +202,6 @@ do_validation(login, {clientid, V}) when is_binary(V) do_validation(login, {username, V}) when is_binary(V) andalso byte_size(V) > 0-> true; -do_validation(clientid, V) when is_binary(V) - andalso byte_size(V) > 0 -> - true; -do_validation(username, V) when is_binary(V) - andalso byte_size(V) > 0 -> - true; do_validation(topic, V) when is_binary(V) andalso byte_size(V) > 0 -> true; From 7998ea17033c7e2c44fd21ae3db37ae9da7b0479 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 13:50:41 +0100 Subject: [PATCH 82/84] fix(emqx_auth_mnesia): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl index bb413b6d9..deea23402 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia.erl @@ -37,9 +37,9 @@ init(#{clientid_list := ClientidList, username_list := UsernameList}) -> {disc_copies, [node()]}, {attributes, record_info(fields, emqx_user)}, {storage_properties, [{ets, [{read_concurrency, true}]}]}]), - [ add_default_user({{clientid, iolist_to_binary(Clientid)}, iolist_to_binary(Password)}) + _ = [ add_default_user({{clientid, iolist_to_binary(Clientid)}, iolist_to_binary(Password)}) || {Clientid, Password} <- ClientidList], - [ add_default_user({{username, iolist_to_binary(Username)}, iolist_to_binary(Password)}) + _ = [ add_default_user({{username, iolist_to_binary(Username)}, iolist_to_binary(Password)}) || {Username, Password} <- UsernameList], ok = ekka_mnesia:copy_table(emqx_user, disc_copies). @@ -59,7 +59,7 @@ check(ClientInfo = #{ clientid := Clientid ({?TABLE, {username, X }, Password, InterTime}) when X =:= Username andalso X =/= undefined -> Password end), case ets:select(?TABLE, MatchSpec) of - [] -> + [] -> emqx_metrics:inc(?AUTH_METRICS(ignore)), ok; List -> From 6ffb20e1d4c918e53982781cedfee412b906a222 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 14:42:50 +0100 Subject: [PATCH 83/84] fix(emqx_auth_mnesia_api): Dialyzer warnings --- apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl index 353ac553c..d1066d0a5 100644 --- a/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl +++ b/apps/emqx_auth_mnesia/src/emqx_auth_mnesia_api.erl @@ -265,14 +265,6 @@ limit(Params) -> %% Interval Funcs %%------------------------------------------------------------------------------ -format({?TABLE, {clientid, ClientId}, Password, _InterTime}) -> - #{clientid => ClientId, - password => Password}; - -format({?TABLE, {username, Username}, Password, _InterTime}) -> - #{username => Username, - password => Password}; - format([{?TABLE, {clientid, ClientId}, Password, _InterTime}]) -> #{clientid => ClientId, password => Password}; From b2efcef4b4c0931cdd6df888a01c8a36a6271b94 Mon Sep 17 00:00:00 2001 From: "ayodele.akingbule" Date: Thu, 10 Dec 2020 21:25:58 +0100 Subject: [PATCH 84/84] fix(emqx_rule_runtime): Dialyzer warnings --- apps/emqx_rule_engine/src/emqx_rule_runtime.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl index 808cccb99..72d8f752e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl @@ -250,7 +250,7 @@ take_action(#action_instance{id = Id, name = ActName, fallbacks = Fallbacks} = A error:{badfun, _Func}:_ST -> %?LOG(warning, "Action ~p maybe outdated, refresh it and try again." % "Func: ~p~nST:~0p", [Id, Func, ST]), - trans_action_on(Id, fun() -> + _ = trans_action_on(Id, fun() -> emqx_rule_engine:refresh_actions([ActInst]) end, 5000), emqx_rule_metrics:inc_actions_retry(Id),