From 386110ae1e7dbcdeb88ec47e015a4a526d84fc80 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Mon, 19 Sep 2022 15:05:06 +0800 Subject: [PATCH] fix: /listeners API crash when some nodes still in init configuration --- CHANGES-5.0.md | 1 + apps/emqx/src/emqx_listeners.erl | 18 ++++++++++++------ apps/emqx_conf/src/emqx_conf_app.erl | 8 ++++---- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGES-5.0.md b/CHANGES-5.0.md index 39affe867..cfd36d751 100644 --- a/CHANGES-5.0.md +++ b/CHANGES-5.0.md @@ -7,6 +7,7 @@ ## Bug fixes * Check ACLs for last will testament topic before publishing the message. [#8930](https://github.com/emqx/emqx/pull/8930) +* Fix GET /listeners API crash When some nodes still in initial configuration. [#9002](https://github.com/emqx/emqx/pull/9002) # 5.0.8 diff --git a/apps/emqx/src/emqx_listeners.erl b/apps/emqx/src/emqx_listeners.erl index aa2a2e0f9..67f452e1d 100644 --- a/apps/emqx/src/emqx_listeners.erl +++ b/apps/emqx/src/emqx_listeners.erl @@ -87,12 +87,18 @@ format_list(Listener) -> ]. do_list_raw() -> - Key = <<"listeners">>, - Raw = emqx_config:get_raw([Key], #{}), - SchemaMod = emqx_config:get_schema_mod(Key), - #{Key := RawWithDefault} = emqx_config:fill_defaults(SchemaMod, #{Key => Raw}, #{}), - Listeners = maps:to_list(RawWithDefault), - lists:flatmap(fun format_raw_listeners/1, Listeners). + %% GET /listeners from other nodes returns [] when init config is not loaded. + case emqx_app:get_init_config_load_done() of + true -> + Key = <<"listeners">>, + Raw = emqx_config:get_raw([Key], #{}), + SchemaMod = emqx_config:get_schema_mod(Key), + #{Key := RawWithDefault} = emqx_config:fill_defaults(SchemaMod, #{Key => Raw}, #{}), + Listeners = maps:to_list(RawWithDefault), + lists:flatmap(fun format_raw_listeners/1, Listeners); + false -> + [] + end. format_raw_listeners({Type0, Conf}) -> Type = binary_to_atom(Type0), diff --git a/apps/emqx_conf/src/emqx_conf_app.erl b/apps/emqx_conf/src/emqx_conf_app.erl index 3061223cf..a627028c6 100644 --- a/apps/emqx_conf/src/emqx_conf_app.erl +++ b/apps/emqx_conf/src/emqx_conf_app.erl @@ -152,11 +152,11 @@ copy_override_conf_from_core_node() -> _ -> [{ok, Info} | _] = lists:sort(fun conf_sort/2, Ready), #{node := Node, conf := RawOverrideConf, tnx_id := TnxId} = Info, - Msg = #{ + ?SLOG(debug, #{ msg => "copy_overide_conf_from_core_node_success", - node => Node - }, - ?SLOG(debug, Msg), + node => Node, + envs => application:get_all_env(emqx) + }), ok = emqx_config:save_to_override_conf( RawOverrideConf, #{override_to => cluster}