summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2012-06-14 15:24:59 +0100
committerEmile Joubert <emile@rabbitmq.com>2012-06-14 15:24:59 +0100
commit6c7fcdc61d7915ed9ec4f4be72f52cc26ad84fa7 (patch)
treeb5b600076e40b016fb39841b8070183fe5c8bbe6
parent0bcd6f7a5d73086353512bccae6564efd40596f5 (diff)
downloadrabbitmq-server-6c7fcdc61d7915ed9ec4f4be72f52cc26ad84fa7.tar.gz
Rotate logs without consuming excessive memory
-rw-r--r--src/rabbit_error_logger_file_h.erl2
-rw-r--r--src/rabbit_file.erl15
-rw-r--r--src/rabbit_sasl_report_file_h.erl2
3 files changed, 14 insertions, 5 deletions
diff --git a/src/rabbit_error_logger_file_h.erl b/src/rabbit_error_logger_file_h.erl
index 042ab23c..0bb0ebbd 100644
--- a/src/rabbit_error_logger_file_h.erl
+++ b/src/rabbit_error_logger_file_h.erl
@@ -33,7 +33,7 @@
%% Used only when swapping handlers in log rotation
init({{File, Suffix}, []}) ->
- case rabbit_file:append_file(File, Suffix) of
+ case rabbit_file:copy_file(File, {[File, Suffix], [append]}) of
ok -> file:delete(File),
ok;
{error, Error} ->
diff --git a/src/rabbit_file.erl b/src/rabbit_file.erl
index 59df14f3..b0cceb90 100644
--- a/src/rabbit_file.erl
+++ b/src/rabbit_file.erl
@@ -22,7 +22,7 @@
-export([read_term_file/1, write_term_file/2, write_file/2, write_file/3]).
-export([append_file/2, ensure_parent_dirs_exist/1]).
-export([rename/2, delete/1, recursive_delete/1, recursive_copy/2]).
--export([lock_file/1]).
+-export([copy_file/2, lock_file/1]).
%%----------------------------------------------------------------------------
@@ -53,6 +53,8 @@
-spec(recursive_copy/2 ::
(file:filename(), file:filename())
-> rabbit_types:ok_or_error({file:filename(), file:filename(), any()})).
+-spec(copy_file/2 ::
+ (file:filename(), file:filename()) -> ok_or_error()).
-spec(lock_file/1 :: (file:filename()) -> rabbit_types:ok_or_error('eexist')).
-endif.
@@ -102,9 +104,12 @@ read_file_info(File) ->
with_fhc_handle(fun () -> prim_file:read_file_info(File) end).
with_fhc_handle(Fun) ->
- ok = file_handle_cache:obtain(),
+ with_fhc_handle(1, Fun).
+
+with_fhc_handle(N, Fun) ->
+ [ ok = file_handle_cache:obtain() || _ <- lists:seq(1, N)],
try Fun()
- after ok = file_handle_cache:release()
+ after [ ok = file_handle_cache:release() || _ <- lists:seq(1, N)]
end.
read_term_file(File) ->
@@ -241,6 +246,10 @@ is_symlink_no_handle(File) ->
_ -> false
end.
+copy_file(File1, File2) ->
+ with_fhc_handle(2, fun () -> file:copy(File1, File2)
+ end).
+
recursive_copy(Src, Dest) ->
%% Note that this uses the 'file' module and, hence, shouldn't be
%% run on many processes at once.
diff --git a/src/rabbit_sasl_report_file_h.erl b/src/rabbit_sasl_report_file_h.erl
index e8beecfe..9863c611 100644
--- a/src/rabbit_sasl_report_file_h.erl
+++ b/src/rabbit_sasl_report_file_h.erl
@@ -34,7 +34,7 @@
%% Used only when swapping handlers and performing
%% log rotation
init({{File, Suffix}, []}) ->
- case rabbit_file:append_file(File, Suffix) of
+ case rabbit_file:copy_file(File, {[File, Suffix], [append]}) of
ok -> file:delete(File),
ok;
{error, Error} ->