%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2010-2011. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% %% %% -module(mnesia_majority_test). -author('ulf.wiger@erlang-solutions.com'). -compile(export_all). -include("mnesia_test_lib.hrl"). init_per_testcase(Func, Conf) -> mnesia_test_lib:init_per_testcase(Func, Conf). end_per_testcase(Func, Conf) -> mnesia_test_lib:end_per_testcase(Func, Conf). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all() -> [ write , wread , delete , clear_table , frag , change_majority , frag_change_majority ]. write(suite) -> []; write(Config) when is_list(Config) -> [N1, N2, N3] = ?acquire_nodes(3, Config), Tab = t, Schema = [{name, Tab}, {ram_copies, [N1,N2,N3]}, {majority,true}], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match({[ok,ok,ok],[]}, rpc:multicall([N1,N2,N3], mnesia, wait_for_tables, [[Tab], 3000])), ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), mnesia_test_lib:kill_mnesia([N3]), ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), mnesia_test_lib:kill_mnesia([N2]), ?match({aborted,{no_majority,Tab}}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)). wread(suite) -> []; wread(Config) when is_list(Config) -> [N1, N2] = ?acquire_nodes(2, Config), Tab = t, Schema = [{name, Tab}, {ram_copies, [N1,N2]}, {majority,true}], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match({[ok,ok],[]}, rpc:multicall([N1,N2], mnesia, wait_for_tables, [[Tab], 3000])), ?match({atomic,[]}, mnesia:transaction(fun() -> mnesia:read(t,1,write) end)), mnesia_test_lib:kill_mnesia([N2]), ?match({aborted,{no_majority,Tab}}, mnesia:transaction(fun() -> mnesia:read(t,1,write) end)). delete(suite) -> []; delete(Config) when is_list(Config) -> [N1, N2] = ?acquire_nodes(2, Config), Tab = t, Schema = [{name, Tab}, {ram_copies, [N1,N2]}, {majority,true}], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match({[ok,ok],[]}, rpc:multicall([N1,N2], mnesia, wait_for_tables, [[Tab], 3000])), %% works as expected with majority of nodes present ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:delete({t,1}) end)), ?match({atomic,[]}, mnesia:transaction(fun() -> mnesia:read({t,1}) end)), %% put the record back ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), ?match({atomic,[{t,1,a}]}, mnesia:transaction(fun() -> mnesia:read({t,1}) end)), mnesia_test_lib:kill_mnesia([N2]), ?match({aborted,{no_majority,Tab}}, mnesia:transaction(fun() -> mnesia:delete({t,1}) end)). clear_table(suite) -> []; clear_table(Config) when is_list(Config) -> [N1, N2] = ?acquire_nodes(2, Config), Tab = t, Schema = [{name, Tab}, {ram_copies, [N1,N2]}, {majority,true}], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match({[ok,ok],[]}, rpc:multicall([N1,N2], mnesia, wait_for_tables, [[Tab], 3000])), %% works as expected with majority of nodes present ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), ?match({atomic,ok}, mnesia:clear_table(t)), ?match({atomic,[]}, mnesia:transaction(fun() -> mnesia:read({t,1}) end)), %% put the record back ?match({atomic,ok}, mnesia:transaction(fun() -> mnesia:write({t,1,a}) end)), ?match({atomic,[{t,1,a}]}, mnesia:transaction(fun() -> mnesia:read({t,1}) end)), mnesia_test_lib:kill_mnesia([N2]), ?match({aborted,{no_majority,Tab}}, mnesia:clear_table(t)). frag(suite) -> []; frag(Config) when is_list(Config) -> [N1] = ?acquire_nodes(1, Config), Tab = t, Schema = [ {name, Tab}, {ram_copies, [N1]}, {majority,true}, {frag_properties, [{n_fragments, 2}]} ], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match(true, mnesia:table_info(t, majority)), ?match(true, mnesia:table_info(t_frag2, majority)). change_majority(suite) -> []; change_majority(Config) when is_list(Config) -> [N1,N2] = ?acquire_nodes(2, Config), Tab = t, Schema = [ {name, Tab}, {ram_copies, [N1,N2]}, {majority,false} ], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match(false, mnesia:table_info(t, majority)), ?match({atomic, ok}, mnesia:change_table_majority(t, true)), ?match(true, mnesia:table_info(t, majority)), ?match(ok, mnesia:activity(transaction, fun() -> mnesia:write({t,1,a}) end)), mnesia_test_lib:kill_mnesia([N2]), ?match({'EXIT',{aborted,{no_majority,_}}}, mnesia:activity(transaction, fun() -> mnesia:write({t,1,a}) end)). frag_change_majority(suite) -> []; frag_change_majority(Config) when is_list(Config) -> [N1,N2] = ?acquire_nodes(2, Config), Tab = t, Schema = [ {name, Tab}, {ram_copies, [N1,N2]}, {majority,false}, {frag_properties, [{n_fragments, 2}, {n_ram_copies, 2}, {node_pool, [N1,N2]}]} ], ?match({atomic, ok}, mnesia:create_table(Schema)), ?match(false, mnesia:table_info(t, majority)), ?match(false, mnesia:table_info(t_frag2, majority)), ?match({aborted,{bad_type,t_frag2}}, mnesia:change_table_majority(t_frag2, true)), ?match({atomic, ok}, mnesia:change_table_majority(t, true)), ?match(true, mnesia:table_info(t, majority)), ?match(true, mnesia:table_info(t_frag2, majority)), ?match(ok, mnesia:activity(transaction, fun() -> mnesia:write({t,1,a}) end, mnesia_frag)), mnesia_test_lib:kill_mnesia([N2]), ?match({'EXIT',{aborted,{no_majority,_}}}, mnesia:activity(transaction, fun() -> mnesia:write({t,1,a}) end, mnesia_frag)).