diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2010-08-16 11:28:29 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-08-16 11:28:29 +0100 |
commit | 2d9da1b6e17f128c72267ab24057a197cba3827b (patch) | |
tree | b7f529189b9569851ade54e625d7d423538b8ac9 | |
parent | 8ccf027aee330024c6c626d485798fc796a6dd6e (diff) | |
parent | adecc52af9911849b642c2128af996c8f39ef532 (diff) | |
download | rabbitmq-server-2d9da1b6e17f128c72267ab24057a197cba3827b.tar.gz |
Merging default into bug 23132
-rw-r--r-- | src/file_handle_cache.erl | 38 |
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 }) |