From f2fae16d3bb099cc107e28b5ac6077d9ecd36fb0 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Sat, 15 Apr 2023 19:41:07 +0800 Subject: [PATCH] fix(gw): load emqx applications before hocon configs checking --- apps/emqx_gateway/src/emqx_gateway_app.erl | 2 +- apps/emqx_gateway/src/emqx_gateway_schema.erl | 2 +- apps/emqx_gateway/src/emqx_gateway_utils.erl | 6 +++--- bin/nodetool | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/apps/emqx_gateway/src/emqx_gateway_app.erl b/apps/emqx_gateway/src/emqx_gateway_app.erl index 01a1aaddd..f0406bcaa 100644 --- a/apps/emqx_gateway/src/emqx_gateway_app.erl +++ b/apps/emqx_gateway/src/emqx_gateway_app.erl @@ -45,7 +45,7 @@ load_default_gateway_applications() -> fun(Def) -> load_gateway_application(Def) end, - emqx_gateway_utils:find_gateway_definations() + emqx_gateway_utils:find_gateway_definitions() ). load_gateway_application( diff --git a/apps/emqx_gateway/src/emqx_gateway_schema.erl b/apps/emqx_gateway/src/emqx_gateway_schema.erl index f0e65627f..8c80fc1fa 100644 --- a/apps/emqx_gateway/src/emqx_gateway_schema.erl +++ b/apps/emqx_gateway/src/emqx_gateway_schema.erl @@ -75,7 +75,7 @@ fields(gateway) -> } )} end, - emqx_gateway_utils:find_gateway_definations() + emqx_gateway_utils:find_gateway_definitions() ); fields(clientinfo_override) -> [ diff --git a/apps/emqx_gateway/src/emqx_gateway_utils.erl b/apps/emqx_gateway/src/emqx_gateway_utils.erl index 07185ef42..7a0188387 100644 --- a/apps/emqx_gateway/src/emqx_gateway_utils.erl +++ b/apps/emqx_gateway/src/emqx_gateway_utils.erl @@ -47,7 +47,7 @@ listener_chain/3, make_deprecated_paths/1, make_compatible_schema/2, - find_gateway_definations/0 + find_gateway_definitions/0 ]). -export([stringfy/1]). @@ -564,8 +564,8 @@ make_compatible_schema2(Path, SchemaFun) -> Schema ). --spec find_gateway_definations() -> list(gateway_def()). -find_gateway_definations() -> +-spec find_gateway_definitions() -> list(gateway_def()). +find_gateway_definitions() -> lists:flatten( lists:map( fun(App) -> diff --git a/bin/nodetool b/bin/nodetool index 9a5d5e069..9f32f9b3b 100755 --- a/bin/nodetool +++ b/bin/nodetool @@ -362,6 +362,20 @@ add_libs_dir() -> add_lib_dir(RootDir, Name, Vsn) -> LibDir = filename:join([RootDir, lib, atom_to_list(Name) ++ "-" ++ Vsn, ebin]), case code:add_patha(LibDir) of - true -> ok; + true -> + %% load all applications into application controller, before performing + %% the configuration check of HOCON + %% + %% It helps to implement the feature of dynamically searching schema. + %% See `emqx_gateway_schema:fields(gateway)` + is_emqx_application(Name) andalso application:load(Name), + ok; {error, _} -> error(LibDir) end. + +is_emqx_application(Name) when is_atom(Name) -> + is_emqx_application(atom_to_list(Name)); +is_emqx_application("emqx_" ++ _Rest) -> + true; +is_emqx_application(_) -> + false.