diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-10-23 13:37:38 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-10-23 13:37:38 +0100 |
| commit | 882ca0d5945b0c092e88aa6d9a2f5760fc1f455b (patch) | |
| tree | ccaa51fddaa5a7e94d7a31aabde5c9146d2d5faf /src | |
| parent | ced4fd7cf1a74bd0bbbdc18819d632a4aae87be8 (diff) | |
| download | rabbitmq-server-git-882ca0d5945b0c092e88aa6d9a2f5760fc1f455b.tar.gz | |
Added is_dirty, which is necessary so that we can avoid unnecessary syncs. It's not good enough to just look at the write buffer, because the write_buffer may not be being used. Also corrected gross mistakes in sync, moved around the last_used_at update, and some cosmetics too
Diffstat (limited to 'src')
| -rw-r--r-- | src/file_handle_cache.erl | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/src/file_handle_cache.erl b/src/file_handle_cache.erl index 6cb4c094db..e45156dc7d 100644 --- a/src/file_handle_cache.erl +++ b/src/file_handle_cache.erl @@ -44,6 +44,7 @@ { hdl, offset, trusted_offset, + is_dirty, write_buffer_size, write_buffer_size_limit, write_buffer, @@ -100,11 +101,14 @@ close(Ref) -> undefined -> ok; Handle -> case write_buffer(Handle) of - {ok, #handle { hdl = Hdl, global_key = GRef, + {ok, #handle { hdl = Hdl, global_key = GRef, is_dirty = IsDirty, is_read = IsReader, is_write = IsWriter }} -> case Hdl of closed -> ok; - _ -> ok = file:sync(Hdl), + _ -> ok = case IsDirty of + true -> file:sync(Hdl); + false -> ok + end, ok = file:close(Hdl) end, #file { reader_count = RCount, has_writer = HasWriter, @@ -149,9 +153,9 @@ read(Ref, Count) -> end; {Error, Handle2} -> {Error, Handle2} end, - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now() }), + put({Ref, fhc_handle}, Handle1), Result; - ErrorAndState -> ErrorAndState + Error -> Error end. append(Ref, Data) -> @@ -166,16 +170,16 @@ append(Ref, Data) -> {{error, _} = Error, Handle2} -> {Error, Handle2} end, - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now() }), + put({Ref, fhc_handle}, Handle1), Result; - ErrorAndState -> ErrorAndState + Error -> Error end. last_sync_offset(Ref) -> case get_or_reopen(Ref) of {ok, #handle { trusted_offset = TrustedOffset }} -> {ok, TrustedOffset}; - ErrorAndState -> ErrorAndState + Error -> Error end. position(Ref, NewOffset) -> @@ -186,28 +190,32 @@ position(Ref, NewOffset) -> {ok, Handle2} -> maybe_seek(NewOffset, Handle2); {Error, Handle2} -> {Error, Handle2} end, - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now() }), + put({Ref, fhc_handle}, Handle1), Result; - ErrorAndState -> ErrorAndState + Error -> Error end. sync(Ref) -> case get_or_reopen(Ref) of - {ok, Handle = #handle { write_buffer = [], hdl = Hdl, - offset = Offset }} -> + {ok, #handle { is_dirty = false, write_buffer = [] }} -> + ok; + {ok, Handle} -> + %% write_buffer will set is_dirty, or leave it set if buffer empty {Result, Handle1} = - case file:sync(Hdl) of - ok -> {ok, Handle #handle { trusted_offset = Offset }}; + case write_buffer(Handle) of + {ok, Handle2 = #handle { + hdl = Hdl, offset = Offset, is_dirty = true }} -> + case file:sync(Hdl) of + ok -> {ok, + Handle2 #handle { trusted_offset = Offset, + is_dirty = false }}; + Error -> {Error, Handle2} + end; Error -> {Error, Handle} end, - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now() }), - Result; - {ok, Handle = #handle { at_eof = true }} -> - %% we can't have content in the buffer without being at eof - {Result, Handle1} = write_buffer(Handle), - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now() }), + put({Ref, fhc_handle}, Handle1), Result; - ErrorAndState -> ErrorAndState + Error -> Error end. truncate(Ref) -> @@ -232,9 +240,9 @@ truncate(Ref) -> end; {Error, Handle2} -> {Error, Handle2} end, - put({Ref, fhc_handle}, Handle1 #handle { last_used_at = now () }), + put({Ref, fhc_handle}, Handle1), Result; - ErrorAndState -> ErrorAndState + Error -> Error end. get_or_reopen(Ref) -> @@ -244,7 +252,7 @@ get_or_reopen(Ref) -> options = Options } -> #file { path = Path } = get({GRef, fhc_file}), open1(Path, Mode, Options, Ref, GRef); - Handle -> {ok, Handle} + Handle -> {ok, Handle #handle { last_used_at = now() }} end. open1(Path, Mode, Options, Ref, GRef) -> @@ -262,7 +270,8 @@ open1(Path, Mode, Options, Ref, GRef) -> write_buffer_size_limit = WriteBufferSize, write_buffer = [], at_eof = false, mode = Mode, is_write = is_writer(Mode), is_read = is_reader(Mode), - global_key = GRef, last_used_at = now() }, + global_key = GRef, last_used_at = now(), + is_dirty = false }, put({Ref, fhc_handle}, Handle), {ok, Handle}; {error, Reason} -> @@ -284,7 +293,7 @@ maybe_seek(NewOffset, Handle = #handle { hdl = Hdl, at_eof = AtEoF, write_to_buffer(Data, Handle = #handle { hdl = Hdl, write_buffer_size_limit = 0 }) -> - {file:write(Hdl, Data), Handle}; + {file:write(Hdl, Data), Handle #handle { is_dirty = true }}; write_to_buffer(Data, Handle = #handle { write_buffer = WriteBuffer, write_buffer_size = Size, @@ -307,7 +316,7 @@ write_buffer(Handle = #handle { hdl = Hdl, offset = Offset, ok -> Offset1 = Offset + DataSize, {ok, Handle #handle { offset = Offset1, write_buffer = [], - write_buffer_size = 0 }}; + write_buffer_size = 0, is_dirty = true }}; {error, _} = Error -> {Error, Handle} end. |
