From 91d38b410ded10246ece940f14646383c31f6d1a Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Wed, 16 Nov 2022 09:55:56 +0800 Subject: [PATCH 1/7] fix: refresh logger handler when starting --- apps/emqx/src/config/emqx_config_logger.erl | 12 +++++++++++- apps/emqx/src/emqx_config.erl | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/emqx/src/config/emqx_config_logger.erl b/apps/emqx/src/config/emqx_config_logger.erl index babf9c431..3d974d0c6 100644 --- a/apps/emqx/src/config/emqx_config_logger.erl +++ b/apps/emqx/src/config/emqx_config_logger.erl @@ -18,7 +18,7 @@ -behaviour(emqx_config_handler). %% API --export([add_handler/0, remove_handler/0]). +-export([add_handler/0, remove_handler/0, refresh_config/0]). -export([post_config_update/5]). -define(LOG, [log]). @@ -31,6 +31,16 @@ remove_handler() -> ok = emqx_config_handler:remove_handler(?LOG), ok. +%% refresh logger config when booting, the override config may have changed after node start. +%% Kernel's app env is confirmed before the node starts, +%% but we only copy cluster-override.conf from other node after this node starts, +%% so we need to refresh the logger config after this node starts. +%% It will not affect the logger config when cluster-override.conf is unchanged. +refresh_config() -> + Log = emqx:get_raw_config(?LOG), + {ok, _} = emqx:update_config(?LOG, Log), + ok. + post_config_update(?LOG, _Req, _NewConf, _OldConf, AppEnvs) -> Kernel = proplists:get_value(kernel, AppEnvs), NewHandlers = proplists:get_value(logger, Kernel, []), diff --git a/apps/emqx/src/emqx_config.erl b/apps/emqx/src/emqx_config.erl index 2fa39d094..51de1d0d0 100644 --- a/apps/emqx/src/emqx_config.erl +++ b/apps/emqx/src/emqx_config.erl @@ -582,6 +582,7 @@ save_to_override_conf(RawConf, Opts) -> add_handlers() -> ok = emqx_config_logger:add_handler(), emqx_sys_mon:add_handler(), + emqx_config_logger:refresh_config(), ok. remove_handlers() -> From 1085492171eca307353412d8727f0619fb3b6cda Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Tue, 27 Dec 2022 09:38:40 +0800 Subject: [PATCH 2/7] chore: don't refresh when CT is running --- apps/emqx/src/config/emqx_config_logger.erl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/emqx/src/config/emqx_config_logger.erl b/apps/emqx/src/config/emqx_config_logger.erl index 3d974d0c6..4b46e43d6 100644 --- a/apps/emqx/src/config/emqx_config_logger.erl +++ b/apps/emqx/src/config/emqx_config_logger.erl @@ -37,9 +37,14 @@ remove_handler() -> %% so we need to refresh the logger config after this node starts. %% It will not affect the logger config when cluster-override.conf is unchanged. refresh_config() -> - Log = emqx:get_raw_config(?LOG), - {ok, _} = emqx:update_config(?LOG, Log), - ok. + case emqx:get_raw_config(?LOG, undefined) of + %% no logger config when CT is running. + undefined -> + ok; + Log -> + {ok, _} = emqx:update_config(?LOG, Log), + ok + end. post_config_update(?LOG, _Req, _NewConf, _OldConf, AppEnvs) -> Kernel = proplists:get_value(kernel, AppEnvs), From c9f0355f5a13a41ee75e26c5d9411ad225a141c7 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Fri, 13 Jan 2023 18:36:03 +0800 Subject: [PATCH 3/7] fix: save app env when bootstrap and reload --- apps/emqx/src/emqx_config.erl | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/apps/emqx/src/emqx_config.erl b/apps/emqx/src/emqx_config.erl index 51de1d0d0..13d30f3db 100644 --- a/apps/emqx/src/emqx_config.erl +++ b/apps/emqx/src/emqx_config.erl @@ -333,7 +333,8 @@ init_load(SchemaMod, RawConf, Opts) when is_map(RawConf) -> RootNames = get_root_names(), RawConfAll = raw_conf_with_default(SchemaMod, RootNames, RawConfWithOverrides, Opts), %% check configs against the schema - {_AppEnvs, CheckedConf} = check_config(SchemaMod, RawConfAll, #{}), + {AppEnvs, CheckedConf} = check_config(SchemaMod, RawConfAll, #{}), + save_to_app_env(AppEnvs), ok = save_to_config_map(CheckedConf, RawConfAll). %% keep the raw and non-raw conf has the same keys to make update raw conf easier. @@ -534,23 +535,19 @@ get_root_names() -> maps:get(names, persistent_term:get(?PERSIS_SCHEMA_MODS, #{names => []})). -spec save_configs(app_envs(), config(), raw_config(), raw_config(), update_opts()) -> ok. -save_configs(_AppEnvs, Conf, RawConf, OverrideConf, Opts) -> +save_configs(AppEnvs, Conf, RawConf, OverrideConf, Opts) -> %% We first try to save to override.conf, because saving to files is more error prone %% than saving into memory. ok = save_to_override_conf(OverrideConf, Opts), - %% We may need also support hot config update for the apps that use application envs. - %% If that is the case uncomment the following line to update the configs to app env - %save_to_app_env(_AppEnvs), + save_to_app_env(AppEnvs), save_to_config_map(Conf, RawConf). +-define(IGNORE_APPS, [kernel]). + -spec save_to_app_env([tuple()]) -> ok. -save_to_app_env(AppEnvs) -> - lists:foreach( - fun({AppName, Envs}) -> - [application:set_env(AppName, Par, Val) || {Par, Val} <- Envs] - end, - AppEnvs - ). +save_to_app_env(AppEnvs0) -> + AppEnvs = lists:filter(fun({App, _}) -> not lists:member(App, ?IGNORE_APPS) end, AppEnvs0), + application:set_env(AppEnvs). -spec save_to_config_map(config(), raw_config()) -> ok. save_to_config_map(Conf, RawConf) -> From 1fe006112335a07162868214b562b321e4be8624 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Fri, 13 Jan 2023 23:30:00 +0800 Subject: [PATCH 4/7] fix: node.config_files type is hocon:array(string())) --- apps/emqx/test/emqx_common_test_helpers.erl | 4 +++- apps/emqx_conf/src/emqx_conf_schema.erl | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/emqx/test/emqx_common_test_helpers.erl b/apps/emqx/test/emqx_common_test_helpers.erl index f440dfc5a..f53c2702d 100644 --- a/apps/emqx/test/emqx_common_test_helpers.erl +++ b/apps/emqx/test/emqx_common_test_helpers.erl @@ -408,7 +408,9 @@ catch_call(F) -> C:E:S -> {crashed, {C, E, S}} end. -force_set_config_file_paths(emqx_conf, Paths) -> +force_set_config_file_paths(emqx_conf, [Path] = Paths) -> + Bin = iolist_to_binary(io_lib:format("node.config_files = [~p]", [Path])), + ok = file:write_file(Path, Bin, [append]), application:set_env(emqx, config_files, Paths); force_set_config_file_paths(emqx, Paths) -> application:set_env(emqx, config_files, Paths); diff --git a/apps/emqx_conf/src/emqx_conf_schema.erl b/apps/emqx_conf/src/emqx_conf_schema.erl index 90af47aca..7a20a88dc 100644 --- a/apps/emqx_conf/src/emqx_conf_schema.erl +++ b/apps/emqx_conf/src/emqx_conf_schema.erl @@ -463,7 +463,7 @@ fields("node") -> )}, {"config_files", sc( - list(string()), + hoconsc:array(string()), #{ mapping => "emqx.config_files", default => undefined, From 588140b8423d104c530637731cd33abade1ba431 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Fri, 13 Jan 2023 23:33:22 +0800 Subject: [PATCH 5/7] chore: why we should ingore save kernel app env when init --- apps/emqx/src/emqx_config.erl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/emqx/src/emqx_config.erl b/apps/emqx/src/emqx_config.erl index 13d30f3db..ba4095daa 100644 --- a/apps/emqx/src/emqx_config.erl +++ b/apps/emqx/src/emqx_config.erl @@ -542,6 +542,8 @@ save_configs(AppEnvs, Conf, RawConf, OverrideConf, Opts) -> save_to_app_env(AppEnvs), save_to_config_map(Conf, RawConf). +%% we ignore kernel app env, +%% because the old app env will be used in emqx_config_logger:post_config_update/5 -define(IGNORE_APPS, [kernel]). -spec save_to_app_env([tuple()]) -> ok. From 09160383f5fc3b0c3fb73f7ac48a19d283170058 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Fri, 13 Jan 2023 23:42:41 +0800 Subject: [PATCH 6/7] chore: bump emqx_resource to 0.1.5 --- apps/emqx_resource/src/emqx_resource.app.src | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_resource/src/emqx_resource.app.src b/apps/emqx_resource/src/emqx_resource.app.src index 00389261b..e3a37fd10 100644 --- a/apps/emqx_resource/src/emqx_resource.app.src +++ b/apps/emqx_resource/src/emqx_resource.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_resource, [ {description, "Manager for all external resources"}, - {vsn, "0.1.4"}, + {vsn, "0.1.5"}, {registered, []}, {mod, {emqx_resource_app, []}}, {applications, [ From b07befbf5603d7f123e92e415e147a6c498862b9 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Sat, 14 Jan 2023 01:03:57 +0800 Subject: [PATCH 7/7] test: conf_app ct failed --- .gitignore | 1 + apps/emqx/test/emqx_common_test_helpers.erl | 2 +- apps/emqx_conf/test/emqx_conf_app_SUITE.erl | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4780aab38..62e8ddc81 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ mix.lock apps/emqx/test/emqx_static_checks_data/master.bpapi # rendered configurations *.conf.rendered +*.conf.rendered.* lux_logs/ /.prepare bom.json diff --git a/apps/emqx/test/emqx_common_test_helpers.erl b/apps/emqx/test/emqx_common_test_helpers.erl index f53c2702d..e4f50f2a1 100644 --- a/apps/emqx/test/emqx_common_test_helpers.erl +++ b/apps/emqx/test/emqx_common_test_helpers.erl @@ -409,7 +409,7 @@ catch_call(F) -> {crashed, {C, E, S}} end. force_set_config_file_paths(emqx_conf, [Path] = Paths) -> - Bin = iolist_to_binary(io_lib:format("node.config_files = [~p]", [Path])), + Bin = iolist_to_binary(io_lib:format("node.config_files = [~p]~n", [Path])), ok = file:write_file(Path, Bin, [append]), application:set_env(emqx, config_files, Paths); force_set_config_file_paths(emqx, Paths) -> diff --git a/apps/emqx_conf/test/emqx_conf_app_SUITE.erl b/apps/emqx_conf/test/emqx_conf_app_SUITE.erl index dab4c4919..84ced5362 100644 --- a/apps/emqx_conf/test/emqx_conf_app_SUITE.erl +++ b/apps/emqx_conf/test/emqx_conf_app_SUITE.erl @@ -92,6 +92,14 @@ set_data_dir_env() -> Node = atom_to_list(node()), %% will create certs and authz dir ok = filelib:ensure_dir(Node ++ "/configs/"), + {ok, [ConfigFile]} = application:get_env(emqx, config_files), + NewConfigFile = ConfigFile ++ "." ++ Node, + {ok, _} = file:copy(ConfigFile, NewConfigFile), + Bin = iolist_to_binary(io_lib:format("node.config_files = [~p]~n", [NewConfigFile])), + ok = file:write_file(NewConfigFile, Bin, [append]), + DataDir = iolist_to_binary(io_lib:format("node.data_dir = ~p~n", [Node])), + ok = file:write_file(NewConfigFile, DataDir, [append]), + application:set_env(emqx, config_files, [NewConfigFile]), application:set_env(emqx, data_dir, Node), application:set_env(emqx, cluster_override_conf_file, Node ++ "/configs/cluster-override.conf"), ok.