From 97152346269eca14180e550c6dfdc13045dae4c1 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 30 May 2019 14:29:09 +0800 Subject: [PATCH 1/4] Optimize the emqx_zone module using persistent_term - Don't reload the zone options for updating persistent_term is expensive - Use '{?MODULE, Zone, Key}' as the key to avoid name collision --- src/emqx_zone.erl | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/emqx_zone.erl b/src/emqx_zone.erl index 225d0ec4a..65deeea24 100644 --- a/src/emqx_zone.erl +++ b/src/emqx_zone.erl @@ -41,8 +41,12 @@ , code_change/3 ]). +%% dummy state +-record(state, {}). + -define(TAB, ?MODULE). -define(SERVER, ?MODULE). +-define(KEY(Zone, Key), {?MODULE, Zone, Key}). %%------------------------------------------------------------------------------ %% APIs @@ -62,7 +66,7 @@ get_env(Zone, Key) -> get_env(undefined, Key, Def) -> emqx_config:get_env(Key, Def); get_env(Zone, Key, Def) -> - try persistent_term:get({Zone, Key}) + try persistent_term:get(?KEY(Zone, Key)) catch error:badarg -> emqx_config:get_env(Key, Def) end. @@ -84,7 +88,8 @@ stop() -> %%------------------------------------------------------------------------------ init([]) -> - {ok, element(2, handle_info(reload, #{timer => undefined}))}. + _ = do_reload(), + {ok, #state{}}. handle_call(force_reload, _From, State) -> _ = do_reload(), @@ -95,17 +100,13 @@ handle_call(Req, _From, State) -> {reply, ignored, State}. handle_cast({set_env, Zone, Key, Val}, State) -> - persistent_term:put({Zone, Key}, Val), + ok = persistent_term:put(?KEY(Zone, Key), Val), {noreply, State}; handle_cast(Msg, State) -> ?LOG(error, "[Zone] Unexpected cast: ~p", [Msg]), {noreply, State}. -handle_info(reload, State) -> - _ = do_reload(), - {noreply, ensure_reload_timer(State#{timer := undefined}), hibernate}; - handle_info(Info, State) -> ?LOG(error, "[Zone] Unexpected info: ~p", [Info]), {noreply, State}. @@ -121,11 +122,6 @@ code_change(_OldVsn, State, _Extra) -> %%------------------------------------------------------------------------------ do_reload() -> - [[persistent_term:put({Zone, Key}, Val) - || {Key, Val} <- Opts] - || {Zone, Opts} <- emqx_config:get_env(zones, [])]. + [ persistent_term:put(?KEY(Zone, Key), Val) + || {Zone, Opts} <- emqx_config:get_env(zones, []), {Key, Val} <- Opts ]. -ensure_reload_timer(State = #{timer := undefined}) -> - State#{timer := erlang:send_after(timer:minutes(5), self(), reload)}; -ensure_reload_timer(State) -> - State. From 365832f9456b3b1bff0dbb951c5669d902471396 Mon Sep 17 00:00:00 2001 From: Gilbert Wong Date: Thu, 30 May 2019 02:07:21 +0800 Subject: [PATCH 2/4] Use new ranch api to elimate warning log for deprecated apis --- src/emqx_listeners.erl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/emqx_listeners.erl b/src/emqx_listeners.erl index 104a9583a..048c019b8 100644 --- a/src/emqx_listeners.erl +++ b/src/emqx_listeners.erl @@ -89,16 +89,18 @@ ranch_opts(Options) -> NumAcceptors = proplists:get_value(acceptors, Options, 4), MaxConnections = proplists:get_value(max_connections, Options, 1024), TcpOptions = proplists:get_value(tcp_options, Options, []), - RanchOpts = [{num_acceptors, NumAcceptors}, {max_connections, MaxConnections} | TcpOptions], + RanchOpts = #{ num_acceptors => NumAcceptors + , max_connections => MaxConnections + , socket_opts => TcpOptions}, case proplists:get_value(ssl_options, Options) of undefined -> RanchOpts; - SslOptions -> RanchOpts ++ SslOptions + SslOptions -> RanchOpts#{socket_opts => TcpOptions ++ SslOptions} end. -with_port(Port, Opts) when is_integer(Port) -> - [{port, Port}|Opts]; -with_port({Addr, Port}, Opts) -> - [{ip, Addr}, {port, Port}|Opts]. +with_port(Port, Opts = #{socket_opts := SocketOption}) when is_integer(Port) -> + Opts#{socket_opts => [{port, Port}| SocketOption]}; +with_port({Addr, Port}, Opts = #{socket_opts := SocketOption}) -> + Opts#{socket_opts => [{ip, Addr}, {port, Port}| SocketOption]}. %% @doc Restart all listeners -spec(restart() -> ok). From 47f9d0e90f130c551550a0db24556d8318f92a20 Mon Sep 17 00:00:00 2001 From: Gilbert Wong Date: Thu, 30 May 2019 09:30:27 +0800 Subject: [PATCH 3/4] Adjust format --- src/emqx_listeners.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/emqx_listeners.erl b/src/emqx_listeners.erl index 048c019b8..65515a8d3 100644 --- a/src/emqx_listeners.erl +++ b/src/emqx_listeners.erl @@ -89,9 +89,9 @@ ranch_opts(Options) -> NumAcceptors = proplists:get_value(acceptors, Options, 4), MaxConnections = proplists:get_value(max_connections, Options, 1024), TcpOptions = proplists:get_value(tcp_options, Options, []), - RanchOpts = #{ num_acceptors => NumAcceptors - , max_connections => MaxConnections - , socket_opts => TcpOptions}, + RanchOpts = #{num_acceptors => NumAcceptors, + max_connections => MaxConnections, + socket_opts => TcpOptions}, case proplists:get_value(ssl_options, Options) of undefined -> RanchOpts; SslOptions -> RanchOpts#{socket_opts => TcpOptions ++ SslOptions} From e7cd32edb7f6ad72696c9c378564363a9fb4247a Mon Sep 17 00:00:00 2001 From: Gilbert Wong Date: Fri, 31 May 2019 11:17:28 +0800 Subject: [PATCH 4/4] Update esockd deps and fix compile warning --- rebar.config | 2 +- src/emqx_protocol.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rebar.config b/rebar.config index 1f82fef6e..52bb8ead3 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ , {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.3.1"}}} , {ekka, {git, "https://github.com/emqx/ekka", {tag, "v0.5.5"}}} , {replayq, {git, "https://github.com/emqx/replayq", {tag, "v0.1.1"}}} - , {esockd, {git, "https://github.com/emqx/esockd", {tag, "v5.4.4"}}} + , {esockd, "5.5.0"} , {cuttlefish, {git, "https://github.com/emqx/cuttlefish", {tag, "v3.0.0"}}} ]}. diff --git a/src/emqx_protocol.erl b/src/emqx_protocol.erl index eb86a1841..4d266e8e3 100644 --- a/src/emqx_protocol.erl +++ b/src/emqx_protocol.erl @@ -1016,7 +1016,7 @@ do_check_banned(_EnableBan = true, Credentials) -> true -> {error, ?RC_BANNED}; false -> ok end; -do_check_banned(_EnableBan, Credentials) -> ok. +do_check_banned(_EnableBan, _Credentials) -> ok. do_acl_check(_EnableAcl = true, Action, Credentials, Topic) -> AllowTerm = ok,