summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-08-16 11:28:29 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-08-16 11:28:29 +0100
commit2d9da1b6e17f128c72267ab24057a197cba3827b (patch)
treeb7f529189b9569851ade54e625d7d423538b8ac9
parent8ccf027aee330024c6c626d485798fc796a6dd6e (diff)
parentadecc52af9911849b642c2128af996c8f39ef532 (diff)
downloadrabbitmq-server-2d9da1b6e17f128c72267ab24057a197cba3827b.tar.gz
Merging default into bug 23132
-rw-r--r--src/file_handle_cache.erl38
1 files changed, 20 insertions, 18 deletions
diff --git a/src/file_handle_cache.erl b/src/file_handle_cache.erl
index 8db5a794..f026c83f 100644
--- a/src/file_handle_cache.erl
+++ b/src/file_handle_cache.erl
@@ -534,7 +534,7 @@ age_tree_insert(Now, Ref) ->
fun (Tree) ->
Tree1 = gb_trees:insert(Now, Ref, Tree),
{Oldest, _Ref} = gb_trees:smallest(Tree1),
- gen_server:cast(?SERVER, {open, self(), Oldest}),
+ gen_server:call(?SERVER, {open, self(), Oldest}, infinity),
Tree1
end).
@@ -575,6 +575,8 @@ open1(Path, Mode, Options, Ref, Offset, NewOrReopen) ->
new -> Mode;
reopen -> [read | Mode]
end,
+ Now = now(),
+ age_tree_insert(Now, Ref),
case file:open(Path, Mode1) of
{ok, Hdl} ->
WriteBufferSize =
@@ -583,7 +585,6 @@ open1(Path, Mode, Options, Ref, Offset, NewOrReopen) ->
infinity -> infinity;
N when is_integer(N) -> N
end,
- Now = now(),
Handle = #handle { hdl = Hdl,
offset = 0,
trusted_offset = 0,
@@ -601,9 +602,9 @@ open1(Path, Mode, Options, Ref, Offset, NewOrReopen) ->
{{ok, Offset1}, Handle1} = maybe_seek(Offset, Handle),
Handle2 = Handle1 #handle { trusted_offset = Offset1 },
put({Ref, fhc_handle}, Handle2),
- age_tree_insert(Now, Ref),
{ok, Handle2};
{error, Reason} ->
+ age_tree_delete(Now),
{error, Reason}
end.
@@ -714,14 +715,13 @@ init([]) ->
obtains = [], callbacks = dict:new(),
client_mrefs = dict:new(), timer_ref = undefined }}.
-handle_call(obtain, From, State = #fhc_state { count = Count }) ->
- State1 = #fhc_state { count = Count1, limit = Limit, obtains = Obtains } =
- maybe_reduce(State #fhc_state { count = Count + 1 }),
- case Limit /= infinity andalso Count1 >= Limit of
- true -> {noreply, State1 #fhc_state { obtains = [From | Obtains],
- count = Count1 - 1 }};
- false -> {reply, ok, State1}
- end.
+handle_call(obtain, From, State) ->
+ add_obtains(From, State);
+
+handle_call({open, Pid, EldestUnusedSince}, From, State =
+ #fhc_state { elders = Elders }) ->
+ Elders1 = dict:store(Pid, EldestUnusedSince, Elders),
+ add_obtains(From, ensure_mref(Pid, State #fhc_state { elders = Elders1 })).
handle_cast({register_callback, Pid, MFA},
State = #fhc_state { callbacks = Callbacks }) ->
@@ -729,13 +729,6 @@ handle_cast({register_callback, Pid, MFA},
Pid, State #fhc_state {
callbacks = dict:store(Pid, MFA, Callbacks) })};
-handle_cast({open, Pid, EldestUnusedSince}, State =
- #fhc_state { elders = Elders, count = Count }) ->
- Elders1 = dict:store(Pid, EldestUnusedSince, Elders),
- {noreply, maybe_reduce(
- ensure_mref(Pid, State #fhc_state { elders = Elders1,
- count = Count + 1 }))};
-
handle_cast({update, Pid, EldestUnusedSince}, State =
#fhc_state { elders = Elders }) ->
Elders1 = dict:store(Pid, EldestUnusedSince, Elders),
@@ -782,6 +775,15 @@ code_change(_OldVsn, State, _Extra) ->
%% server helpers
%%----------------------------------------------------------------------------
+add_obtains(From, State = #fhc_state { count = Count }) ->
+ State1 = #fhc_state { count = Count1, limit = Limit, obtains = Obtains } =
+ maybe_reduce(State #fhc_state { count = Count + 1 }),
+ case Limit /= infinity andalso Count1 >= Limit of
+ true -> {noreply, State1 #fhc_state { obtains = [From | Obtains],
+ count = Count1 - 1 }};
+ false -> {reply, ok, State1}
+ end.
+
process_obtains(State = #fhc_state { obtains = [] }) ->
State;
process_obtains(State = #fhc_state { limit = Limit, count = Count })