summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-17 12:44:00 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-17 12:44:00 +0100
commit75dbcf5a4d97f568d1e2db4fb8ffaf88f876c1d2 (patch)
tree5306864caaabb45beea6e1dc6d7183f4bfeb299d
parentb99edb893e39ac72d8796611952ec74c36ad7e6b (diff)
downloadrabbitmq-server-git-75dbcf5a4d97f568d1e2db4fb8ffaf88f876c1d2.tar.gz
Make sure the queue mode mananger can never tell a queue to go back to mixed mode when memory alarms are going off
-rw-r--r--src/rabbit_queue_mode_manager.erl24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/rabbit_queue_mode_manager.erl b/src/rabbit_queue_mode_manager.erl
index 1ab5e7a894..22d858673a 100644
--- a/src/rabbit_queue_mode_manager.erl
+++ b/src/rabbit_queue_mode_manager.erl
@@ -39,7 +39,7 @@
terminate/2, code_change/3]).
-export([register/5, report_memory/3, report_memory/5, info/0,
- pin_to_disk/1, unpin_from_disk/1]).
+ pin_to_disk/1, unpin_from_disk/1, conserve_memory/2]).
-define(TOTAL_TOKENS, 10000000).
-define(ACTIVITY_THRESHOLD, 25).
@@ -58,6 +58,8 @@
'ok').
-spec(pin_to_disk/1 :: (pid()) -> 'ok').
-spec(unpin_from_disk/1 :: (pid()) -> 'ok').
+-spec(info/0 :: () -> [{atom(), any()}]).
+-spec(conserve_memory/2 :: (pid(), bool()) -> 'ok').
-endif.
@@ -68,7 +70,8 @@
lowrate,
hibernate,
disk_mode_pins,
- unevictable
+ unevictable,
+ alarmed
}).
%% Token-credit based memory management
@@ -171,8 +174,12 @@ report_memory(Pid, Memory, Gain, Loss, Hibernating) ->
info() ->
gen_server2:call(?SERVER, info).
+conserve_memory(_Pid, Conserve) ->
+ gen_server2:pcast(?SERVER, 9, {conserve_memory, Conserve}).
+
init([]) ->
process_flag(trap_exit, true),
+ rabbit_alarm:register(self(), {?MODULE, conserve_memory, []}),
%% todo, fix up this call as os_mon may not be running
{MemTotal, MemUsed, _BigProc} = memsup:get_memory_data(),
MemAvail = MemTotal - MemUsed,
@@ -183,7 +190,8 @@ init([]) ->
lowrate = priority_queue:new(),
hibernate = queue:new(),
disk_mode_pins = sets:new(),
- unevictable = sets:new()
+ unevictable = sets:new(),
+ alarmed = false
}}.
handle_call({pin_to_disk, Pid}, _From,
@@ -236,7 +244,8 @@ handle_cast({report_memory, Pid, Memory, BytesGained, BytesLost, Hibernating},
available_tokens = Avail,
callbacks = Callbacks,
disk_mode_pins = Pins,
- tokens_per_byte = TPB }) ->
+ tokens_per_byte = TPB,
+ alarmed = Alarmed }) ->
Req = rabbit_misc:ceil(TPB * Memory),
LowRate = case {BytesGained, BytesLost} of
{undefined, _} -> false;
@@ -269,7 +278,7 @@ handle_cast({report_memory, Pid, Memory, BytesGained, BytesLost, Hibernating},
MixedActivity}
end;
disk ->
- case sets:is_element(Pid, Pins) of
+ case sets:is_element(Pid, Pins) orelse Alarmed of
true ->
{State, disk};
false ->
@@ -313,7 +322,10 @@ handle_cast({register, Pid, IsUnevictable, Module, Function, Args},
{noreply, State #state { callbacks = dict:store
(Pid, {Module, Function, Args}, Callbacks),
unevictable = Unevictable1
- }}.
+ }};
+
+handle_cast({conserve_memory, Conserve}, State) ->
+ {noreply, State #state { alarmed = Conserve }}.
handle_info({'DOWN', _MRef, process, Pid, _Reason},
State = #state { available_tokens = Avail,