summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-07-02 16:29:13 +0100
committerMatthew Sackman <matthew@lshift.net>2009-07-02 16:29:13 +0100
commit9c1c368264f6845e36e710180291202290ac4b35 (patch)
treedc8a69e5d66fdaffb100d357a9e4da46fbbd1e06 /src
parent2de81da3082a0f9010c7e89001ea3df91d21da84 (diff)
downloadrabbitmq-server-git-9c1c368264f6845e36e710180291202290ac4b35.tar.gz
Sorted out the timer versus hibernate binary backoff. The trick is to use apply_after, not apply interval, and then after reporting memory use, don't set a new timer going (but do set a new timer going on every other message (other than timeouts)). This means that if nothing is going on, after a memory report, the process can wait as long as it needs to before the hibernate timeout fires.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_amqqueue_process.erl27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index e847b34c6c..bac7cfb57e 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -134,18 +134,24 @@ code_change(_OldVsn, State, _Extra) ->
%%----------------------------------------------------------------------------
reply(Reply, NewState = #q { memory_report_timer = undefined }) ->
- reply(Reply, start_memory_timer(NewState));
-reply(Reply, NewState = #q { hibernated_at = undefined }) ->
- {reply, Reply, NewState, NewState #q.hibernate_after};
+ reply1(Reply, start_memory_timer(NewState));
reply(Reply, NewState) ->
+ reply1(Reply, NewState).
+
+reply1(Reply, NewState = #q { hibernated_at = undefined }) ->
+ {reply, Reply, NewState, NewState #q.hibernate_after};
+reply1(Reply, NewState) ->
NewState1 = adjust_hibernate_after(NewState),
{reply, Reply, NewState1, NewState1 #q.hibernate_after}.
noreply(NewState = #q { memory_report_timer = undefined }) ->
- noreply(start_memory_timer(NewState));
-noreply(NewState = #q { hibernated_at = undefined }) ->
- {noreply, NewState, NewState #q.hibernate_after};
+ noreply1(start_memory_timer(NewState));
noreply(NewState) ->
+ noreply1(NewState).
+
+noreply1(NewState = #q { hibernated_at = undefined }) ->
+ {noreply, NewState, NewState #q.hibernate_after};
+noreply1(NewState) ->
NewState1 = adjust_hibernate_after(NewState),
{noreply, NewState1, NewState1 #q.hibernate_after}.
@@ -174,8 +180,8 @@ adjust_hibernate_after(State = #q { hibernated_at = Then,
end.
start_memory_timer() ->
- {ok, TRef} = timer:apply_interval(?MEMORY_REPORT_TIME_INTERVAL,
- rabbit_amqqueue, report_memory, [self()]),
+ {ok, TRef} = timer:apply_after(?MEMORY_REPORT_TIME_INTERVAL,
+ rabbit_amqqueue, report_memory, [self()]),
TRef.
start_memory_timer(State = #q { memory_report_timer = undefined }) ->
State #q { memory_report_timer = start_memory_timer() };
@@ -597,7 +603,8 @@ report_memory(State = #q { mixed_state = MS }) ->
N -> N
end,
rabbit_queue_mode_manager:report_memory(self(), NewMem, Gain, Loss),
- State #q { mixed_state = rabbit_mixed_queue:reset_counters(MS) }.
+ State #q { mixed_state = rabbit_mixed_queue:reset_counters(MS),
+ memory_report_timer = undefined }.
%---------------------------------------------------------------------------
@@ -874,7 +881,7 @@ handle_cast({set_mode, Mode}, State = #q { mixed_state = MS }) ->
noreply(State #q { mixed_state = MS1 });
handle_cast(report_memory, State) ->
- noreply(report_memory(State)).
+ noreply1(report_memory(State)).
handle_info({'DOWN', MonitorRef, process, DownPid, _Reason},
State = #q{owner = {DownPid, MonitorRef}}) ->