diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-07-02 16:29:13 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-07-02 16:29:13 +0100 |
| commit | 9c1c368264f6845e36e710180291202290ac4b35 (patch) | |
| tree | dc8a69e5d66fdaffb100d357a9e4da46fbbd1e06 /src | |
| parent | 2de81da3082a0f9010c7e89001ea3df91d21da84 (diff) | |
| download | rabbitmq-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.erl | 27 |
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}}) -> |
