diff options
author | Erlang/OTP <[email protected]> | 2010-02-03 10:51:00 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2010-02-03 10:51:00 +0000 |
commit | 45f6d10e587c509cfcaf9d9f4f81f88903eb4758 (patch) | |
tree | 9690a68e38fef9439a463c3158aa46b8a9e8d125 /lib/mnesia/src/mnesia_loader.erl | |
parent | b431080a98aa625758e41989437219357392ffb6 (diff) | |
parent | 3757d8fb1dfd1ff9b80aed2376070b5c4888aaba (diff) | |
download | otp-45f6d10e587c509cfcaf9d9f4f81f88903eb4758.tar.gz otp-45f6d10e587c509cfcaf9d9f4f81f88903eb4758.tar.bz2 otp-45f6d10e587c509cfcaf9d9f4f81f88903eb4758.zip |
Merge branch 'is/mnesia-send-compressed' into ccase/r13b04_dev
* is/mnesia-send-compressed:
Add option to compress data when copying tables between Mnesia nodes
OTP-8406 Igor Ribeiro Sucupira added the option to compress data when
copying tables between Mnesia nodes.
Diffstat (limited to 'lib/mnesia/src/mnesia_loader.erl')
-rw-r--r-- | lib/mnesia/src/mnesia_loader.erl | 45 |
1 files changed, 38 insertions, 7 deletions
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) -> |