From f62795d9197adf9ed8d874b86813281c91cf281a Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Wed, 13 Apr 2022 14:46:10 +0800 Subject: [PATCH 1/2] fix: add update_conf function for emqx_conf. --- priv/emqx.schema | 34 +++++++++++++++++++++++++++++----- src/emqx.appup.src | 20 ++++++++++++++++++++ src/emqx_limiter.erl | 27 ++++++++++++++++----------- src/emqx_listeners.erl | 15 +++++++++++++++ 4 files changed, 80 insertions(+), 16 deletions(-) diff --git a/priv/emqx.schema b/priv/emqx.schema index 0ff956869..10daac600 100644 --- a/priv/emqx.schema +++ b/priv/emqx.schema @@ -255,6 +255,27 @@ end}. {validator, "range4ports", "must be 1024 to 134217727", fun(X) -> X >= 1024 andalso X =< 134217727 end}. +{validator, "range:0-2", "must be 0 to 2", + fun(X) -> X >= 0 andalso X =< 2 end}. + +{validator, "range:0-128", "must be 0 to 128", + fun(X) -> X >= 0 andalso X =< 128 end}. + +{validator, "range:0-65535", "must be 0 to 65535", + fun(X) -> X >= 0 andalso X =< 65535 end}. + +{validator, "range:1-65535", "must be 1 to 65535", + fun(X) -> X >= 1 andalso X =< 65535 end}. + +{validator, "range:1-9", "must be 1 to 9", + fun(X) -> X >= 1 andalso X =< 9 end}. + +{validator, "range:8-15", "must be 8 to 15", + fun(X) -> X >= 8 andalso X =< 15 end}. + +{validator, "range:0-1024", "must be 0 to 1024", + fun(X) -> X >= 0 andalso X =< 1024 end}. + %% @doc http://www.erlang.org/doc/man/erl.html#%2bzdbbl {mapping, "node.dist_buffer_size", "vm_args.+zdbbl", [ {datatype, bytesize}, @@ -290,10 +311,10 @@ end}. {default, 1000}, {datatype, integer}, hidden, - {validators, ["positive_integer"]} + {validators, ["range:0-inf"]} ]}. -{validator, "positive_integer", "must be a positive integer", +{validator, "range:0-inf", "must be non neg_integer", fun(X) -> X >= 0 end}. %% Note: OTP R15 and earlier uses -env ERL_MAX_ETS_TABLES, @@ -758,7 +779,8 @@ end}. %% @doc Set the Maximum topic levels. {mapping, "mqtt.max_topic_levels", "emqx.max_topic_levels", [ {default, 128}, - {datatype, integer} + {datatype, integer}, + {validators, ["range:0-inf"]} ]}. %% @doc Set the Maximum QoS allowed. @@ -771,7 +793,8 @@ end}. %% @doc Set the Maximum Topic Alias. {mapping, "mqtt.max_topic_alias", "emqx.max_topic_alias", [ {default, 65535}, - {datatype, integer} + {datatype, integer}, + {validators, ["range:0-65535"]} ]}. %% @doc Whether the server supports MQTT retained messages. @@ -868,7 +891,8 @@ end}. %% @doc Set the Maximum topic levels. {mapping, "zone.$name.max_topic_levels", "emqx.zones", [ - {datatype, integer} + {datatype, integer}, + {validators, ["range:0-128"]} ]}. %% @doc Set the Maximum QoS allowed. diff --git a/src/emqx.appup.src b/src/emqx.appup.src index fe9c71cb9..2adb72986 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -10,6 +10,7 @@ {load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor,emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -37,6 +38,7 @@ {load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -80,6 +82,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.4">>, [ @@ -104,6 +107,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.5">>, [ @@ -128,6 +132,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.[6-7]">>, [ @@ -146,6 +151,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.8">>, [ @@ -156,6 +162,7 @@ {load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_cm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, @@ -168,6 +175,7 @@ {load_module, emqx_connection, brutal_purge, soft_purge, []}, {load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, @@ -180,6 +188,8 @@ {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, + {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} @@ -192,6 +202,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -218,6 +229,7 @@ {load_module, emqx_shared_sub, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []}, @@ -263,6 +275,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.4">>, [ @@ -287,6 +300,7 @@ {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.5">>, [ @@ -311,6 +325,7 @@ {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.[6-7]">>, [ @@ -329,6 +344,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.8">>, [ @@ -342,6 +358,7 @@ {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.9">>, [ @@ -351,6 +368,7 @@ {load_module, emqx_connection, brutal_purge, soft_purge, []}, {load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, @@ -363,6 +381,8 @@ {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, + {load_module, emqx_limiter, brutal_purge, soft_purge, []}, + {load_module, emqx_listeners, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} diff --git a/src/emqx_limiter.erl b/src/emqx_limiter.erl index 8acd50d32..4fe3a98e1 100644 --- a/src/emqx_limiter.erl +++ b/src/emqx_limiter.erl @@ -23,7 +23,8 @@ , init/4 %% XXX: Compatible with before 4.2 version , info/1 , check/2 - , update_overall_limiter/4 + , update_overall_limiter/3 + , delete_overall_limiter/1 ]). -record(limiter, { @@ -154,14 +155,18 @@ is_message_limiter(conn_messages_routing) -> true; is_message_limiter(overall_messages_routing) -> true; is_message_limiter(_) -> false. -update_overall_limiter(Zone, Name, Capacity, Interval) -> - case is_overall_limiter(Name) of - false -> false; - _ -> - try - esockd_limiter:update({Zone, Name}, Capacity, Interval), - true - catch _:_:_ -> - false - end +update_overall_limiter(Zone, Capacity, Interval) -> + try + esockd_limiter:update({Zone, overall_messages_routing}, Capacity, Interval), + true + catch _:_:_ -> + false + end. + +delete_overall_limiter(Zone) -> + try + esockd_limiter:delete({Zone, overall_messages_routing}), + true + catch _:_:_ -> + false end. diff --git a/src/emqx_listeners.erl b/src/emqx_listeners.erl index ce256d147..7dbd2c37d 100644 --- a/src/emqx_listeners.erl +++ b/src/emqx_listeners.erl @@ -29,6 +29,7 @@ , start_listener/3 , stop_listener/1 , stop_listener/3 + , update_listeners_env/2 , restart_listener/1 , restart_listener/3 ]). @@ -114,6 +115,20 @@ with_port({Addr, Port}, Opts = #{socket_opts := SocketOption}) -> restart() -> lists:foreach(fun restart_listener/1, emqx:get_env(listeners, [])). +update_listeners_env(Action, NewConf = #{name := NewName, proto := NewProto}) -> + Listener = emqx:get_env(listeners, []), + Listener1 = lists:filter( + fun(#{name := Name, proto := Proto}) -> + not (Name =:= NewName andalso Proto =:= NewProto) + end, Listener), + Listener2 = + case Action of + update -> [NewConf | Listener1]; + delete -> Listener1 + end, + application:set_env(emqx, listeners, Listener2), + ok. + -spec(restart_listener(listener()) -> any()). restart_listener({Proto, ListenOn, Options}) -> restart_listener(Proto, ListenOn, Options). From 596ec24c3a5a59e5055506a1f474c0c9cab1d0a3 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Wed, 13 Apr 2022 15:01:05 +0800 Subject: [PATCH 2/2] fix: uptime sometimes crash --- src/emqx.appup.src | 17 +++++++++++++++++ src/emqx_sys.erl | 33 ++++++++++----------------------- test/emqx_sys_SUITE.erl | 24 +++++++++++++++++++----- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 2adb72986..dbaeae143 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -11,6 +11,7 @@ {load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor,emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -39,6 +40,7 @@ {load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -83,6 +85,7 @@ {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.4">>, [ @@ -108,6 +111,7 @@ {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.5">>, [ @@ -152,6 +156,7 @@ {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.8">>, [ @@ -163,6 +168,7 @@ {load_module, emqx_cm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, @@ -176,6 +182,7 @@ {load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, @@ -190,6 +197,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} @@ -203,6 +211,7 @@ {load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_frame, brutal_purge, soft_purge, []}, {update, emqx_connection, {advanced, []}}, @@ -230,6 +239,7 @@ {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []}, @@ -276,6 +286,7 @@ {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.4">>, [ @@ -301,6 +312,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.5">>, [ @@ -326,6 +338,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.[6-7]">>, [ @@ -345,6 +358,7 @@ {load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.8">>, [ @@ -359,6 +373,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<"4.2.9">>, [ @@ -369,6 +384,7 @@ {load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []}, @@ -383,6 +399,7 @@ {load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_listeners, brutal_purge, soft_purge, []}, + {load_module, emqx_sys, brutal_purge, soft_purge, []}, {load_module, emqx_plugins, brutal_purge, soft_purge, []} ]}, {<<".*">>, []} diff --git a/src/emqx_sys.erl b/src/emqx_sys.erl index 38387b3ce..4bfe20a89 100644 --- a/src/emqx_sys.erl +++ b/src/emqx_sys.erl @@ -96,7 +96,15 @@ sysdescr() -> %% @doc Get sys uptime -spec(uptime() -> string()). uptime() -> - gen_server:call(?SYS, uptime). + {TotalWallClock, _} = erlang:statistics(wall_clock), + uptime(TotalWallClock div 1000). + +uptime(Seconds) -> + {D, {H, M, S}} = calendar:seconds_to_daystime(Seconds), + L0 = [{D, " days"}, {H, " hours"}, {M, " minutes"}, {S, " seconds"}], + L1 = lists:dropwhile(fun({K, _}) -> K =:= 0 end, L0), + L2 = lists:map(fun({Time, Unit}) -> [integer_to_list(Time), Unit] end, L1), + lists:flatten(lists:join(", ", L2)). %% @doc Get sys datetime -spec(datetime() -> string()). @@ -139,9 +147,6 @@ heartbeat(State) -> tick(State) -> State#state{ticker = start_timer(sys_interval(), tick)}. -handle_call(uptime, _From, State) -> - {reply, uptime(State), State}; - handle_call(Req, _From, State) -> ?LOG(error, "Unexpected call: ~p", [Req]), {reply, ignored, State}. @@ -151,7 +156,7 @@ handle_cast(Msg, State) -> {noreply, State}. handle_info({timeout, TRef, heartbeat}, State = #state{heartbeat = TRef}) -> - publish(uptime, iolist_to_binary(uptime(State))), + publish(uptime, iolist_to_binary(uptime())), publish(datetime, iolist_to_binary(datetime())), {noreply, heartbeat(State)}; @@ -174,24 +179,6 @@ terminate(_Reason, #state{heartbeat = TRef1, ticker = TRef2}) -> %% Internal functions %%----------------------------------------------------------------------------- -uptime(#state{start_time = Ts}) -> - Secs = timer:now_diff(erlang:timestamp(), Ts) div 1000000, - lists:flatten(uptime(seconds, Secs)). -uptime(seconds, Secs) when Secs < 60 -> - [integer_to_list(Secs), " seconds"]; -uptime(seconds, Secs) -> - [uptime(minutes, Secs div 60), integer_to_list(Secs rem 60), " seconds"]; -uptime(minutes, M) when M < 60 -> - [integer_to_list(M), " minutes, "]; -uptime(minutes, M) -> - [uptime(hours, M div 60), integer_to_list(M rem 60), " minutes, "]; -uptime(hours, H) when H < 24 -> - [integer_to_list(H), " hours, "]; -uptime(hours, H) -> - [uptime(days, H div 24), integer_to_list(H rem 24), " hours, "]; -uptime(days, D) -> - [integer_to_list(D), " days, "]. - publish(uptime, Uptime) -> safe_publish(systop(uptime), Uptime); publish(datetime, Datetime) -> diff --git a/test/emqx_sys_SUITE.erl b/test/emqx_sys_SUITE.erl index 0814f8b00..c6d95b8ac 100644 --- a/test/emqx_sys_SUITE.erl +++ b/test/emqx_sys_SUITE.erl @@ -34,7 +34,7 @@ end_per_suite(_Config) -> application:unload(emqx), ok = emqx_logger:set_log_level(error), ok. - + % t_version(_) -> % error('TODO'). @@ -42,10 +42,24 @@ end_per_suite(_Config) -> % error('TODO'). t_uptime(_) -> - ?assertEqual(<<"1 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 1))), - ?assertEqual(<<"1 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 60))), - ?assertEqual(<<"1 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 3600))), - ?assertEqual(<<"1 days, 0 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 86400))). + ?assert(is_list(emqx_sys:uptime())), + ?assertEqual(<<"1 seconds">>, iolist_to_binary(emqx_sys:uptime(1))), + ?assertEqual(<<"1 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(60))), + ?assertEqual(<<"1 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(3600))), + ?assertEqual(<<"1 hours, 1 minutes, 1 seconds">>, iolist_to_binary(emqx_sys:uptime(3661))), + ?assertEqual(<<"1 days, 0 hours, 0 minutes, 0 seconds">>, + iolist_to_binary(emqx_sys:uptime(86400))), + lists:map(fun({D, H, M, S}) -> + Expect = << + (integer_to_binary(D))/binary, " days, ", + (integer_to_binary(H))/binary, " hours, ", + (integer_to_binary(M))/binary, " minutes, ", + (integer_to_binary(S))/binary, " seconds" + >>, + Actual = iolist_to_binary(emqx_sys:uptime(D * 86400 + H * 3600 + M * 60 + S)), + ?assertEqual(Expect, Actual) + end, + [{1, 2, 3, 4}, {10, 20, 30, 40}, {2222, 3, 56, 59}, {59, 23, 59, 59}]). % t_datetime(_) -> % error('TODO').