From 423b586c56d52716a6968c751d54852d5b71280e Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sun, 3 Dec 2023 19:17:46 +0100 Subject: [PATCH] fix(dialyzer): fix some dialyzer issues found on otp 26 --- apps/emqx/src/bhvrs/emqx_config_backup.erl | 2 +- apps/emqx/src/emqx.app.src | 1 + apps/emqx/src/emqx_channel.erl | 2 +- apps/emqx/src/emqx_cm_locker.erl | 2 +- apps/emqx/src/emqx_config_handler.erl | 9 ++++---- apps/emqx/src/emqx_crl_cache.erl | 10 +++++---- .../src/emqx_esockd_htb_limiter.erl | 4 ++-- .../src/emqx_limiter/src/emqx_htb_limiter.erl | 2 +- .../src/emqx_limiter_container.erl | 2 +- .../emqx_limiter/src/emqx_limiter_manager.erl | 2 +- .../emqx_limiter/src/emqx_limiter_server.erl | 12 +++++------ .../src/emqx_limiter_server_sup.erl | 2 +- apps/emqx/src/emqx_schema.erl | 2 +- apps/emqx/src/emqx_session.erl | 6 +++++- apps/emqx/src/emqx_types.erl | 2 ++ apps/emqx/test/emqx_cm_locker_SUITE.erl | 2 +- .../src/emqx_auto_subscribe.app.src | 2 +- .../emqx_auto_subscribe_handler.erl | 2 +- .../src/emqx_bridge_cassandra_connector.erl | 2 +- .../src/emqx_bridge_gcp_pubsub_client.erl | 7 ++++--- ...emqx_bridge_gcp_pubsub_consumer_worker.erl | 5 +++-- .../src/emqx_bridge_syskeeper_client.erl | 4 +++- .../emqx_connector/src/emqx_connector_jwt.erl | 3 ++- .../src/emqx_connector_jwt_worker.erl | 10 +++++---- .../proto/emqx_eviction_agent_proto_v2.erl | 2 +- .../src/bhvrs/emqx_gateway_channel.erl | 2 ++ .../src/bhvrs/emqx_gateway_impl.erl | 2 ++ apps/emqx_gateway/src/emqx_gateway_cm.erl | 1 - .../src/emqx_gateway_cm_registry.erl | 2 +- apps/emqx_gateway/src/emqx_gateway_ctx.erl | 2 ++ apps/emqx_gateway/src/emqx_gateway_utils.erl | 8 +++---- .../src/proto/emqx_gateway_cm_proto_v1.erl | 2 +- apps/emqx_gateway_coap/src/emqx_coap_tm.erl | 2 +- .../src/emqx_exproto_channel.erl | 2 +- .../src/emqx_exproto_gcli.erl | 2 ++ .../src/emqx_exproto_gsvr.erl | 21 ++++++++++++------- .../src/emqx_gateway_exproto.app.src | 2 +- .../src/emqx_gateway_lwm2m.app.src | 2 +- .../src/emqx_lwm2m_xml_object_db.erl | 6 ++++-- .../src/emqx_mqttsn_registry.erl | 2 ++ .../src/emqx_ocpp_connection.erl | 6 +++--- .../emqx_gateway_ocpp/src/emqx_ocpp_frame.erl | 7 +++++-- .../src/emqx_stomp_channel.erl | 2 +- .../src/emqx_stomp_heartbeat.erl | 2 ++ apps/emqx_ldap/src/emqx_ldap.erl | 2 +- apps/emqx_ldap/src/emqx_ldap_bind_worker.erl | 2 +- apps/emqx_machine/src/emqx_global_gc.erl | 3 ++- apps/emqx_machine/src/emqx_machine.app.src | 2 +- .../src/emqx_management.app.src | 4 +++- .../src/emqx_mgmt_data_backup.erl | 2 +- apps/emqx_modules/src/emqx_delayed.erl | 2 +- apps/emqx_modules/src/emqx_modules.app.src | 2 +- apps/emqx_mysql/src/emqx_mysql.erl | 2 +- .../src/emqx_node_rebalance_evacuation.erl | 3 ++- apps/emqx_oracle/src/emqx_oracle.erl | 2 +- apps/emqx_postgresql/src/emqx_postgresql.erl | 2 +- .../src/emqx_prometheus_mria.erl | 2 +- .../src/emqx_resource_buffer_worker.erl | 17 ++++++++------- .../src/schema/emqx_resource_schema.erl | 3 ++- apps/emqx_retainer/src/emqx_retainer.erl | 4 ++-- .../emqx_retainer/src/emqx_retainer_index.erl | 2 +- apps/emqx_s3/src/emqx_s3.app.src | 2 +- apps/emqx_s3/src/emqx_s3.erl | 2 +- apps/emqx_s3/src/emqx_s3_client.erl | 7 ++++++- apps/emqx_s3/src/emqx_s3_profile_sup.erl | 2 +- .../src/emqx_s3_profile_uploader_sup.erl | 4 ++-- apps/emqx_s3/src/emqx_s3_sup.erl | 2 +- apps/emqx_s3/src/emqx_s3_uploader.erl | 7 ++++++- .../emqx_utils/src/bpapi/emqx_bpapi_trans.erl | 2 +- apps/emqx_utils/src/emqx_utils.erl | 8 ++++++- 70 files changed, 163 insertions(+), 103 deletions(-) diff --git a/apps/emqx/src/bhvrs/emqx_config_backup.erl b/apps/emqx/src/bhvrs/emqx_config_backup.erl index 604fef106..69edd64c3 100644 --- a/apps/emqx/src/bhvrs/emqx_config_backup.erl +++ b/apps/emqx/src/bhvrs/emqx_config_backup.erl @@ -19,6 +19,6 @@ -callback import_config(RawConf :: map()) -> {ok, #{ root_key => emqx_utils_maps:config_key(), - changed => [emqx_utils_maps:config_path()] + changed => [emqx_utils_maps:config_key_path()] }} | {error, #{root_key => emqx_utils_maps:config_key(), reason => term()}}. diff --git a/apps/emqx/src/emqx.app.src b/apps/emqx/src/emqx.app.src index 915a66f17..c7c5aaef2 100644 --- a/apps/emqx/src/emqx.app.src +++ b/apps/emqx/src/emqx.app.src @@ -11,6 +11,7 @@ gproc, gen_rpc, mria, + ekka, esockd, cowboy, sasl, diff --git a/apps/emqx/src/emqx_channel.erl b/apps/emqx/src/emqx_channel.erl index 5069076e5..4662eaee5 100644 --- a/apps/emqx/src/emqx_channel.erl +++ b/apps/emqx/src/emqx_channel.erl @@ -96,7 +96,7 @@ %% Authentication Data Cache auth_cache :: maybe(map()), %% Quota checkers - quota :: emqx_limiter_container:limiter(), + quota :: emqx_limiter_container:container(), %% Timers timers :: #{atom() => disabled | maybe(reference())}, %% Conn State diff --git a/apps/emqx/src/emqx_cm_locker.erl b/apps/emqx/src/emqx_cm_locker.erl index dfe8907d5..f56f9239a 100644 --- a/apps/emqx/src/emqx_cm_locker.erl +++ b/apps/emqx/src/emqx_cm_locker.erl @@ -49,7 +49,7 @@ trans(ClientId, Fun) -> {error, client_id_unavailable} end. --spec lock(emqx_types:clientid()) -> {boolean, [node() | {node(), any()}]}. +-spec lock(emqx_types:clientid()) -> {boolean(), [node() | {node(), any()}]}. lock(ClientId) -> ekka_locker:acquire(?MODULE, ClientId, strategy()). diff --git a/apps/emqx/src/emqx_config_handler.erl b/apps/emqx/src/emqx_config_handler.erl index 05784feb7..4cc5b2908 100644 --- a/apps/emqx/src/emqx_config_handler.erl +++ b/apps/emqx/src/emqx_config_handler.erl @@ -84,6 +84,7 @@ ok | {ok, Result :: any()} | {error, Reason :: term()}. -type state() :: #{handlers := any()}. +-type config_key_path() :: emqx_utils_maps:config_key_path(). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, {}, []). @@ -91,21 +92,21 @@ start_link() -> stop() -> gen_server:stop(?MODULE). --spec update_config(module(), emqx_config:config_key_path(), emqx_config:update_args()) -> +-spec update_config(module(), config_key_path(), emqx_config:update_args()) -> {ok, emqx_config:update_result()} | {error, emqx_config:update_error()}. update_config(SchemaModule, ConfKeyPath, UpdateArgs) -> %% force convert the path to a list of atoms, as there maybe some wildcard names/ids in the path AtomKeyPath = [atom(Key) || Key <- ConfKeyPath], gen_server:call(?MODULE, {change_config, SchemaModule, AtomKeyPath, UpdateArgs}, infinity). --spec add_handler(emqx_config:config_key_path(), handler_name()) -> +-spec add_handler(config_key_path(), handler_name()) -> ok | {error, {conflict, list()}}. add_handler(ConfKeyPath, HandlerName) -> assert_callback_function(HandlerName), gen_server:call(?MODULE, {add_handler, ConfKeyPath, HandlerName}). %% @doc Remove handler asynchronously --spec remove_handler(emqx_config:config_key_path()) -> ok. +-spec remove_handler(config_key_path()) -> ok. remove_handler(ConfKeyPath) -> gen_server:cast(?MODULE, {remove_handler, ConfKeyPath}). @@ -764,7 +765,7 @@ assert_callback_function(Mod) -> end, ok. --spec schema(module(), emqx_utils_maps:config_key_path()) -> hocon_schema:schema(). +-spec schema(module(), config_key_path()) -> hocon_schema:schema(). schema(SchemaModule, [RootKey | _]) -> Roots = hocon_schema:roots(SchemaModule), {Field, Translations} = diff --git a/apps/emqx/src/emqx_crl_cache.erl b/apps/emqx/src/emqx_crl_cache.erl index 0ca779181..45c76c7f4 100644 --- a/apps/emqx/src/emqx_crl_cache.erl +++ b/apps/emqx/src/emqx_crl_cache.erl @@ -58,12 +58,14 @@ -define(DEFAULT_CACHE_CAPACITY, 100). -define(CONF_KEY_PATH, [crl_cache]). +-type duration() :: non_neg_integer(). + -record(state, { - refresh_timers = #{} :: #{binary() => timer:tref()}, - refresh_interval = timer:minutes(15) :: timer:time(), - http_timeout = ?HTTP_TIMEOUT :: timer:time(), + refresh_timers = #{} :: #{binary() => reference()}, + refresh_interval = timer:minutes(15) :: duration(), + http_timeout = ?HTTP_TIMEOUT :: duration(), %% keeps track of URLs by insertion time - insertion_times = gb_trees:empty() :: gb_trees:tree(timer:time(), url()), + insertion_times = gb_trees:empty() :: gb_trees:tree(duration(), url()), %% the set of cached URLs, for testing if an URL is already %% registered. cached_urls = sets:new([{version, 2}]) :: sets:set(url()), diff --git a/apps/emqx/src/emqx_limiter/src/emqx_esockd_htb_limiter.erl b/apps/emqx/src/emqx_limiter/src/emqx_esockd_htb_limiter.erl index 8b2831766..77873b6f2 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_esockd_htb_limiter.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_esockd_htb_limiter.erl @@ -25,7 +25,7 @@ module := ?MODULE, id := emqx_limiter_schema:limiter_id(), type := emqx_limiter_schema:limiter_type(), - bucket := hocons:config() + bucket := hocon:config() }. %%-------------------------------------------------------------------- @@ -35,7 +35,7 @@ -spec new_create_options( emqx_limiter_schema:limiter_id(), emqx_limiter_schema:limiter_type(), - hocons:config() + hocon:config() ) -> create_options(). new_create_options(Id, Type, BucketCfg) -> #{module => ?MODULE, id => Id, type => Type, bucket => BucketCfg}. diff --git a/apps/emqx/src/emqx_limiter/src/emqx_htb_limiter.erl b/apps/emqx/src/emqx_limiter/src/emqx_htb_limiter.erl index 7f50161a8..15e838b6e 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_htb_limiter.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_htb_limiter.erl @@ -32,7 +32,7 @@ make_future/1, available/1 ]). --export_type([local_limiter/0]). +-export_type([local_limiter/0, limiter/0]). %% a token bucket limiter which may or not contains a reference to another limiter, %% and can be used in a client alone diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_container.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_container.erl index 6a9101a0f..fb97a9b67 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_container.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_container.erl @@ -70,7 +70,7 @@ -spec get_limiter_by_types( limiter_id() | {atom(), atom()}, list(limiter_type()), - #{limiter_type() => hocons:config()} + #{limiter_type() => hocon:config()} ) -> container(). get_limiter_by_types({Type, Listener}, Types, BucketCfgs) -> Id = emqx_listeners:listener_id(Type, Listener), diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_manager.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_manager.erl index 91d59b3be..5a7c3d828 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_manager.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_manager.erl @@ -77,7 +77,7 @@ start_server(Type) -> emqx_limiter_server_sup:start(Type). --spec start_server(limiter_type(), hocons:config()) -> _. +-spec start_server(limiter_type(), hocon:config()) -> _. start_server(Type, Cfg) -> emqx_limiter_server_sup:start(Type, Cfg). diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl index 94bded7a9..465b3af09 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server.erl @@ -112,7 +112,7 @@ -spec connect( limiter_id(), limiter_type(), - hocons:config() | undefined + hocon:config() | undefined ) -> {ok, emqx_htb_limiter:limiter()} | {error, _}. %% undefined is the default situation, no limiter setting by default @@ -128,7 +128,7 @@ connect(Id, Type, Cfg) -> maps:get(Type, Cfg, undefined) ). --spec add_bucket(limiter_id(), limiter_type(), hocons:config() | undefined) -> ok. +-spec add_bucket(limiter_id(), limiter_type(), hocon:config() | undefined) -> ok. add_bucket(_Id, _Type, undefined) -> ok; %% a bucket with an infinity rate shouldn't be added to this server, because it is always full @@ -153,7 +153,7 @@ name(Type) -> restart(Type) -> ?CALL(Type). --spec update_config(limiter_type(), hocons:config()) -> ok | {error, _}. +-spec update_config(limiter_type(), hocon:config()) -> ok | {error, _}. update_config(Type, Config) -> ?CALL(Type, {update_config, Type, Config}). @@ -166,7 +166,7 @@ whereis(Type) -> %% Starts the server %% @end %%-------------------------------------------------------------------- --spec start_link(limiter_type(), hocons:config()) -> _. +-spec start_link(limiter_type(), hocon:config()) -> _. start_link(Type, Cfg) -> gen_server:start_link({local, name(Type)}, ?MODULE, [Type, Cfg], []). @@ -500,7 +500,7 @@ init_tree(Type, #{rate := Rate} = Cfg) -> buckets => #{} }. --spec make_root(hocons:confg()) -> root(). +-spec make_root(hocon:config()) -> root(). make_root(#{rate := Rate, burst := Burst}) -> #{ rate => Rate, @@ -554,7 +554,7 @@ do_del_bucket(Id, #{type := Type, buckets := Buckets} = State) -> State#{buckets := maps:remove(Id, Buckets)} end. --spec get_initial_val(hocons:config()) -> decimal(). +-spec get_initial_val(hocon:config()) -> decimal(). get_initial_val( #{ initial := Initial, diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server_sup.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server_sup.erl index 8f45da561..428f75c22 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_server_sup.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_server_sup.erl @@ -47,7 +47,7 @@ start(Type) -> Spec = make_child(Type), supervisor:start_child(?MODULE, Spec). --spec start(emqx_limiter_schema:limiter_type(), hocons:config()) -> _. +-spec start(emqx_limiter_schema:limiter_type(), hocon:config()) -> _. start(Type, Cfg) -> Spec = make_child(Type, Cfg), supervisor:start_child(?MODULE, Spec). diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index cdb1035df..c6efe6e46 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -3373,7 +3373,7 @@ naive_env_interpolation("$" ++ Maybe = Original) -> filename:join([Path, Tail]); error -> ?SLOG(warning, #{ - msg => "failed_to_resolve_env_variable", + msg => "cannot_resolve_env_variable", env => Env, original => Original }), diff --git a/apps/emqx/src/emqx_session.erl b/apps/emqx/src/emqx_session.erl index bcf711a76..fa9469a61 100644 --- a/apps/emqx/src/emqx_session.erl +++ b/apps/emqx/src/emqx_session.erl @@ -114,7 +114,9 @@ reply/0, replies/0, common_timer_name/0, - custom_timer_name/0 + custom_timer_name/0, + session_id/0, + session/0 ]). -type session_id() :: _TODO. @@ -150,6 +152,8 @@ await_rel_timeout := timeout() }. +-type session() :: t(). + -type t() :: emqx_session_mem:session() | emqx_persistent_session_ds:session(). diff --git a/apps/emqx/src/emqx_types.erl b/apps/emqx/src/emqx_types.erl index 1a4825736..436fffe4e 100644 --- a/apps/emqx/src/emqx_types.erl +++ b/apps/emqx/src/emqx_types.erl @@ -114,6 +114,8 @@ -export_type([takeover_data/0]). +-export_type([startlink_ret/0]). + -type proto_ver() :: ?MQTT_PROTO_V3 | ?MQTT_PROTO_V4 diff --git a/apps/emqx/test/emqx_cm_locker_SUITE.erl b/apps/emqx/test/emqx_cm_locker_SUITE.erl index 3dfb6e5ad..08192d98c 100644 --- a/apps/emqx/test/emqx_cm_locker_SUITE.erl +++ b/apps/emqx/test/emqx_cm_locker_SUITE.erl @@ -35,7 +35,7 @@ t_start_link(_) -> emqx_cm_locker:start_link(). t_trans(_) -> - ok = emqx_cm_locker:trans(undefined, fun(_) -> ok end, []), + ok = emqx_cm_locker:trans(undefined, fun(_) -> ok end), ok = emqx_cm_locker:trans(<<"clientid">>, fun(_) -> ok end). t_lock_unlock(_) -> diff --git a/apps/emqx_auto_subscribe/src/emqx_auto_subscribe.app.src b/apps/emqx_auto_subscribe/src/emqx_auto_subscribe.app.src index 1296996b6..a6fd53ee7 100644 --- a/apps/emqx_auto_subscribe/src/emqx_auto_subscribe.app.src +++ b/apps/emqx_auto_subscribe/src/emqx_auto_subscribe.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_auto_subscribe, [ {description, "Auto subscribe Application"}, - {vsn, "0.1.5"}, + {vsn, "0.1.6"}, {registered, []}, {mod, {emqx_auto_subscribe_app, []}}, {applications, [ diff --git a/apps/emqx_auto_subscribe/src/topics_handler/emqx_auto_subscribe_handler.erl b/apps/emqx_auto_subscribe/src/topics_handler/emqx_auto_subscribe_handler.erl index 5b24f106e..6b39d3b56 100644 --- a/apps/emqx_auto_subscribe/src/topics_handler/emqx_auto_subscribe_handler.erl +++ b/apps/emqx_auto_subscribe/src/topics_handler/emqx_auto_subscribe_handler.erl @@ -17,7 +17,7 @@ -export([init/1]). --spec init(hocons:config()) -> {Module :: atom(), Config :: term()}. +-spec init(hocon:config()) -> {Module :: atom(), Config :: term()}. init(Config) -> do_init(Config). diff --git a/apps/emqx_bridge_cassandra/src/emqx_bridge_cassandra_connector.erl b/apps/emqx_bridge_cassandra/src/emqx_bridge_cassandra_connector.erl index e29dc7931..c6bc7098c 100644 --- a/apps/emqx_bridge_cassandra/src/emqx_bridge_cassandra_connector.erl +++ b/apps/emqx_bridge_cassandra/src/emqx_bridge_cassandra_connector.erl @@ -88,7 +88,7 @@ keyspace(_) -> undefined. callback_mode() -> async_if_possible. --spec on_start(binary(), hoconsc:config()) -> {ok, state()} | {error, _}. +-spec on_start(binary(), hocon:config()) -> {ok, state()} | {error, _}. on_start( InstId, #{ diff --git a/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_client.erl b/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_client.erl index 454c0d7ea..5975ba89b 100644 --- a/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_client.erl +++ b/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_client.erl @@ -27,6 +27,7 @@ -type service_account_json() :: emqx_bridge_gcp_pubsub:service_account_json(). -type project_id() :: binary(). +-type duration() :: non_neg_integer(). -type config() :: #{ connect_timeout := emqx_schema:duration_ms(), max_retries := non_neg_integer(), @@ -35,12 +36,12 @@ any() => term() }. -opaque state() :: #{ - connect_timeout := timer:time(), + connect_timeout := duration(), jwt_config := emqx_connector_jwt:jwt_config(), max_retries := non_neg_integer(), pool_name := binary(), project_id := project_id(), - request_ttl := infinity | timer:time() + request_ttl := erlang:timeout() }. -type headers() :: [{binary(), iodata()}]. -type body() :: iodata(). @@ -414,7 +415,7 @@ reply_delegator(ResourceId, ReplyFunAndArgs, Response) -> Result = handle_response(Response, ResourceId, _QueryMode = async), emqx_resource:apply_reply_fun(ReplyFunAndArgs, Result). --spec do_get_status(resource_id(), timer:time()) -> boolean(). +-spec do_get_status(resource_id(), duration()) -> boolean(). do_get_status(ResourceId, Timeout) -> Workers = [Worker || {_WorkerName, Worker} <- ehttpc:workers(ResourceId)], DoPerWorker = diff --git a/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_consumer_worker.erl b/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_consumer_worker.erl index 44b2d022a..93f8fd8c3 100644 --- a/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_consumer_worker.erl +++ b/apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_consumer_worker.erl @@ -30,12 +30,13 @@ -type bridge_name() :: atom() | binary(). -type ack_id() :: binary(). -type message_id() :: binary(). +-type duration() :: non_neg_integer(). -type config() :: #{ ack_deadline := emqx_schema:timeout_duration_s(), ack_retry_interval := emqx_schema:timeout_duration_ms(), client := emqx_bridge_gcp_pubsub_client:state(), ecpool_worker_id => non_neg_integer(), - forget_interval := timer:time(), + forget_interval := duration(), hookpoint := binary(), instance_id := binary(), mqtt_config => emqx_bridge_gcp_pubsub_impl_consumer:mqtt_config(), @@ -52,7 +53,7 @@ async_workers := #{pid() => reference()}, client := emqx_bridge_gcp_pubsub_client:state(), ecpool_worker_id := non_neg_integer(), - forget_interval := timer:time(), + forget_interval := duration(), hookpoint := binary(), instance_id := binary(), mqtt_config := emqx_bridge_gcp_pubsub_impl_consumer:mqtt_config(), diff --git a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_client.erl b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_client.erl index 18822886f..cfb8dddfe 100644 --- a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_client.erl +++ b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_client.erl @@ -25,9 +25,11 @@ -include("emqx_bridge_syskeeper.hrl"). +-type duration() :: non_neg_integer(). + -type state() :: #{ ack_mode := need_ack | no_ack, - ack_timeout := timer:time(), + ack_timeout := duration(), socket := undefined | inet:socket(), frame_state := emqx_bridge_syskeeper_frame:state(), last_error := undefined | tuple() diff --git a/apps/emqx_connector/src/emqx_connector_jwt.erl b/apps/emqx_connector/src/emqx_connector_jwt.erl index 49b7b3a0e..9945aa148 100644 --- a/apps/emqx_connector/src/emqx_connector_jwt.erl +++ b/apps/emqx_connector/src/emqx_connector_jwt.erl @@ -33,8 +33,9 @@ -type jwt() :: binary(). -type wrapped_jwk() :: fun(() -> jose_jwk:key()). -type jwk() :: jose_jwk:key(). +-type duration() :: non_neg_integer(). -type jwt_config() :: #{ - expiration := timer:time(), + expiration := duration(), resource_id := resource_id(), table := ets:table(), jwk := wrapped_jwk() | jwk(), diff --git a/apps/emqx_connector/src/emqx_connector_jwt_worker.erl b/apps/emqx_connector/src/emqx_connector_jwt_worker.erl index c814b32e1..316d259d3 100644 --- a/apps/emqx_connector/src/emqx_connector_jwt_worker.erl +++ b/apps/emqx_connector/src/emqx_connector_jwt_worker.erl @@ -41,10 +41,12 @@ -include_lib("jose/include/jose_jwk.hrl"). -include_lib("snabbkaffe/include/snabbkaffe.hrl"). +-type duration() :: non_neg_integer(). + -type config() :: #{ private_key := binary(), resource_id := resource_id(), - expiration := timer:time(), + expiration := duration(), table := ets:table(), iss := binary(), sub := binary(), @@ -54,9 +56,9 @@ }. -type jwt() :: binary(). -type state() :: #{ - refresh_timer := undefined | timer:tref() | reference(), + refresh_timer := undefined | reference(), resource_id := resource_id(), - expiration := timer:time(), + expiration := duration(), table := ets:table(), jwt := undefined | jwt(), %% only undefined during startup @@ -221,7 +223,7 @@ censor_secret(undefined) -> censor_secret(_Secret) -> "******". --spec cancel_timer(undefined | timer:tref() | reference()) -> ok. +-spec cancel_timer(undefined | reference() | reference()) -> ok. cancel_timer(undefined) -> ok; cancel_timer(TRef) -> diff --git a/apps/emqx_eviction_agent/src/proto/emqx_eviction_agent_proto_v2.erl b/apps/emqx_eviction_agent/src/proto/emqx_eviction_agent_proto_v2.erl index 2d204079c..128ad5cf2 100644 --- a/apps/emqx_eviction_agent/src/proto/emqx_eviction_agent_proto_v2.erl +++ b/apps/emqx_eviction_agent/src/proto/emqx_eviction_agent_proto_v2.erl @@ -30,6 +30,6 @@ evict_session_channel(Node, ClientId, ConnInfo, ClientInfo) -> rpc:call(Node, emqx_eviction_agent, evict_session_channel, [ClientId, ConnInfo, ClientInfo]). %% Introduced in v2: --spec all_channels_count([node()], time:time()) -> emqx_rpc:erpc_multicall(non_neg_integer()). +-spec all_channels_count([node()], timeout()) -> emqx_rpc:erpc_multicall(non_neg_integer()). all_channels_count(Nodes, Timeout) -> erpc:multicall(Nodes, emqx_eviction_agent, all_local_channels_count, [], Timeout). diff --git a/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl b/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl index c1a5ea2e8..4d77138cf 100644 --- a/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl +++ b/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl @@ -20,6 +20,8 @@ %% module if it integrated with emqx_gateway_conn module -module(emqx_gateway_channel). +-export_type([gen_server_from/0]). + -type channel() :: any(). %%-------------------------------------------------------------------- diff --git a/apps/emqx_gateway/src/bhvrs/emqx_gateway_impl.erl b/apps/emqx_gateway/src/bhvrs/emqx_gateway_impl.erl index d8cb871ef..b3017ec99 100644 --- a/apps/emqx_gateway/src/bhvrs/emqx_gateway_impl.erl +++ b/apps/emqx_gateway/src/bhvrs/emqx_gateway_impl.erl @@ -16,6 +16,8 @@ -module(emqx_gateway_impl). +-export_type([state/0]). + -include("emqx_gateway.hrl"). -type state() :: map(). diff --git a/apps/emqx_gateway/src/emqx_gateway_cm.erl b/apps/emqx_gateway/src/emqx_gateway_cm.erl index d2b9e531c..d5968439b 100644 --- a/apps/emqx_gateway/src/emqx_gateway_cm.erl +++ b/apps/emqx_gateway/src/emqx_gateway_cm.erl @@ -774,7 +774,6 @@ init(Options) -> {ok, Registry} = emqx_gateway_cm_registry:start_link(GwName), %% Start locker process - LockerName = lockername(GwName), {ok, _LockerPid} = ekka_locker:start_link(lockername(GwName)), %% Interval update stats diff --git a/apps/emqx_gateway/src/emqx_gateway_cm_registry.erl b/apps/emqx_gateway/src/emqx_gateway_cm_registry.erl index f7a72af5f..5151a8706 100644 --- a/apps/emqx_gateway/src/emqx_gateway_cm_registry.erl +++ b/apps/emqx_gateway/src/emqx_gateway_cm_registry.erl @@ -53,7 +53,7 @@ -record(channel, {chid, pid}). %% @doc Start the global channel registry for the given gateway name. --spec start_link(gateway_name()) -> gen_server:startlink_ret(). +-spec start_link(gateway_name()) -> emqx_types:startlink_ret(). start_link(Name) -> gen_server:start_link(?MODULE, [Name], []). diff --git a/apps/emqx_gateway/src/emqx_gateway_ctx.erl b/apps/emqx_gateway/src/emqx_gateway_ctx.erl index 6df1a8aae..4c630c39d 100644 --- a/apps/emqx_gateway/src/emqx_gateway_ctx.erl +++ b/apps/emqx_gateway/src/emqx_gateway_ctx.erl @@ -17,6 +17,8 @@ %% @doc The gateway instance context -module(emqx_gateway_ctx). +-export_type([context/0]). + -include("emqx_gateway.hrl"). %% @doc The running context for a Connection/Channel process. diff --git a/apps/emqx_gateway/src/emqx_gateway_utils.erl b/apps/emqx_gateway/src/emqx_gateway_utils.erl index ed3f10594..eef1a42fb 100644 --- a/apps/emqx_gateway/src/emqx_gateway_utils.erl +++ b/apps/emqx_gateway/src/emqx_gateway_utils.erl @@ -89,17 +89,17 @@ -elvis([{elvis_style, god_modules, disable}]). --spec childspec(supervisor:worker(), Mod :: atom()) -> +-spec childspec(worker | supervisor, Mod :: atom()) -> supervisor:child_spec(). childspec(Type, Mod) -> childspec(Mod, Type, Mod, []). --spec childspec(supervisor:worker(), Mod :: atom(), Args :: list()) -> +-spec childspec(worker | supervisor, Mod :: atom(), Args :: list()) -> supervisor:child_spec(). childspec(Type, Mod, Args) -> childspec(Mod, Type, Mod, Args). --spec childspec(atom(), supervisor:worker(), Mod :: atom(), Args :: list()) -> +-spec childspec(atom(), worker | supervisor, Mod :: atom(), Args :: list()) -> supervisor:child_spec(). childspec(Id, Type, Mod, Args) -> #{ @@ -121,7 +121,7 @@ supervisor_ret({error, {Reason, Child}}) -> supervisor_ret(Ret) -> Ret. --spec find_sup_child(Sup :: pid() | atom(), ChildId :: supervisor:child_id()) -> +-spec find_sup_child(Sup :: pid() | atom(), ChildId :: term()) -> false | {ok, pid()}. find_sup_child(Sup, ChildId) -> diff --git a/apps/emqx_gateway/src/proto/emqx_gateway_cm_proto_v1.erl b/apps/emqx_gateway/src/proto/emqx_gateway_cm_proto_v1.erl index 29b6c7486..74e973d42 100644 --- a/apps/emqx_gateway/src/proto/emqx_gateway_cm_proto_v1.erl +++ b/apps/emqx_gateway/src/proto/emqx_gateway_cm_proto_v1.erl @@ -40,7 +40,7 @@ introduced_in() -> "5.0.0". -spec lookup_by_clientid([node()], emqx_gateway_cm:gateway_name(), emqx_types:clientid()) -> - emqx_rpc:multicall_return([pid()]). + emqx_rpc:multicall_result([pid()]). lookup_by_clientid(Nodes, GwName, ClientId) -> rpc:multicall(Nodes, emqx_gateway_cm, do_lookup_by_clientid, [GwName, ClientId]). diff --git a/apps/emqx_gateway_coap/src/emqx_coap_tm.erl b/apps/emqx_gateway_coap/src/emqx_coap_tm.erl index 68a7ae237..01a7684e9 100644 --- a/apps/emqx_gateway_coap/src/emqx_coap_tm.erl +++ b/apps/emqx_gateway_coap/src/emqx_coap_tm.erl @@ -40,7 +40,7 @@ token :: token() | undefined, observe :: 0 | 1 | undefined | observed, state :: atom(), - timers :: maps:map(), + timers :: map(), transport :: emqx_coap_transport:transport() }). -type state_machine() :: #state_machine{}. diff --git a/apps/emqx_gateway_exproto/src/emqx_exproto_channel.erl b/apps/emqx_gateway_exproto/src/emqx_exproto_channel.erl index a1d598923..1b3d057a8 100644 --- a/apps/emqx_gateway_exproto/src/emqx_exproto_channel.erl +++ b/apps/emqx_gateway_exproto/src/emqx_exproto_channel.erl @@ -131,7 +131,7 @@ stats(#channel{subscriptions = Subs}) -> %% Init the channel %%-------------------------------------------------------------------- --spec init(emqx_exproto_types:conninfo(), map()) -> channel(). +-spec init(emqx_types:conninfo(), map()) -> channel(). init( ConnInfo = #{ socktype := Socktype, diff --git a/apps/emqx_gateway_exproto/src/emqx_exproto_gcli.erl b/apps/emqx_gateway_exproto/src/emqx_exproto_gcli.erl index 639e3bfe9..f8d049cd1 100644 --- a/apps/emqx_gateway_exproto/src/emqx_exproto_gcli.erl +++ b/apps/emqx_gateway_exproto/src/emqx_exproto_gcli.erl @@ -29,6 +29,8 @@ is_empty/1 ]). +-export_type([grpc_client_state/0]). + -define(CONN_HANDLER_MOD, emqx_exproto_v_1_connection_handler_client). -define(CONN_UNARY_HANDLER_MOD, emqx_exproto_v_1_connection_unary_handler_client). diff --git a/apps/emqx_gateway_exproto/src/emqx_exproto_gsvr.erl b/apps/emqx_gateway_exproto/src/emqx_exproto_gsvr.erl index 043c910da..6a8ed0d53 100644 --- a/apps/emqx_gateway_exproto/src/emqx_exproto_gsvr.erl +++ b/apps/emqx_gateway_exproto/src/emqx_exproto_gsvr.erl @@ -38,13 +38,18 @@ unsubscribe/2 ]). +%% TODO: +%% The spec should be :: grpc_cowboy_h:error_response() +%% But there is no such module as grpc_cowboy_h +-type error_response() :: term(). + %%-------------------------------------------------------------------- %% gRPC ConnectionAdapter service %%-------------------------------------------------------------------- -spec send(emqx_exproto_pb:send_bytes_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. send(Req = #{conn := Conn, bytes := Bytes}, Md) -> ?SLOG(debug, #{ msg => "recv_grpc_function_call", @@ -55,7 +60,7 @@ send(Req = #{conn := Conn, bytes := Bytes}, Md) -> -spec close(emqx_exproto_pb:close_socket_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. close(Req = #{conn := Conn}, Md) -> ?SLOG(debug, #{ msg => "recv_grpc_function_call", @@ -66,7 +71,7 @@ close(Req = #{conn := Conn}, Md) -> -spec authenticate(emqx_exproto_pb:authenticate_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. authenticate( Req = #{ conn := Conn, @@ -89,7 +94,7 @@ authenticate( -spec start_timer(emqx_exproto_pb:timer_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. start_timer(Req = #{conn := Conn, type := Type, interval := Interval}, Md) when Type =:= 'KEEPALIVE' andalso Interval > 0 -> @@ -111,7 +116,7 @@ start_timer(Req, Md) -> -spec publish(emqx_exproto_pb:publish_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. publish(Req = #{conn := Conn, topic := Topic, qos := Qos, payload := Payload}, Md) when ?IS_QOS(Qos) -> @@ -132,7 +137,7 @@ publish(Req, Md) -> -spec raw_publish(emqx_exproto_pb:raw_publish_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_stream:error_response()}. + | {error, error_response()}. raw_publish(Req = #{topic := Topic, qos := Qos, payload := Payload}, Md) -> ?SLOG(debug, #{ msg => "recv_grpc_function_call", @@ -145,7 +150,7 @@ raw_publish(Req = #{topic := Topic, qos := Qos, payload := Payload}, Md) -> -spec subscribe(emqx_exproto_pb:subscribe_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. subscribe(Req = #{conn := Conn, topic := Topic, qos := Qos}, Md) when ?IS_QOS(Qos) -> @@ -165,7 +170,7 @@ subscribe(Req, Md) -> -spec unsubscribe(emqx_exproto_pb:unsubscribe_request(), grpc:metadata()) -> {ok, emqx_exproto_pb:code_response(), grpc:metadata()} - | {error, grpc_cowboy_h:error_response()}. + | {error, error_response()}. unsubscribe(Req = #{conn := Conn, topic := Topic}, Md) -> ?SLOG(debug, #{ msg => "recv_grpc_function_call", diff --git a/apps/emqx_gateway_exproto/src/emqx_gateway_exproto.app.src b/apps/emqx_gateway_exproto/src/emqx_gateway_exproto.app.src index 2bdd0956e..3ce320d2d 100644 --- a/apps/emqx_gateway_exproto/src/emqx_gateway_exproto.app.src +++ b/apps/emqx_gateway_exproto/src/emqx_gateway_exproto.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_gateway_exproto, [ {description, "ExProto Gateway"}, - {vsn, "0.1.5"}, + {vsn, "0.1.6"}, {registered, []}, {applications, [kernel, stdlib, grpc, emqx, emqx_gateway]}, {env, []}, diff --git a/apps/emqx_gateway_lwm2m/src/emqx_gateway_lwm2m.app.src b/apps/emqx_gateway_lwm2m/src/emqx_gateway_lwm2m.app.src index f4ab5bd24..36b6bcf4f 100644 --- a/apps/emqx_gateway_lwm2m/src/emqx_gateway_lwm2m.app.src +++ b/apps/emqx_gateway_lwm2m/src/emqx_gateway_lwm2m.app.src @@ -3,7 +3,7 @@ {description, "LwM2M Gateway"}, {vsn, "0.1.5"}, {registered, []}, - {applications, [kernel, stdlib, emqx, emqx_gateway, emqx_gateway_coap]}, + {applications, [kernel, stdlib, emqx, emqx_gateway, emqx_gateway_coap, xmerl]}, {env, []}, {modules, []}, {licenses, ["Apache 2.0"]}, diff --git a/apps/emqx_gateway_lwm2m/src/emqx_lwm2m_xml_object_db.erl b/apps/emqx_gateway_lwm2m/src/emqx_lwm2m_xml_object_db.erl index 2908a65e0..d7dd0e655 100644 --- a/apps/emqx_gateway_lwm2m/src/emqx_lwm2m_xml_object_db.erl +++ b/apps/emqx_gateway_lwm2m/src/emqx_lwm2m_xml_object_db.erl @@ -43,6 +43,8 @@ -define(LWM2M_OBJECT_DEF_TAB, lwm2m_object_def_tab). -define(LWM2M_OBJECT_NAME_TO_ID_TAB, lwm2m_object_name_to_id_tab). +-type xmlElement() :: tuple(). + -record(state, {}). -elvis([{elvis_style, atom_naming_convention, disable}]). @@ -59,7 +61,7 @@ start_link(XmlDir) -> gen_server:start_link({local, ?MODULE}, ?MODULE, [XmlDir], []). --spec find_objectid(integer()) -> {error, no_xml_definition} | xmerl:xmlElement(). +-spec find_objectid(integer()) -> {error, no_xml_definition} | xmlElement(). find_objectid(ObjectId) -> ObjectIdInt = case is_list(ObjectId) of @@ -71,7 +73,7 @@ find_objectid(ObjectId) -> [{_ObjectId, Xml}] -> Xml end. --spec find_name(string()) -> {error, no_xml_definition} | xmerl:xmlElement(). +-spec find_name(string()) -> {error, no_xml_definition} | xmlElement(). find_name(Name) -> NameBinary = case is_list(Name) of diff --git a/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl b/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl index 3113fc43d..6c397d6ac 100644 --- a/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl +++ b/apps/emqx_gateway_mqttsn/src/emqx_mqttsn_registry.erl @@ -32,6 +32,8 @@ lookup_topic_id/2 ]). +-export_type([registry/0]). + -define(PKEY(Id), {mqttsn, predef_topics, Id}). -type registry() :: #{ diff --git a/apps/emqx_gateway_ocpp/src/emqx_ocpp_connection.erl b/apps/emqx_gateway_ocpp/src/emqx_ocpp_connection.erl index 51389f6e4..6eadb169c 100644 --- a/apps/emqx_gateway_ocpp/src/emqx_ocpp_connection.erl +++ b/apps/emqx_gateway_ocpp/src/emqx_ocpp_connection.erl @@ -72,13 +72,13 @@ %% Piggyback piggyback :: single | multiple, %% Limiter - limiter :: maybe(emqx_limiter:limiter()), + limiter :: maybe(emqx_htb_limiter:limiter()), %% Limit Timer limit_timer :: maybe(reference()), %% Parse State parse_state :: emqx_ocpp_frame:parse_state(), %% Serialize options - serialize :: emqx_ocpp_frame:serialize_opts(), + serialize :: emqx_ocpp_frame:serialize_options(), %% Channel channel :: emqx_ocpp_channel:channel(), %% GC State @@ -268,7 +268,7 @@ init_state_and_channel([Req, Opts, _WsOpts], _State = undefined) -> ws_cookie => WsCookie, conn_mod => ?MODULE }, - Limiter = undeined, + Limiter = undefined, ActiveN = emqx_gateway_utils:active_n(Opts), Piggyback = emqx_utils_maps:deep_get([websocket, piggyback], Opts, multiple), ParseState = emqx_ocpp_frame:initial_parse_state(#{}), diff --git a/apps/emqx_gateway_ocpp/src/emqx_ocpp_frame.erl b/apps/emqx_gateway_ocpp/src/emqx_ocpp_frame.erl index d404067e1..a3f6303c3 100644 --- a/apps/emqx_gateway_ocpp/src/emqx_ocpp_frame.erl +++ b/apps/emqx_gateway_ocpp/src/emqx_ocpp_frame.erl @@ -39,9 +39,12 @@ -export_type([ parse_state/0, parse_result/0, - frame/0 + frame/0, + serialize_options/0 ]). +-type serialize_options() :: emqx_gateway_frame:serialize_options(). + -dialyzer({nowarn_function, [format/1]}). -spec initial_parse_state(map()) -> parse_state(). @@ -114,7 +117,7 @@ parse( }, <<>>, Parser}. --spec serialize_opts() -> emqx_gateway_frame:serialize_options(). +-spec serialize_opts() -> serialize_options(). serialize_opts() -> #{}. diff --git a/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl b/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl index 10d081e57..472a68200 100644 --- a/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl +++ b/apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl @@ -69,7 +69,7 @@ %% Channel State conn_state :: conn_state(), %% Heartbeat - heartbeat :: emqx_stomp_heartbeat:heartbeat(), + heartbeat :: undefined | emqx_stomp_heartbeat:heartbeat(), %% Subscriptions subscriptions = [], %% Timer diff --git a/apps/emqx_gateway_stomp/src/emqx_stomp_heartbeat.erl b/apps/emqx_gateway_stomp/src/emqx_stomp_heartbeat.erl index 2e4239bdc..98ea481d9 100644 --- a/apps/emqx_gateway_stomp/src/emqx_stomp_heartbeat.erl +++ b/apps/emqx_gateway_stomp/src/emqx_stomp_heartbeat.erl @@ -27,6 +27,8 @@ interval/2 ]). +-export_type([heartbeat/0]). + -record(heartbeater, {interval, statval, repeat}). -type name() :: incoming | outgoing. diff --git a/apps/emqx_ldap/src/emqx_ldap.erl b/apps/emqx_ldap/src/emqx_ldap.erl index 1ff6861ed..04b61918a 100644 --- a/apps/emqx_ldap/src/emqx_ldap.erl +++ b/apps/emqx_ldap/src/emqx_ldap.erl @@ -130,7 +130,7 @@ ensure_username(Field) -> %% =================================================================== callback_mode() -> always_sync. --spec on_start(binary(), hoconsc:config()) -> {ok, state()} | {error, _}. +-spec on_start(binary(), hocon:config()) -> {ok, state()} | {error, _}. on_start( InstId, #{ diff --git a/apps/emqx_ldap/src/emqx_ldap_bind_worker.erl b/apps/emqx_ldap/src/emqx_ldap_bind_worker.erl index 834cbac5a..e19818893 100644 --- a/apps/emqx_ldap/src/emqx_ldap_bind_worker.erl +++ b/apps/emqx_ldap/src/emqx_ldap_bind_worker.erl @@ -33,7 +33,7 @@ -define(POOL_NAME_SUFFIX, "bind_worker"). %% =================================================================== --spec on_start(binary(), hoconsc:config(), proplists:proplist(), map()) -> +-spec on_start(binary(), hocon:config(), proplists:proplist(), map()) -> {ok, binary(), map()} | {error, _}. on_start(InstId, #{method := #{bind_password := _}} = Config, Options, State) -> PoolName = pool_name(InstId), diff --git a/apps/emqx_machine/src/emqx_global_gc.erl b/apps/emqx_machine/src/emqx_global_gc.erl index 121855e68..4f7f9e086 100644 --- a/apps/emqx_machine/src/emqx_global_gc.erl +++ b/apps/emqx_machine/src/emqx_global_gc.erl @@ -43,7 +43,8 @@ start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). --spec run() -> {ok, timer:time()}. +%% @doc Run global garbage collection and return the time (in milliseconds) spent. +-spec run() -> {ok, non_neg_integer()}. run() -> gen_server:call(?MODULE, run, infinity). -spec stop() -> ok. diff --git a/apps/emqx_machine/src/emqx_machine.app.src b/apps/emqx_machine/src/emqx_machine.app.src index 6d7012313..904d5fe77 100644 --- a/apps/emqx_machine/src/emqx_machine.app.src +++ b/apps/emqx_machine/src/emqx_machine.app.src @@ -6,7 +6,7 @@ {vsn, "0.2.17"}, {modules, []}, {registered, []}, - {applications, [kernel, stdlib, emqx_ctl]}, + {applications, [kernel, stdlib, emqx_ctl, system_monitor, covertool]}, {mod, {emqx_machine_app, []}}, {env, []}, {licenses, ["Apache-2.0"]}, diff --git a/apps/emqx_management/src/emqx_management.app.src b/apps/emqx_management/src/emqx_management.app.src index f9deaf819..0aa522d23 100644 --- a/apps/emqx_management/src/emqx_management.app.src +++ b/apps/emqx_management/src/emqx_management.app.src @@ -5,7 +5,9 @@ {vsn, "5.0.34"}, {modules, []}, {registered, [emqx_management_sup]}, - {applications, [kernel, stdlib, emqx_plugins, minirest, emqx, emqx_ctl, emqx_bridge_http]}, + {applications, [ + kernel, stdlib, emqx_plugins, minirest, emqx, emqx_ctl, emqx_bridge_http, emqx_http_lib + ]}, {mod, {emqx_mgmt_app, []}}, {env, []}, {licenses, ["Apache-2.0"]}, diff --git a/apps/emqx_management/src/emqx_mgmt_data_backup.erl b/apps/emqx_management/src/emqx_mgmt_data_backup.erl index e0887d788..e3930aa50 100644 --- a/apps/emqx_management/src/emqx_mgmt_data_backup.erl +++ b/apps/emqx_management/src/emqx_mgmt_data_backup.erl @@ -105,7 +105,7 @@ }. -type db_error_details() :: #{mria:table() => {error, _}}. --type config_error_details() :: #{emqx_utils_maps:config_path() => {error, _}}. +-type config_error_details() :: #{emqx_utils_maps:config_key_path() => {error, _}}. -type import_res() :: {ok, #{db_errors => db_error_details(), config_errors => config_error_details()}} | {error, _}. diff --git a/apps/emqx_modules/src/emqx_delayed.erl b/apps/emqx_modules/src/emqx_delayed.erl index 22d18c180..301155cc0 100644 --- a/apps/emqx_modules/src/emqx_delayed.erl +++ b/apps/emqx_modules/src/emqx_delayed.erl @@ -86,7 +86,7 @@ -export_type([with_id_return/0, with_id_return/1]). -type state() :: #{ - publish_timer := maybe(timer:tref()), + publish_timer := maybe(reference()), publish_at := non_neg_integer(), stats_timer := maybe(reference()), stats_fun := maybe(fun((pos_integer()) -> ok)) diff --git a/apps/emqx_modules/src/emqx_modules.app.src b/apps/emqx_modules/src/emqx_modules.app.src index 377644cdf..67c6b0ceb 100644 --- a/apps/emqx_modules/src/emqx_modules.app.src +++ b/apps/emqx_modules/src/emqx_modules.app.src @@ -3,7 +3,7 @@ {description, "EMQX Modules"}, {vsn, "5.0.24"}, {modules, []}, - {applications, [kernel, stdlib, emqx, emqx_ctl]}, + {applications, [kernel, stdlib, emqx, emqx_ctl, observer_cli]}, {mod, {emqx_modules_app, []}}, {registered, [emqx_modules_sup]}, {env, []} diff --git a/apps/emqx_mysql/src/emqx_mysql.erl b/apps/emqx_mysql/src/emqx_mysql.erl index 37dc3c207..66fce9fde 100644 --- a/apps/emqx_mysql/src/emqx_mysql.erl +++ b/apps/emqx_mysql/src/emqx_mysql.erl @@ -83,7 +83,7 @@ server() -> %% =================================================================== callback_mode() -> always_sync. --spec on_start(binary(), hoconsc:config()) -> {ok, state()} | {error, _}. +-spec on_start(binary(), hocon:config()) -> {ok, state()} | {error, _}. on_start( InstId, #{ diff --git a/apps/emqx_node_rebalance/src/emqx_node_rebalance_evacuation.erl b/apps/emqx_node_rebalance/src/emqx_node_rebalance_evacuation.erl index 11c0df3fa..5d346f413 100644 --- a/apps/emqx_node_rebalance/src/emqx_node_rebalance_evacuation.erl +++ b/apps/emqx_node_rebalance/src/emqx_node_rebalance_evacuation.erl @@ -34,7 +34,8 @@ -export_type([ start_opts/0, - start_error/0 + start_error/0, + migrate_to/0 ]). -ifdef(TEST). diff --git a/apps/emqx_oracle/src/emqx_oracle.erl b/apps/emqx_oracle/src/emqx_oracle.erl index c12086fce..cfc67aa53 100644 --- a/apps/emqx_oracle/src/emqx_oracle.erl +++ b/apps/emqx_oracle/src/emqx_oracle.erl @@ -66,7 +66,7 @@ % be sync for now. callback_mode() -> always_sync. --spec on_start(binary(), hoconsc:config()) -> {ok, state()} | {error, _}. +-spec on_start(binary(), hocon:config()) -> {ok, state()} | {error, _}. on_start( InstId, #{ diff --git a/apps/emqx_postgresql/src/emqx_postgresql.erl b/apps/emqx_postgresql/src/emqx_postgresql.erl index 660e95bd6..eaabb8b1c 100644 --- a/apps/emqx_postgresql/src/emqx_postgresql.erl +++ b/apps/emqx_postgresql/src/emqx_postgresql.erl @@ -100,7 +100,7 @@ adjust_fields(Fields) -> %% =================================================================== callback_mode() -> always_sync. --spec on_start(binary(), hoconsc:config()) -> {ok, state()} | {error, _}. +-spec on_start(binary(), hocon:config()) -> {ok, state()} | {error, _}. on_start( InstId, #{ diff --git a/apps/emqx_prometheus/src/emqx_prometheus_mria.erl b/apps/emqx_prometheus/src/emqx_prometheus_mria.erl index 91a923a2f..e08e2c405 100644 --- a/apps/emqx_prometheus/src/emqx_prometheus_mria.erl +++ b/apps/emqx_prometheus/src/emqx_prometheus_mria.erl @@ -42,7 +42,7 @@ deregister_cleanup(_) -> ok. %% @private -spec collect_mf(_Registry, Callback) -> ok when _Registry :: prometheus_registry:registry(), - Callback :: prometheus_collector:callback(). + Callback :: prometheus_collector:collect_mf_callback(). collect_mf(_Registry, Callback) -> case mria_rlog:backend() of rlog -> diff --git a/apps/emqx_resource/src/emqx_resource_buffer_worker.erl b/apps/emqx_resource/src/emqx_resource_buffer_worker.erl index 37571298e..98e1a785e 100644 --- a/apps/emqx_resource/src/emqx_resource_buffer_worker.erl +++ b/apps/emqx_resource/src/emqx_resource_buffer_worker.erl @@ -80,8 +80,9 @@ -type queue_query() :: ?QUERY(reply_fun(), request(), HasBeenSent :: boolean(), expire_at()). -type request() :: term(). -type request_from() :: undefined | gen_statem:from(). --type request_ttl() :: infinity | timer:time(). --type health_check_interval() :: timer:time(). +-type timeout_ms() :: emqx_schema:timeout_duration_ms(). +-type request_ttl() :: emqx_schema:timeout_duration_ms(). +-type health_check_interval() :: pos_integer(). -type state() :: blocked | running. -type inflight_key() :: integer(). -type counters() :: #{ @@ -101,13 +102,13 @@ inflight_tid := inflight_table(), async_workers := #{pid() => reference()}, batch_size := pos_integer(), - batch_time := timer:time(), + batch_time := timeout_ms(), counters := counters(), - metrics_flush_interval := timer:time(), + metrics_flush_interval := timeout_ms(), queue := replayq:q(), - resume_interval := timer:time(), - tref := undefined | {timer:tref() | reference(), reference()}, - metrics_tref := undefined | {timer:tref() | reference(), reference()} + resume_interval := timeout_ms(), + tref := undefined | {reference(), reference()}, + metrics_tref := undefined | {reference(), reference()} }. callback_mode() -> [state_functions, state_enter]. @@ -2032,7 +2033,7 @@ replayq_opts(Id, Index, Opts) -> %% timeout is <= resume interval and the buffer worker is ever %% blocked, than all queued requests will basically fail without being %% attempted. --spec default_resume_interval(request_ttl(), health_check_interval()) -> timer:time(). +-spec default_resume_interval(request_ttl(), health_check_interval()) -> timeout_ms(). default_resume_interval(_RequestTTL = infinity, HealthCheckInterval) -> max(1, HealthCheckInterval); default_resume_interval(RequestTTL, HealthCheckInterval) -> diff --git a/apps/emqx_resource/src/schema/emqx_resource_schema.erl b/apps/emqx_resource/src/schema/emqx_resource_schema.erl index 4d2e55681..6041dc2fb 100644 --- a/apps/emqx_resource/src/schema/emqx_resource_schema.erl +++ b/apps/emqx_resource/src/schema/emqx_resource_schema.erl @@ -47,7 +47,8 @@ fields("resource_opts") -> fields("creation_opts") -> create_opts([]). --spec create_opts([{atom(), hocon_schema:field_schema_map()}]) -> [{atom(), hocon_schema:field()}]. +-spec create_opts([{atom(), hocon_schema:field_schema()}]) -> + [{atom(), hocon_schema:field_schema()}]. create_opts(Overrides) -> override( [ diff --git a/apps/emqx_retainer/src/emqx_retainer.erl b/apps/emqx_retainer/src/emqx_retainer.erl index 49831a9e8..73b7fbf90 100644 --- a/apps/emqx_retainer/src/emqx_retainer.erl +++ b/apps/emqx_retainer/src/emqx_retainer.erl @@ -307,7 +307,7 @@ clean(Context) -> Mod = get_backend_module(), Mod:clean(Context). --spec update_config(state(), hocons:config(), hocons:config()) -> state(). +-spec update_config(state(), hocon:config(), hocon:config()) -> state(). update_config(State, Conf, OldConf) -> update_config( maps:get(enable, Conf), @@ -317,7 +317,7 @@ update_config(State, Conf, OldConf) -> OldConf ). --spec update_config(boolean(), boolean(), state(), hocons:config(), hocons:config()) -> state(). +-spec update_config(boolean(), boolean(), state(), hocon:config(), hocon:config()) -> state(). update_config(false, _, State, _, _) -> disable_retainer(State); update_config(true, false, State, NewConf, _) -> diff --git a/apps/emqx_retainer/src/emqx_retainer_index.erl b/apps/emqx_retainer/src/emqx_retainer_index.erl index d1e5425ed..ec49e7a65 100644 --- a/apps/emqx_retainer/src/emqx_retainer_index.erl +++ b/apps/emqx_retainer/src/emqx_retainer_index.erl @@ -83,7 +83,7 @@ index_score(Index, Tokens) -> %% Returns `undefined' if there are no indices with score `> 0'. %% %% @see index_score/2 --spec select_index(emqx:words(), list(index())) -> index() | undefined. +-spec select_index(emqx_types:words(), list(index())) -> index() | undefined. select_index(Tokens, Indices) -> select_index(Tokens, Indices, 0, undefined). diff --git a/apps/emqx_s3/src/emqx_s3.app.src b/apps/emqx_s3/src/emqx_s3.app.src index bd17dc6c4..2658dfe69 100644 --- a/apps/emqx_s3/src/emqx_s3.app.src +++ b/apps/emqx_s3/src/emqx_s3.app.src @@ -1,6 +1,6 @@ {application, emqx_s3, [ {description, "EMQX S3"}, - {vsn, "5.0.11"}, + {vsn, "5.0.12"}, {modules, []}, {registered, [emqx_s3_sup]}, {applications, [ diff --git a/apps/emqx_s3/src/emqx_s3.erl b/apps/emqx_s3/src/emqx_s3.erl index be91a19d2..e5454bfc9 100644 --- a/apps/emqx_s3/src/emqx_s3.erl +++ b/apps/emqx_s3/src/emqx_s3.erl @@ -82,7 +82,7 @@ update_profile(ProfileId, ProfileConfig) when ?IS_PROFILE_ID(ProfileId) -> emqx_s3_profile_conf:update_config(ProfileId, ProfileConfig). -spec start_uploader(profile_id(), emqx_s3_uploader:opts()) -> - supervisor:start_ret() | {error, profile_not_found}. + emqx_types:startlink_ret() | {error, profile_not_found}. start_uploader(ProfileId, Opts) when ?IS_PROFILE_ID(ProfileId) -> emqx_s3_profile_uploader_sup:start_uploader(ProfileId, Opts). diff --git a/apps/emqx_s3/src/emqx_s3_client.erl b/apps/emqx_s3/src/emqx_s3_client.erl index c062cf1ca..73cf667a1 100644 --- a/apps/emqx_s3/src/emqx_s3_client.erl +++ b/apps/emqx_s3/src/emqx_s3_client.erl @@ -28,7 +28,12 @@ -export_type([ client/0, - headers/0 + headers/0, + key/0, + upload_id/0, + etag/0, + part_number/0, + config/0 ]). -type headers() :: #{binary() | string() => iodata()}. diff --git a/apps/emqx_s3/src/emqx_s3_profile_sup.erl b/apps/emqx_s3/src/emqx_s3_profile_sup.erl index c39fc9f4b..755b78bb2 100644 --- a/apps/emqx_s3/src/emqx_s3_profile_sup.erl +++ b/apps/emqx_s3/src/emqx_s3_profile_sup.erl @@ -15,7 +15,7 @@ -export([init/1]). --spec start_link(emqx_s3:profile_id(), emqx_s3:profile_config()) -> supervisor:start_ret(). +-spec start_link(emqx_s3:profile_id(), emqx_s3:profile_config()) -> emqx_types:startlink_ret(). start_link(ProfileId, ProfileConfig) -> supervisor:start_link(?MODULE, [ProfileId, ProfileConfig]). diff --git a/apps/emqx_s3/src/emqx_s3_profile_uploader_sup.erl b/apps/emqx_s3/src/emqx_s3_profile_uploader_sup.erl index fb7b93a15..67a36a793 100644 --- a/apps/emqx_s3/src/emqx_s3_profile_uploader_sup.erl +++ b/apps/emqx_s3/src/emqx_s3_profile_uploader_sup.erl @@ -24,7 +24,7 @@ -type id() :: {?MODULE, emqx_s3:profile_id()}. --spec start_link(emqx_s3:profile_id()) -> supervisor:start_ret(). +-spec start_link(emqx_s3:profile_id()) -> emqx_types:startlink_ret(). start_link(ProfileId) -> supervisor:start_link(?VIA_GPROC(id(ProfileId)), ?MODULE, [ProfileId]). @@ -44,7 +44,7 @@ id(ProfileId) -> {?MODULE, ProfileId}. -spec start_uploader(emqx_s3:profile_id(), emqx_s3_uploader:opts()) -> - supervisor:start_ret() | {error, profile_not_found}. + emqx_types:startlink_ret() | {error, profile_not_found}. start_uploader(ProfileId, Opts) -> try supervisor:start_child(?VIA_GPROC(id(ProfileId)), [Opts]) of Result -> Result diff --git a/apps/emqx_s3/src/emqx_s3_sup.erl b/apps/emqx_s3/src/emqx_s3_sup.erl index 0f6b0160b..1a8618e62 100644 --- a/apps/emqx_s3/src/emqx_s3_sup.erl +++ b/apps/emqx_s3/src/emqx_s3_sup.erl @@ -16,7 +16,7 @@ -export([init/1]). --spec start_link() -> supervisor:start_ret(). +-spec start_link() -> emqx_types:startlink_ret(). start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). diff --git a/apps/emqx_s3/src/emqx_s3_uploader.erl b/apps/emqx_s3/src/emqx_s3_uploader.erl index aa547c7cc..548eaf8c6 100644 --- a/apps/emqx_s3/src/emqx_s3_uploader.erl +++ b/apps/emqx_s3/src/emqx_s3_uploader.erl @@ -33,7 +33,12 @@ format_status/2 ]). --export_type([opts/0]). +-export_type([opts/0, config/0]). + +-type config() :: #{ + min_part_size => pos_integer(), + max_part_size => pos_integer() +}. -type opts() :: #{ key := string(), diff --git a/apps/emqx_utils/src/bpapi/emqx_bpapi_trans.erl b/apps/emqx_utils/src/bpapi/emqx_bpapi_trans.erl index 06c96638c..9e36afc29 100644 --- a/apps/emqx_utils/src/bpapi/emqx_bpapi_trans.erl +++ b/apps/emqx_utils/src/bpapi/emqx_bpapi_trans.erl @@ -191,7 +191,7 @@ push_err(Line, Err, S = #s{errors = Errs}) -> push_target(Target, S = #s{targets = Targets}) -> S#s{targets = [Target | Targets]}. --spec api_and_version(module()) -> {ok, emqx_bpapi:api(), emqx_bpapi:version()} | error. +-spec api_and_version(module()) -> {ok, emqx_bpapi:api(), emqx_bpapi:api_version()} | error. api_and_version(Module) -> Opts = [{capture, all_but_first, list}], case re:run(atom_to_list(Module), "(.*)_proto_v([0-9]+)$", Opts) of diff --git a/apps/emqx_utils/src/emqx_utils.erl b/apps/emqx_utils/src/emqx_utils.erl index b5bf68dff..1d43cc56c 100644 --- a/apps/emqx_utils/src/emqx_utils.erl +++ b/apps/emqx_utils/src/emqx_utils.erl @@ -79,6 +79,12 @@ -export([clamp/3, redact/1, redact/2, is_redacted/2, is_redacted/3]). +-export_type([ + readable_error_msg/1 +]). + +-type readable_error_msg(_Error) :: binary(). + -type maybe(T) :: undefined | T. -dialyzer({nowarn_function, [nolink_apply/2]}). @@ -435,7 +441,7 @@ pmap(Fun, List, Timeout) when nolink_apply(Fun) -> nolink_apply(Fun, infinity). %% @doc Same as `nolink_apply/1', with a timeout. --spec nolink_apply(function(), timer:timeout()) -> term(). +-spec nolink_apply(function(), timeout()) -> term(). nolink_apply(Fun, Timeout) when is_function(Fun, 0) -> Caller = self(), ResRef = alias([reply]),