diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2015-07-27 13:48:45 +0300 |
|---|---|---|
| committer | Michael Klishin <mklishin@pivotal.io> | 2015-07-27 13:48:45 +0300 |
| commit | 0c9509eeb85ca3e0091fd617e3d6365258a43c04 (patch) | |
| tree | 899fa03db34eedc18007792c1c6e4cff61e78088 | |
| parent | c6bb1a04439fc96d6c63de94a8f71d74280bf686 (diff) | |
| parent | 7bef94550f861b8d67b3f1ffaf48d69d7e02cb85 (diff) | |
| download | rabbitmq-server-git-0c9509eeb85ca3e0091fd617e3d6365258a43c04.tar.gz | |
Merge branch 'rabbitmq-server-226' into stable
| -rw-r--r-- | ebin/rabbit_app.in | 2 | ||||
| -rw-r--r-- | src/file_handle_cache.erl | 39 | ||||
| -rw-r--r-- | src/rabbit.erl | 11 |
3 files changed, 43 insertions, 9 deletions
diff --git a/ebin/rabbit_app.in b/ebin/rabbit_app.in index 654c52bdd3..76376f11bd 100644 --- a/ebin/rabbit_app.in +++ b/ebin/rabbit_app.in @@ -28,6 +28,8 @@ {channel_max, 0}, {heartbeat, 580}, {msg_store_file_size_limit, 16777216}, + {fhc_write_buffering, true}, + {fhc_read_buffering, true}, {queue_index_max_journal_entries, 65536}, {queue_index_embed_msgs_below, 4096}, {default_user, <<"guest">>}, diff --git a/src/file_handle_cache.erl b/src/file_handle_cache.erl index 8be19e5be3..d7e5abc873 100644 --- a/src/file_handle_cache.erl +++ b/src/file_handle_cache.erl @@ -343,6 +343,16 @@ read(Ref, Count) -> [Ref], keep, fun ([#handle { is_read = false }]) -> {error, not_open_for_reading}; + ([#handle{read_buffer_size_limit = 0, + hdl = Hdl, offset = Offset} = Handle]) -> + %% The read buffer is disabled. This is just an + %% optimization: the clauses below can handle this case. + case prim_file_read(Hdl, Count) of + {ok, Data} -> {{ok, Data}, + [Handle#handle{offset = Offset+size(Data)}]}; + eof -> {eof, [Handle #handle { at_eof = true }]}; + Error -> {Error, Handle} + end; ([Handle = #handle{read_buffer = Buf, read_buffer_pos = BufPos, read_buffer_rem = BufRem, @@ -584,8 +594,11 @@ info() -> info(?INFO_KEYS). info(Items) -> gen_server2:call(?SERVER, {info, Items}, infinity). clear_read_cache() -> - gen_server2:cast(?SERVER, clear_read_cache), - clear_vhost_read_cache(rabbit_vhost:list()). + case application:get_env(rabbit, fhc_read_buffering) of + false -> ok; + true -> gen_server2:cast(?SERVER, clear_read_cache), + clear_vhost_read_cache(rabbit_vhost:list()) + end. clear_vhost_read_cache([]) -> ok; @@ -816,15 +829,23 @@ oldest(Tree, DefaultFun) -> new_closed_handle(Path, Mode, Options) -> WriteBufferSize = - case proplists:get_value(write_buffer, Options, unbuffered) of - unbuffered -> 0; - infinity -> infinity; - N when is_integer(N) -> N + case application:get_env(rabbit, fhc_write_buffering) of + {ok, false} -> 0; + {ok, true} -> + case proplists:get_value(write_buffer, Options, unbuffered) of + unbuffered -> 0; + infinity -> infinity; + N when is_integer(N) -> N + end end, ReadBufferSize = - case proplists:get_value(read_buffer, Options, unbuffered) of - unbuffered -> 0; - N2 when is_integer(N2) -> N2 + case application:get_env(rabbit, fhc_read_buffering) of + {ok, false} -> 0; + {ok, true} -> + case proplists:get_value(read_buffer, Options, unbuffered) of + unbuffered -> 0; + N2 when is_integer(N2) -> N2 + end end, Ref = make_ref(), put({Ref, fhc_handle}, #handle { hdl = closed, diff --git a/src/rabbit.erl b/src/rabbit.erl index 84aaf4e20c..7ee51f09f7 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -898,6 +898,17 @@ ensure_working_fhc() -> %% file_handle_cache, we spawn a separate process. Parent = self(), TestFun = fun() -> + ReadBuf = case application:get_env(rabbit, fhc_read_buffering) of + {ok, true} -> "ON"; + {ok, false} -> "OFF" + end, + WriteBuf = case application:get_env(rabbit, fhc_write_buffering) of + {ok, true} -> "ON"; + {ok, false} -> "OFF" + end, + rabbit_log:info( + "FHC read buffering: ~s~n" + "FHC write buffering: ~s~n", [ReadBuf, WriteBuf]), Filename = filename:join(code:lib_dir(kernel, ebin), "kernel.app"), {ok, Fd} = file_handle_cache:open(Filename, [raw, binary, read], []), {ok, _} = file_handle_cache:read(Fd, 1), |
