diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-05-19 11:36:05 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-05-19 11:36:05 +0100 |
| commit | 8549f92b6928f7772714a9bde1b5569e418522cf (patch) | |
| tree | 26fb2e335bc4e33bcdcc25375e4886a7896a7333 /src | |
| parent | 2374b02b2cc700d9448faadfde3de078bc2eace9 (diff) | |
| download | rabbitmq-server-git-8549f92b6928f7772714a9bde1b5569e418522cf.tar.gz | |
Added a call to compact at the moment we start a new file. This closes a hole where the GC isn't being fired soon enough on new files. Also turned on preallocation for new files.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_disk_queue.erl | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/rabbit_disk_queue.erl b/src/rabbit_disk_queue.erl index fc04899eee..0c4c2e2a61 100644 --- a/src/rabbit_disk_queue.erl +++ b/src/rabbit_disk_queue.erl @@ -333,8 +333,17 @@ init([FileSizeLimit, ReadFileHandlesLimit]) -> current_offset = Offset } } = load_from_disk(State), Path = form_filename(CurrentName), + Exists = case file:read_file_info(Path) of + {error,enoent} -> false; + {ok, _} -> true + end, %% read is only needed so that we can seek {ok, FileHdl} = file:open(Path, [read, write, raw, binary, delayed_write]), + ok = if Exists -> ok; + true -> %% new file, so preallocate + {ok, FileSizeLimit} = file:position(FileHdl, {bof, FileSizeLimit}), + file:truncate(FileHdl) + end, {ok, Offset} = file:position(FileHdl, {bof, Offset}), {ok, State1 #dqstate { current_file_handle = FileHdl }}. @@ -729,13 +738,17 @@ maybe_roll_to_new_file(Offset, NextName = integer_to_list(NextNum) ++ ?FILE_EXTENSION, {ok, NextHdl} = file:open(form_filename(NextName), [write, raw, binary, delayed_write]), + {ok, FileSizeLimit} = file:position(NextHdl, {bof, FileSizeLimit}), + ok = file:truncate(NextHdl), + {ok, 0} = file:position(NextHdl, {bof, 0}), true = ets:update_element(FileSummary, CurName, {5, NextName}), %% 5 is Right true = ets:insert_new(FileSummary, {NextName, 0, 0, CurName, undefined}), - {ok, State #dqstate { current_file_name = NextName, - current_file_handle = NextHdl, - current_file_num = NextNum, - current_offset = 0 - }}; + State1 = State #dqstate { current_file_name = NextName, + current_file_handle = NextHdl, + current_file_num = NextNum, + current_offset = 0 + }, + {ok, compact(sets:from_list([CurName]), State1)}; maybe_roll_to_new_file(_, State) -> {ok, State}. |
