From d33ee46b8c75e8788c864529429e9efde67e5578 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Wed, 11 Jun 2008 01:12:38 +0000 Subject: [PATCH] Change thrift_disk_log_transport to not flush when flush/1 is called if sync_every is defined Summary: For fast logging we don't want to actually flush to disk after every message. There's force_flush/1 now if you actually want to force one git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@666467 13f79535-47bb-0310-9956-ffa450edef68 --- lib/alterl/src/thrift_disk_log_transport.erl | 36 +++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/alterl/src/thrift_disk_log_transport.erl b/lib/alterl/src/thrift_disk_log_transport.erl index 71d37a5b..6ae7dedf 100644 --- a/lib/alterl/src/thrift_disk_log_transport.erl +++ b/lib/alterl/src/thrift_disk_log_transport.erl @@ -3,16 +3,20 @@ %%% Author : Todd Lipcon %%% Description : Write-only Thrift transport outputting to disk_log %%% Created : 22 Apr 2008 by Todd Lipcon +%%% +%%% Todo: this might be better off as a gen_server type of transport +%%% that handles stuff like group commit, similar to TFileTransport +%%% in cpp land %%%------------------------------------------------------------------- -module(thrift_disk_log_transport). -behaviour(thrift_transport). %% API --export([new/2, new_transport_factory/2]). +-export([new/2, new_transport_factory/2, new_transport_factory/3]). %% thrift_transport callbacks --export([read/2, write/2, flush/1, close/1]). +-export([read/2, write/2, force_flush/1, flush/1, close/1]). %% state -record(dl_transport, {log, @@ -26,17 +30,17 @@ %% when the transport is closed, pass a {close_on_close, true} tuple in the %% Opts list. new(LogName, Opts) when is_atom(LogName), is_list(Opts) -> - State = #dl_transport{log = LogName}, + State = parse_opts(Opts, #dl_transport{log = LogName}), State2 = case State#dl_transport.sync_every of N when is_integer(N), N > 0 -> - {ok, TRef} = timer:apply_interval(N, ?MODULE, flush, State), + {ok, TRef} = timer:apply_interval(N, ?MODULE, force_flush, State), State#dl_transport{sync_tref = TRef}; _ -> State end, - thrift_transport:new(?MODULE, parse_opts(Opts, State2)). + thrift_transport:new(?MODULE, State2). parse_opts([], State) -> @@ -56,9 +60,19 @@ read(_State, Len) -> write(#dl_transport{log = Log}, Data) -> disk_log:balog(Log, erlang:iolist_to_binary(Data)). -flush(#dl_transport{log = Log}) -> +force_flush(#dl_transport{log = Log}) -> + error_logger:info_msg("~p syncing~n", [?MODULE]), disk_log:sync(Log). +flush(#dl_transport{log = Log, sync_every = SE}) -> + case SE of + undefined -> % no time-based sync + disk_log:sync(Log); + _Else -> % sync will happen automagically + ok + end. + + %% On close, close the underlying log if we're configured to do so. close(#dl_transport{close_on_close = false}) -> ok; @@ -69,10 +83,14 @@ close(#dl_transport{log = Log}) -> %%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% new_transport_factory(Name, ExtraLogOpts) -> - F = fun() -> factory_impl(Name, ExtraLogOpts) end, + new_transport_factory(Name, ExtraLogOpts, [{close_on_close, true}, + {sync_every, 500}]). + +new_transport_factory(Name, ExtraLogOpts, TransportOpts) -> + F = fun() -> factory_impl(Name, ExtraLogOpts, TransportOpts) end, {ok, F}. -factory_impl(Name, ExtraLogOpts) -> +factory_impl(Name, ExtraLogOpts, TransportOpts) -> LogOpts = [{name, Name}, {format, external}, {type, wrap} | @@ -85,4 +103,4 @@ factory_impl(Name, ExtraLogOpts) -> error_logger:info_msg("Disk log ~p repaired: ~p, ~p~n", [Log, Info1, Info2]), Log end, - new(Log, [{close_on_close, true}]). + new(Log, TransportOpts). -- 2.17.1