Add test for error store support
This commit is contained in:
parent
0fab952f5d
commit
984d12479d
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
-module(mnesia_rocksdb).
|
-module(mnesia_rocksdb).
|
||||||
|
|
||||||
|
|
||||||
%% ----------------------------------------------------------------------------
|
%% ----------------------------------------------------------------------------
|
||||||
%% BEHAVIOURS
|
%% BEHAVIOURS
|
||||||
%% ----------------------------------------------------------------------------
|
%% ----------------------------------------------------------------------------
|
||||||
@ -31,7 +30,6 @@
|
|||||||
-behaviour(mnesia_backend_type).
|
-behaviour(mnesia_backend_type).
|
||||||
-behaviour(gen_server).
|
-behaviour(gen_server).
|
||||||
|
|
||||||
|
|
||||||
%% ----------------------------------------------------------------------------
|
%% ----------------------------------------------------------------------------
|
||||||
%% EXPORTS
|
%% EXPORTS
|
||||||
%% ----------------------------------------------------------------------------
|
%% ----------------------------------------------------------------------------
|
||||||
@ -903,8 +901,8 @@ init({Alias, Tab, Type, RdbOpts}) ->
|
|||||||
process_flag(trap_exit, true),
|
process_flag(trap_exit, true),
|
||||||
try
|
try
|
||||||
{ok, Ref, Ets} = do_load_table(Tab, RdbOpts),
|
{ok, Ref, Ets} = do_load_table(Tab, RdbOpts),
|
||||||
OnWriteError = proplists:get_value(on_write_error, RdbOpts, ?WRITE_ERR_DEFAULT),
|
OWE = proplists:get_value(on_write_error, RdbOpts, ?WRITE_ERR_DEFAULT),
|
||||||
OnWriteErrorStore = proplists:get_value(on_write_error_store, RdbOpts, ?WRITE_ERR_STORE_DEFAULT),
|
OWEStore = proplists:get_value(on_write_error_store, RdbOpts, ?WRITE_ERR_STORE_DEFAULT),
|
||||||
St = #st{ ets = Ets
|
St = #st{ ets = Ets
|
||||||
, ref = Ref
|
, ref = Ref
|
||||||
, alias = Alias
|
, alias = Alias
|
||||||
@ -912,8 +910,8 @@ init({Alias, Tab, Type, RdbOpts}) ->
|
|||||||
, type = Type
|
, type = Type
|
||||||
, size_warnings = 0
|
, size_warnings = 0
|
||||||
, maintain_size = should_maintain_size(Tab)
|
, maintain_size = should_maintain_size(Tab)
|
||||||
, on_write_error = OnWriteError
|
, on_write_error = OWE
|
||||||
, on_write_error_store = OnWriteErrorStore
|
, on_write_error_store = OWEStore
|
||||||
},
|
},
|
||||||
{ok, recover_size_info(St)}
|
{ok, recover_size_info(St)}
|
||||||
catch
|
catch
|
||||||
@ -1624,7 +1622,7 @@ write_result(ok, _, _, _) ->
|
|||||||
ok;
|
ok;
|
||||||
write_result(Res, Op, Args, #st{tab = Tab, on_write_error = Rpt, on_write_error_store = OWEStore}) ->
|
write_result(Res, Op, Args, #st{tab = Tab, on_write_error = Rpt, on_write_error_store = OWEStore}) ->
|
||||||
RptOp = rpt_op(Rpt),
|
RptOp = rpt_op(Rpt),
|
||||||
maybe_store_error(OWEStore, Res, Tab, Op, Args, erlang:system_time(second)),
|
maybe_store_error(OWEStore, Res, Tab, Op, Args, erlang:system_time(millisecond)),
|
||||||
mnesia_lib:RptOp("FAILED rocksdb:~p(" ++ rpt_fmt(Args) ++ ") -> ~p~n",
|
mnesia_lib:RptOp("FAILED rocksdb:~p(" ++ rpt_fmt(Args) ++ ") -> ~p~n",
|
||||||
[Op | Args] ++ [Res]),
|
[Op | Args] ++ [Res]),
|
||||||
if Rpt == fatal; Rpt == error ->
|
if Rpt == fatal; Rpt == error ->
|
||||||
@ -1649,7 +1647,9 @@ maybe_store_error(Table, Err, IntTable, write, [_, List, _], Time) ->
|
|||||||
|
|
||||||
insert_error(Table, {Type, _, _}, K, Err, Time) ->
|
insert_error(Table, {Type, _, _}, K, Err, Time) ->
|
||||||
{_, K1} = decode_key(K),
|
{_, K1} = decode_key(K),
|
||||||
ets:insert(Table, {{Type, K1}, Err, Time}).
|
ets:insert(Table, {{Type, K1}, Err, Time});
|
||||||
|
insert_error(Table, Type, K, Err, Time) when is_atom(Type) ->
|
||||||
|
ets:insert(Table, {{Type, K}, Err, Time}).
|
||||||
|
|
||||||
rpt_fmt([_|T]) ->
|
rpt_fmt([_|T]) ->
|
||||||
lists:append(["~p" | [", ~p" || _ <- T]]).
|
lists:append(["~p" | [", ~p" || _ <- T]]).
|
||||||
|
@ -29,7 +29,6 @@ groups() ->
|
|||||||
error_handling(_Config) ->
|
error_handling(_Config) ->
|
||||||
mnesia_rocksdb_error_handling:run().
|
mnesia_rocksdb_error_handling:run().
|
||||||
|
|
||||||
|
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
Config.
|
Config.
|
||||||
|
|
||||||
|
@ -31,6 +31,14 @@ setup() ->
|
|||||||
|
|
||||||
create_tab(Type, Level, MaintainSz) ->
|
create_tab(Type, Level, MaintainSz) ->
|
||||||
TabName = tab_name(Type, Level, MaintainSz),
|
TabName = tab_name(Type, Level, MaintainSz),
|
||||||
|
%% create error store before the table
|
||||||
|
case ets:info(?MODULE) of
|
||||||
|
undefined ->
|
||||||
|
?MODULE = ets:new(?MODULE, [bag, public, named_table]),
|
||||||
|
ok;
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
UserProps = user_props(Level, MaintainSz),
|
UserProps = user_props(Level, MaintainSz),
|
||||||
{atomic, ok} = mnesia:create_table(TabName, [{rdb, [node()]},
|
{atomic, ok} = mnesia:create_table(TabName, [{rdb, [node()]},
|
||||||
{user_properties, UserProps}]),
|
{user_properties, UserProps}]),
|
||||||
@ -43,7 +51,8 @@ tab_name(Type, Level, MaintainSz) ->
|
|||||||
|
|
||||||
user_props(Level, MaintainSz) ->
|
user_props(Level, MaintainSz) ->
|
||||||
[{maintain_sz, MaintainSz},
|
[{maintain_sz, MaintainSz},
|
||||||
{rocksdb_opts, [{on_write_error, Level}]}].
|
{rocksdb_opts, [ {on_write_error, Level}
|
||||||
|
, {on_write_error_store, ?MODULE} ]}].
|
||||||
|
|
||||||
start_mnesia() ->
|
start_mnesia() ->
|
||||||
mnesia_rocksdb_tlib:start_mnesia(reset),
|
mnesia_rocksdb_tlib:start_mnesia(reset),
|
||||||
@ -94,7 +103,11 @@ expect_error(Level, Tab) ->
|
|||||||
ok
|
ok
|
||||||
after 1000 ->
|
after 1000 ->
|
||||||
error({expected_error, [Level, Tab]})
|
error({expected_error, [Level, Tab]})
|
||||||
end.
|
|
||||||
|
end,
|
||||||
|
%% Also verify that an error entry has been written into the error store.
|
||||||
|
1 = ets:select_delete(?MODULE, [{{{Tab, '_'}, '_', '_'}, [], [true]}]),
|
||||||
|
ok.
|
||||||
|
|
||||||
rpt_tag(fatal ) -> mnesia_fatal;
|
rpt_tag(fatal ) -> mnesia_fatal;
|
||||||
rpt_tag(error ) -> mnesia_error;
|
rpt_tag(error ) -> mnesia_error;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user