Add test for error store support

This commit is contained in:
Tino Breddin 2019-11-18 16:43:08 +01:00
parent 0fab952f5d
commit 984d12479d
3 changed files with 23 additions and 11 deletions

View File

@ -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]]).

View File

@ -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.

View File

@ -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;