diff options
-rw-r--r-- | lib/mnesia/src/mnesia.hrl | 2 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_controller.erl | 14 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_log.erl | 2 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_tm.erl | 27 |
4 files changed, 35 insertions, 10 deletions
diff --git a/lib/mnesia/src/mnesia.hrl b/lib/mnesia/src/mnesia.hrl index 72940b4729..60c75dbe8f 100644 --- a/lib/mnesia/src/mnesia.hrl +++ b/lib/mnesia/src/mnesia.hrl @@ -68,6 +68,7 @@ ram_copies = [], % [Node] disc_copies = [], % [Node] disc_only_copies = [], % [Node] + external_copies = [], % [{{Alias,Mod},[Node]}] load_order = 0, % Integer access_mode = read_write, % read_write | read_only majority = false, % true | false @@ -103,6 +104,7 @@ ram_copies = [], disc_copies = [], disc_only_copies = [], + external_copies = [], snmp = [], schema_ops = [] }). diff --git a/lib/mnesia/src/mnesia_controller.erl b/lib/mnesia/src/mnesia_controller.erl index 69ccc1d2c9..7300c8c648 100644 --- a/lib/mnesia/src/mnesia_controller.erl +++ b/lib/mnesia/src/mnesia_controller.erl @@ -385,6 +385,8 @@ force_load_table(Tab) when is_atom(Tab), Tab /= schema -> do_force_load_table(Tab); disc_only_copies -> do_force_load_table(Tab); + {ext, _, _} -> + do_force_load_table(Tab); unknown -> set({Tab, load_by_force}, true), cast({force_load_updated, Tab}), @@ -1533,8 +1535,8 @@ update_whereabouts(Tab, Node, State) -> Storage == unknown -> %% No own copy, continue to read remotely add_active_replica(Tab, Node), - NodeST = mnesia_lib:storage_type_at_node(Node, Tab), - ReadST = mnesia_lib:storage_type_at_node(Read, Tab), + NodeST = mnesia_lib:semantics(mnesia_lib:storage_type_at_node(Node, Tab), storage), + ReadST = mnesia_lib:semantics(mnesia_lib:storage_type_at_node(Read, Tab), storage), if %% Avoid reading from disc_only_copies NodeST == disc_only_copies -> ignore; @@ -1588,6 +1590,7 @@ last_consistent_replica(Tab, Downs) -> Ram = Cs#cstruct.ram_copies, Disc = Cs#cstruct.disc_copies, DiscOnly = Cs#cstruct.disc_only_copies, + Ext = Cs#cstruct.external_copies, BetterCopies0 = mnesia_lib:remote_copy_holders(Cs) -- Downs, BetterCopies = BetterCopies0 -- Ram, AccessMode = Cs#cstruct.access_mode, @@ -1620,7 +1623,7 @@ last_consistent_replica(Tab, Downs) -> false; Storage == ram_copies -> if - Disc == [], DiscOnly == [] -> + Disc == [], DiscOnly == [], Ext == [] -> %% Nobody has copy on disc {true, {Tab, ram_only}}; true -> @@ -1865,6 +1868,11 @@ info([Tab | Tail]) -> dets:info(Tab, size), dets:info(Tab, file_size), "bytes on disc"); + {ext, Alias, Mod} -> + info_format(Tab, + Mod:info(Alias, Tab, size), + Mod:info(Alias, Tab, memory), + "words of mem"); _ -> info_format(Tab, ?ets_info(Tab, size), diff --git a/lib/mnesia/src/mnesia_log.erl b/lib/mnesia/src/mnesia_log.erl index 36135418c8..d9f46d1d96 100644 --- a/lib/mnesia/src/mnesia_log.erl +++ b/lib/mnesia/src/mnesia_log.erl @@ -226,6 +226,7 @@ sappend(Log, Term) -> %% Write commit records to the latest_log log(C) when C#commit.disc_copies == [], C#commit.disc_only_copies == [], + C#commit.external_copies == [], C#commit.schema_ops == [] -> ignore; log(C) -> @@ -249,6 +250,7 @@ log(C) -> slog(C) when C#commit.disc_copies == [], C#commit.disc_only_copies == [], + C#commit.external_copies == [], C#commit.schema_ops == [] -> ignore; slog(C) -> diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl index e7ee938312..70938c1d8f 100644 --- a/lib/mnesia/src/mnesia_tm.erl +++ b/lib/mnesia/src/mnesia_tm.erl @@ -1137,13 +1137,14 @@ arrange(Tid, Store, Type) -> reverse([]) -> []; reverse([H=#commit{ram_copies=Ram, disc_copies=DC, - disc_only_copies=DOC,snmp = Snmp} + disc_only_copies=DOC,snmp = Snmp, external_copies=EC} |R]) -> [ H#commit{ - ram_copies = lists:reverse(Ram), - disc_copies = lists:reverse(DC), - disc_only_copies = lists:reverse(DOC), + ram_copies = lists:reverse(Ram), + disc_copies = lists:reverse(DC), + disc_only_copies = lists:reverse(DOC), + external_copies = lists:reverse(EC), snmp = lists:reverse(Snmp) } | reverse(R)]. @@ -1323,7 +1324,10 @@ prepare_node(Node, Storage, [Item | Items], Rec, Kind) when Kind /= schema -> Rec#commit{disc_copies = [Item | Rec#commit.disc_copies]}; disc_only_copies -> Rec#commit{disc_only_copies = - [Item | Rec#commit.disc_only_copies]} + [Item | Rec#commit.disc_only_copies]}; + {ext, Alias, Mod} -> + Rec#commit{external_copies = + [{{ext, Alias, Mod}, Item} | Rec#commit.external_copies]} end, prepare_node(Node, Storage, Items, Rec2, Kind); prepare_node(_Node, _Storage, Items, Rec, Kind) @@ -1761,8 +1765,15 @@ do_commit(Tid, C, DumperMode) -> R2 = do_update(Tid, ram_copies, C#commit.ram_copies, R), R3 = do_update(Tid, disc_copies, C#commit.disc_copies, R2), R4 = do_update(Tid, disc_only_copies, C#commit.disc_only_copies, R3), + R5 = do_update_ext(Tid, C#commit.external_copies, R4), mnesia_subscr:report_activity(Tid), - R4. + R5. + +%% This could/should be optimized +do_update_ext(Tid, Ops, OldRes) -> + lists:foldl(fun({{ext, _,_} = Storage, Op}, R) -> + do_update(Tid, Storage, [Op], R) + end, OldRes, Ops). %% Update the items do_update(Tid, Storage, [Op | Ops], OldRes) -> @@ -1902,6 +1913,7 @@ do_snmp(Tid, [Head | Tail]) -> commit_nodes([C | Tail], AccD, AccR) when C#commit.disc_copies == [], C#commit.disc_only_copies == [], + C#commit.external_copies == [], C#commit.schema_ops == [] -> commit_nodes(Tail, AccD, [C#commit.node | AccR]); commit_nodes([C | Tail], AccD, AccR) -> @@ -1914,7 +1926,8 @@ commit_decision(D, [C | Tail], AccD, AccR) -> {D2, Tail2} = case C#commit.schema_ops of [] when C#commit.disc_copies == [], - C#commit.disc_only_copies == [] -> + C#commit.disc_only_copies == [], + C#commit.external_copies == [] -> commit_decision(D, Tail, AccD, [N | AccR]); [] -> commit_decision(D, Tail, [N | AccD], AccR); |