From 984d12479d149a4aa9818e87eeb4c19b862b7d67 Mon Sep 17 00:00:00 2001 From: Tino Breddin Date: Mon, 18 Nov 2019 16:43:08 +0100 Subject: [PATCH] Add test for error store support --- src/mnesia_rocksdb.erl | 16 ++++++++-------- test/mnesia_rocksdb_SUITE.erl | 1 - test/mnesia_rocksdb_error_handling.erl | 17 +++++++++++++++-- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/mnesia_rocksdb.erl b/src/mnesia_rocksdb.erl index df58cea..1411b27 100644 --- a/src/mnesia_rocksdb.erl +++ b/src/mnesia_rocksdb.erl @@ -23,7 +23,6 @@ -module(mnesia_rocksdb). - %% ---------------------------------------------------------------------------- %% BEHAVIOURS %% ---------------------------------------------------------------------------- @@ -31,7 +30,6 @@ -behaviour(mnesia_backend_type). -behaviour(gen_server). - %% ---------------------------------------------------------------------------- %% EXPORTS %% ---------------------------------------------------------------------------- @@ -903,8 +901,8 @@ init({Alias, Tab, Type, RdbOpts}) -> process_flag(trap_exit, true), try {ok, Ref, Ets} = do_load_table(Tab, RdbOpts), - OnWriteError = proplists:get_value(on_write_error, RdbOpts, ?WRITE_ERR_DEFAULT), - OnWriteErrorStore = proplists:get_value(on_write_error_store, RdbOpts, ?WRITE_ERR_STORE_DEFAULT), + OWE = proplists:get_value(on_write_error, RdbOpts, ?WRITE_ERR_DEFAULT), + OWEStore = proplists:get_value(on_write_error_store, RdbOpts, ?WRITE_ERR_STORE_DEFAULT), St = #st{ ets = Ets , ref = Ref , alias = Alias @@ -912,8 +910,8 @@ init({Alias, Tab, Type, RdbOpts}) -> , type = Type , size_warnings = 0 , maintain_size = should_maintain_size(Tab) - , on_write_error = OnWriteError - , on_write_error_store = OnWriteErrorStore + , on_write_error = OWE + , on_write_error_store = OWEStore }, {ok, recover_size_info(St)} catch @@ -1624,7 +1622,7 @@ write_result(ok, _, _, _) -> ok; write_result(Res, Op, Args, #st{tab = Tab, on_write_error = Rpt, on_write_error_store = OWEStore}) -> 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", [Op | Args] ++ [Res]), 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) -> {_, 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]) -> lists:append(["~p" | [", ~p" || _ <- T]]). diff --git a/test/mnesia_rocksdb_SUITE.erl b/test/mnesia_rocksdb_SUITE.erl index aed46cd..d7315da 100644 --- a/test/mnesia_rocksdb_SUITE.erl +++ b/test/mnesia_rocksdb_SUITE.erl @@ -29,7 +29,6 @@ groups() -> error_handling(_Config) -> mnesia_rocksdb_error_handling:run(). - init_per_suite(Config) -> Config. diff --git a/test/mnesia_rocksdb_error_handling.erl b/test/mnesia_rocksdb_error_handling.erl index 84470a4..3ddacc1 100644 --- a/test/mnesia_rocksdb_error_handling.erl +++ b/test/mnesia_rocksdb_error_handling.erl @@ -31,6 +31,14 @@ setup() -> create_tab(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), {atomic, ok} = mnesia:create_table(TabName, [{rdb, [node()]}, {user_properties, UserProps}]), @@ -43,7 +51,8 @@ tab_name(Type, Level, MaintainSz) -> user_props(Level, MaintainSz) -> [{maintain_sz, MaintainSz}, - {rocksdb_opts, [{on_write_error, Level}]}]. + {rocksdb_opts, [ {on_write_error, Level} + , {on_write_error_store, ?MODULE} ]}]. start_mnesia() -> mnesia_rocksdb_tlib:start_mnesia(reset), @@ -94,7 +103,11 @@ expect_error(Level, Tab) -> ok after 1000 -> 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(error ) -> mnesia_error;