fix mneisa
This commit is contained in:
parent
eaddd964ea
commit
b687541d27
@ -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(),
|
||||||
|
|||||||
@ -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.
|
||||||
@ -95,16 +72,3 @@ log_runtime_info() ->
|
|||||||
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.
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user