diff options
Diffstat (limited to 'lib/mnesia/src')
-rw-r--r-- | lib/mnesia/src/mnesia.erl | 12 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_loader.erl | 45 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_monitor.erl | 22 | ||||
-rw-r--r-- | lib/mnesia/src/mnesia_tm.erl | 11 |
4 files changed, 64 insertions, 26 deletions
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl index 9a630f18eb..fb29007780 100644 --- a/lib/mnesia/src/mnesia.erl +++ b/lib/mnesia/src/mnesia.erl @@ -1,19 +1,19 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1996-2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 1996-2010. 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% %% @@ -2200,6 +2200,7 @@ system_info2(transaction_log_writes) -> mnesia_dumper:get_log_writes(); system_info2(core_dir) -> mnesia_monitor:get_env(core_dir); system_info2(no_table_loaders) -> mnesia_monitor:get_env(no_table_loaders); system_info2(dc_dump_limit) -> mnesia_monitor:get_env(dc_dump_limit); +system_info2(send_compressed) -> mnesia_monitor:get_env(send_compressed); system_info2(Item) -> exit({badarg, Item}). @@ -2244,6 +2245,7 @@ system_info_items(yes) -> core_dir, no_table_loaders, dc_dump_limit, + send_compressed, version ]; system_info_items(no) -> diff --git a/lib/mnesia/src/mnesia_loader.erl b/lib/mnesia/src/mnesia_loader.erl index 77c317abc5..3de329503e 100644 --- a/lib/mnesia/src/mnesia_loader.erl +++ b/lib/mnesia/src/mnesia_loader.erl @@ -1,19 +1,19 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1998-2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 1998-2010. 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% %% @@ -438,6 +438,9 @@ make_table_fun(Pid, TabRec) -> get_data(Pid, TabRec) -> receive + {Pid, {more_z, CompressedRecs}} when is_binary(CompressedRecs) -> + Pid ! {TabRec, more}, + {zlib_uncompress(CompressedRecs), make_table_fun(Pid,TabRec)}; {Pid, {more, Recs}} -> Pid ! {TabRec, more}, {Recs, make_table_fun(Pid,TabRec)}; @@ -769,6 +772,27 @@ dets_bchunk(Tab, Chunk) -> %% Arrg Else -> Else end. +zlib_compress(Data, Level) -> + BinData = term_to_binary(Data), + Z = zlib:open(), + zlib:deflateInit(Z, Level), + Bs = zlib:deflate(Z, BinData, finish), + zlib:deflateEnd(Z), + zlib:close(Z), + list_to_binary(Bs). + +zlib_uncompress(Data) when is_binary(Data) -> + binary_to_term(zlib:uncompress(Data)). + +compression_level() -> + NoCompression = 0, + case ?catch_val(send_compressed) of + {'EXIT', _} -> + mnesia_lib:set(send_compressed, NoCompression), + NoCompression; + Val -> Val + end. + send_packet(N, Pid, _Chunk, '$end_of_table', OldNode) -> case OldNode of true -> ignore; %% Old nodes can't handle the new no_more @@ -779,8 +803,15 @@ send_packet(N, Pid, Chunk, {[], Cont}, OldNode) -> send_packet(N, Pid, Chunk, Chunk(Cont), OldNode); send_packet(N, Pid, Chunk, {Recs, Cont}, OldNode) when N < ?MAX_NOPACKETS -> case OldNode of - true -> Pid ! {self(), {more, [Recs]}}; %% Old need's wrapping list - false -> Pid ! {self(), {more, Recs}} + true -> + Pid ! {self(), {more, [Recs]}}; %% Old need's wrapping list + false -> + case compression_level() of + 0 -> + Pid ! {self(), {more, Recs}}; + Level -> + Pid ! {self(), {more_z, zlib_compress(Recs, Level)}} + end end, send_packet(N+1, Pid, Chunk, Chunk(Cont), OldNode); send_packet(_N, _Pid, _Chunk, DataState, _OldNode) -> diff --git a/lib/mnesia/src/mnesia_monitor.erl b/lib/mnesia/src/mnesia_monitor.erl index 05ae943e3b..5df5df4969 100644 --- a/lib/mnesia/src/mnesia_monitor.erl +++ b/lib/mnesia/src/mnesia_monitor.erl @@ -1,19 +1,19 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1996-2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 1996-2010. 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% %% @@ -497,7 +497,7 @@ handle_cast({mnesia_down, mnesia_locker, Node}, State) -> process_q(State3); false -> %% No pending remote monitors - {noreply, State2} + process_q(State2) end; handle_cast({disconnect, Node}, State) -> @@ -674,7 +674,8 @@ env() -> core_dir, pid_sort_order, no_table_loaders, - dc_dump_limit + dc_dump_limit, + send_compressed ]. default_env(access_module) -> @@ -717,7 +718,9 @@ default_env(pid_sort_order) -> default_env(no_table_loaders) -> 2; default_env(dc_dump_limit) -> - 4. + 4; +default_env(send_compressed) -> + 0. check_type(Env, Val) -> case catch do_check_type(Env, Val) of @@ -763,7 +766,8 @@ do_check_type(pid_sort_order, standard) -> standard; do_check_type(pid_sort_order, "standard") -> standard; do_check_type(pid_sort_order, _) -> false; do_check_type(no_table_loaders, N) when is_integer(N), N > 0 -> N; -do_check_type(dc_dump_limit,N) when is_number(N), N > 0 -> N. +do_check_type(dc_dump_limit,N) when is_number(N), N > 0 -> N; +do_check_type(send_compressed, L) when is_integer(L), L >= 0, L =< 9 -> L. bool(true) -> true; bool(false) -> false. diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl index 3f3a10a9c1..d42109c3da 100644 --- a/lib/mnesia/src/mnesia_tm.erl +++ b/lib/mnesia/src/mnesia_tm.erl @@ -1,19 +1,19 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1996-2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 1996-2010. 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% %% @@ -1389,6 +1389,7 @@ multi_commit(sync_sym_trans, Tid, CR, Store) -> {Outcome, []} = rec_all(WaitFor, Tid, do_commit, []), ?eval_debug_fun({?MODULE, multi_commit_sym_sync}, [{tid, Tid}, {outcome, Outcome}]), + [?ets_insert(Store, {waiting_for_commit_ack, Node}) || Node <- WaitFor], rpc:abcast(DiscNs -- [node()], ?MODULE, {Tid, Outcome}), rpc:abcast(RamNs -- [node()], ?MODULE, {Tid, Outcome}), case Outcome of |