diff options
author | Emile Joubert <emile@rabbitmq.com> | 2012-06-14 15:24:59 +0100 |
---|---|---|
committer | Emile Joubert <emile@rabbitmq.com> | 2012-06-14 15:24:59 +0100 |
commit | 6c7fcdc61d7915ed9ec4f4be72f52cc26ad84fa7 (patch) | |
tree | b5b600076e40b016fb39841b8070183fe5c8bbe6 | |
parent | 0bcd6f7a5d73086353512bccae6564efd40596f5 (diff) | |
download | rabbitmq-server-6c7fcdc61d7915ed9ec4f4be72f52cc26ad84fa7.tar.gz |
Rotate logs without consuming excessive memory
-rw-r--r-- | src/rabbit_error_logger_file_h.erl | 2 | ||||
-rw-r--r-- | src/rabbit_file.erl | 15 | ||||
-rw-r--r-- | src/rabbit_sasl_report_file_h.erl | 2 |
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} -> |