fix mneisa

This commit is contained in:
anlicheng 2026-05-11 21:25:50 +08:00
parent eaddd964ea
commit b687541d27
2 changed files with 30 additions and 72 deletions

View File

@ -13,14 +13,8 @@ start(_StartType, _StartArgs) ->
io:setopts([{encoding, unicode}]), io:setopts([{encoding, unicode}]),
%% %%
erlang:system_flag(fullsweep_after, 16), erlang:system_flag(fullsweep_after, 16),
try
%% mnesia iot_mnesia:safe_start(),
ok = iot_mnesia:start()
catch
Class:Reason:Stack ->
logger:warning("[iot_app] start failed, class: ~p, reason: ~p, stack: ~p", [Class, Reason, Stack]),
ok = iot_mnesia:init()
end,
%% http服务 supervisor simulator API %% http服务 supervisor simulator API
start_http_server(), start_http_server(),

View File

@ -9,56 +9,48 @@
-include("iot_tables.hrl"). -include("iot_tables.hrl").
-export([init/0, start/0, stop/0]). -export([safe_start/0, stop/0]).
-define(TABLES, [efka_client]). -define(TABLES, [efka_client]).
-define(WAIT_TIMEOUT, 5000). -define(WAIT_TIMEOUT, 5000).
-spec init() -> ok | {error, term()}. safe_start() ->
init() -> case ensure_schema() of
with_result(fun() -> create_and_start ->
_ = mnesia:stop(), ok = mnesia:start(),
ok = mnesia:delete_schema([node()]), ok = create_tables(),
ok = mnesia:create_schema([node()]), ok = wait_for_tables();
ok = ensure_persistent_dir(), only_start ->
ok = mnesia:start(), ok = mnesia:start(),
ok = create_tables(), ok = wait_for_tables()
ok = wait_for_tables(), end,
ok log_runtime_info().
end).
-spec start() -> ok | {error, term()}. ensure_schema() ->
start() -> stopped = mnesia:stop(),
with_result(fun() -> case mnesia:create_schema([node()]) of
ok = mnesia:start(), ok ->
ok = ensure_persistent_dir(), create_and_start;
ok = wait_for_tables(), {error, {_, {already_exists, _}}} ->
ok = verify_tables(), only_start;
log_runtime_info(), {error, {_, already_exists}} ->
ok only_start;
end). {error, _Reason} ->
only_start
end.
-spec stop() -> ok. -spec stop() -> ok.
stop() -> stop() ->
_ = mnesia:stop(), _ = mnesia:stop(),
ok. ok.
-spec ensure_persistent_dir() -> ok.
ensure_persistent_dir() ->
case mnesia:system_info(use_dir) of
true ->
ok;
false ->
throw({mnesia_dir_required, node()})
end.
-spec create_tables() -> ok. -spec create_tables() -> ok.
create_tables() -> create_tables() ->
case efka_client_store:ensure_table() of case efka_client_store:ensure_table() of
ok -> ok ->
ok; ok;
{error, Reason} -> {error, Reason} ->
throw({create_table_failed, {efka_client, Reason}}) {error, {create_table_failed, {efka_client, Reason}}}
end. end.
-spec wait_for_tables() -> ok. -spec wait_for_tables() -> ok.
@ -67,24 +59,9 @@ wait_for_tables() ->
ok -> ok ->
ok; ok;
{timeout, Tables} -> {timeout, Tables} ->
throw({mnesia_tables_timeout, Tables}); {error, {mnesia_tables_timeout, Tables}};
{error, Reason} -> {error, Reason} ->
throw({mnesia_tables_error, Reason}) {error, {mnesia_tables_error, Reason}}
end.
-spec verify_tables() -> ok.
verify_tables() ->
lists:foreach(fun verify_table/1, ?TABLES),
ok.
-spec verify_table(atom()) -> ok.
verify_table(efka_client) ->
Expected = record_info(fields, efka_client),
case mnesia:table_info(efka_client, attributes) of
Expected ->
ok;
Actual ->
throw({table_attributes_mismatch, efka_client, Expected, Actual})
end. end.
-spec log_runtime_info() -> ok. -spec log_runtime_info() -> ok.
@ -94,17 +71,4 @@ log_runtime_info() ->
mnesia:system_info(directory), mnesia:system_info(directory),
mnesia:system_info(tables) mnesia:system_info(tables)
]), ]),
ok. ok.
-spec with_result(fun(() -> ok)) -> ok | {error, term()}.
with_result(Fun) ->
try Fun() of
ok ->
ok
catch
throw:Reason ->
{error, Reason};
Class:Reason:Stacktrace ->
logger:warning("[iot_mnesia] failed, class: ~p, reason: ~p, stack: ~p", [Class, Reason, Stacktrace]),
{error, Reason}
end.