Merge pull request #10286 from zmstone/0330-exit-with-non-zero-code-if-conf-init-failed

0330 exit with non zero code if conf init failed
This commit is contained in:
Zaiming (Stone) Shi 2023-03-30 17:41:14 +02:00 committed by GitHub
commit 36043dd651
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 37 additions and 2 deletions

View File

@ -72,9 +72,13 @@ set_init_config_load_done() ->
get_init_config_load_done() -> get_init_config_load_done() ->
application:get_env(emqx, init_config_load_done, false). application:get_env(emqx, init_config_load_done, false).
%% @doc Set the transaction id from which this node should start applying after boot.
%% The transaction ID is received from the core node which we just copied the latest
%% config from.
set_init_tnx_id(TnxId) -> set_init_tnx_id(TnxId) ->
application:set_env(emqx, cluster_rpc_init_tnx_id, TnxId). application:set_env(emqx, cluster_rpc_init_tnx_id, TnxId).
%% @doc Get the transaction id from which this node should start applying after boot.
get_init_tnx_id() -> get_init_tnx_id() ->
application:get_env(emqx, cluster_rpc_init_tnx_id, -1). application:get_env(emqx, cluster_rpc_init_tnx_id, -1).

View File

@ -275,8 +275,13 @@ init([Node, RetryMs]) ->
_ = mria:wait_for_tables([?CLUSTER_MFA, ?CLUSTER_COMMIT]), _ = mria:wait_for_tables([?CLUSTER_MFA, ?CLUSTER_COMMIT]),
{ok, _} = mnesia:subscribe({table, ?CLUSTER_MFA, simple}), {ok, _} = mnesia:subscribe({table, ?CLUSTER_MFA, simple}),
State = #{node => Node, retry_interval => RetryMs}, State = #{node => Node, retry_interval => RetryMs},
%% The init transaction ID is set in emqx_conf_app after
%% it has fetched the latest config from one of the core nodes
TnxId = emqx_app:get_init_tnx_id(), TnxId = emqx_app:get_init_tnx_id(),
ok = maybe_init_tnx_id(Node, TnxId), ok = maybe_init_tnx_id(Node, TnxId),
%% Now continue with the normal catch-up process
%% That is: apply the missing transactions after the config
%% was copied until now.
{ok, State, {continue, ?CATCH_UP}}. {ok, State, {continue, ?CATCH_UP}}.
%% @private %% @private
@ -396,6 +401,7 @@ get_cluster_tnx_id() ->
Id -> Id Id -> Id
end. end.
%% The entry point of a config change transaction.
init_mfa(Node, MFA) -> init_mfa(Node, MFA) ->
mnesia:write_lock_table(?CLUSTER_MFA), mnesia:write_lock_table(?CLUSTER_MFA),
LatestId = get_cluster_tnx_id(), LatestId = get_cluster_tnx_id(),

View File

@ -38,7 +38,7 @@ start(_StartType, _StartArgs) ->
reason => E, reason => E,
stacktrace => St stacktrace => St
}), }),
init:stop() init:stop(1)
end, end,
ok = emqx_config_logger:refresh_config(), ok = emqx_config_logger:refresh_config(),
emqx_conf_sup:start_link(). emqx_conf_sup:start_link().

View File

@ -760,7 +760,7 @@ generate_config() {
local node_name="$2" local node_name="$2"
## Delete the *.siz files first or it can't start after ## Delete the *.siz files first or it can't start after
## changing the config 'log.rotation.size' ## changing the config 'log.rotation.size'
rm -rf "${RUNNER_LOG_DIR}"/*.siz rm -f "${RUNNER_LOG_DIR}"/*.siz
## timestamp for each generation ## timestamp for each generation
local NOW_TIME local NOW_TIME

View File

@ -0,0 +1,2 @@
Enhance logging behaviour during boot failure.
When EMQX fails to start due to corrupted configuration files, excessive logging is eliminated and no crash dump file is generated.

View File

@ -0,0 +1,2 @@
优化启动失败的错误日志。
如果 EMQX 因为损坏的配置文件无法启动时,不会再打印过多的错误日志,也不再生成 crash.dump 文件。

View File

@ -0,0 +1,21 @@
#!/usr/bin/env bats
# https://github.com/bats-core/bats-core
# env PROFILE=emqx bats -t -p --verbose-run scripts/test/emqx-boot.bats
@test "PROFILE must be set" {
[[ -n "$PROFILE" ]]
}
@test "emqx boot with invalid node name" {
output="$(env EMQX_NODE_NAME="invliadename#" ./_build/$PROFILE/rel/emqx/bin/emqx console 2>&1|| true)"
[[ "$output" =~ "ERROR: Invalid node name,".+ ]]
}
@test "corrupted cluster config file" {
conffile="./_build/$PROFILE/rel/emqx/data/configs/cluster-override.conf"
echo "{" > $conffile
run ./_build/$PROFILE/rel/emqx/bin/emqx console
[[ $status -ne 0 ]]
rm -f $conffile
}