summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-11-25 11:30:40 +0000
committerMatthew Sackman <matthew@lshift.net>2009-11-25 11:30:40 +0000
commit2d776a2bc7914ee5de21300f5a83ca474a91a7e6 (patch)
tree6a36628efede7db05a42f745a01bb34e0f5fcc20 /src
parent0d05597f6068b31c29ea7df752892d13d5f2927f (diff)
downloadrabbitmq-server-git-2d776a2bc7914ee5de21300f5a83ca474a91a7e6.tar.gz
corrected order of cast tuple; improved set_maximum_since_use; corrected bug that led to a /0, due to exhausting fhs just through calls to inc and dec (from sockets - only happens when the limit is very very low)
Diffstat (limited to 'src')
-rw-r--r--src/file_handle_cache.erl51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/file_handle_cache.erl b/src/file_handle_cache.erl
index 26cedca74d..53c3e6a2a3 100644
--- a/src/file_handle_cache.erl
+++ b/src/file_handle_cache.erl
@@ -170,21 +170,26 @@ copy(Src, Dest, Count) ->
set_maximum_since_use(MaximumAge) ->
Now = now(),
- lists:foreach(
- fun ({{Ref, fhc_handle}, Handle = #handle { hdl = Hdl,
- last_used_at = Then }}) ->
+ Report =
+ lists:foldl(
+ fun ({{Ref, fhc_handle},
+ Handle = #handle { hdl = Hdl, last_used_at = Then }}, Rep) ->
Age = timer:now_diff(Now, Then),
case Hdl /= closed andalso Age >= MaximumAge of
true -> case close1(Ref, Handle, soft) of
- {ok, Handle1} -> put({Ref, fhc_handle}, Handle1);
- _ -> ok
+ {ok, Handle1} -> put({Ref, fhc_handle}, Handle1),
+ false;
+ _ -> Rep
end;
- false -> ok
+ false -> Rep
end;
- (_KeyValuePair) ->
- ok
- end, get()),
- report_eldest().
+ (_KeyValuePair, Rep) ->
+ Rep
+ end, true, get()),
+ case Report of
+ true -> report_eldest();
+ false -> ok
+ end.
decrement() ->
gen_server2:cast(?SERVER, decrement).
@@ -323,7 +328,7 @@ report_eldest() ->
case gb_trees:is_empty(Tree) of
true -> Tree;
false -> {Oldest, _Ref} = gb_trees:smallest(Tree),
- gen_server2:cast(?SERVER, {self(), update, Oldest})
+ gen_server2:cast(?SERVER, {update, self(), Oldest})
end,
Tree
end),
@@ -441,7 +446,7 @@ open1(Path, Mode, Options, Ref, Offset) ->
Tree1 = gb_trees:insert(Now, Ref, Tree),
{Oldest, _Ref} = gb_trees:smallest(Tree1),
gen_server2:cast(?SERVER,
- {self(), open, Oldest}),
+ {open, self(), Oldest}),
Tree1
end),
{ok, Handle1};
@@ -474,7 +479,7 @@ close1(Ref, Handle, SoftOrHard) ->
Oldest1
end,
gen_server2:cast(
- ?SERVER, {self(), close, Oldest}),
+ ?SERVER, {close, self(), Oldest}),
Tree1
end)
end,
@@ -571,20 +576,20 @@ init([]) ->
handle_call(_Msg, _From, State) ->
{reply, message_not_understood, State}.
-handle_cast({Pid, open, EldestUnusedSince}, State =
+handle_cast({open, Pid, EldestUnusedSince}, State =
#fhc_state { elders = Elders, count = Count }) ->
Elders1 = dict:store(Pid, EldestUnusedSince, Elders),
{noreply, maybe_reduce(State #fhc_state { elders = Elders1,
count = Count + 1 })};
-handle_cast({Pid, update, EldestUnusedSince}, State =
+handle_cast({update, Pid, EldestUnusedSince}, State =
#fhc_state { elders = Elders }) ->
Elders1 = dict:store(Pid, EldestUnusedSince, Elders),
%% don't call maybe_reduce from here otherwise we can create a
%% storm of messages
{noreply, State #fhc_state { elders = Elders1 }};
-handle_cast({Pid, close, EldestUnusedSince}, State =
+handle_cast({close, Pid, EldestUnusedSince}, State =
#fhc_state { elders = Elders, count = Count }) ->
Elders1 = case EldestUnusedSince of
undefined -> dict:erase(Pid, Elders);
@@ -625,11 +630,15 @@ maybe_reduce(State = #fhc_state { limit = Limit, count = Count,
{[Pid|PidsAcc], SumAcc + timer:now_diff(Now, Eldest),
CountAcc + 1}
end, {[], 0, 0}, Elders),
- %% ClientCount can't be 0.
- AverageAge = Sum / ClientCount,
- lists:foreach(fun (Pid) ->
- Pid ! {?MODULE, maximum_eldest_since_use, AverageAge}
- end, Pids),
+ case Pids of
+ [] -> ok;
+ _ ->
+ %% ClientCount can't be 0 if we have some pids
+ AverageAge = Sum / ClientCount,
+ lists:foreach(
+ fun (Pid) -> Pid ! {?MODULE, maximum_eldest_since_use, AverageAge}
+ end, Pids)
+ end,
{ok, _TRef} = timer:apply_after(?FILE_HANDLES_CHECK_INTERVAL, gen_server2,
cast, [?SERVER, check_counts]),
State;