summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-11-06 12:33:56 +0000
committerSimon MacMullen <simon@rabbitmq.com>2012-11-06 12:33:56 +0000
commit0444acb2f8966bbbb6a8f0270a3a364151ac94ae (patch)
treec5caad92f9bbee55723bdcb85f93ca7a7b7cc485
parent4c1f1e0e5999b6030548902545da7384a0ab61f2 (diff)
downloadrabbitmq-server-0444acb2f8966bbbb6a8f0270a3a364151ac94ae.tar.gz
GC the world when memory alarm goes off.
-rw-r--r--src/rabbit_alarm.erl11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl
index e6625b2b..7b706bd8 100644
--- a/src/rabbit_alarm.erl
+++ b/src/rabbit_alarm.erl
@@ -18,7 +18,7 @@
-behaviour(gen_event).
--export([start_link/0, start/0, stop/0, register/2, set_alarm/1,
+-export([start_link/0, start/0, stop/0, register/2, set_alarm/1, set_alarm_gc/1,
clear_alarm/1, get_alarms/0, on_node_up/1, on_node_down/1]).
-export([init/1, handle_call/2, handle_event/2, handle_info/2,
@@ -38,6 +38,7 @@
-spec(start/0 :: () -> 'ok').
-spec(stop/0 :: () -> 'ok').
-spec(register/2 :: (pid(), rabbit_types:mfargs()) -> boolean()).
+-spec(set_alarm_gc/1 :: (any()) -> 'ok').
-spec(set_alarm/1 :: (any()) -> 'ok').
-spec(clear_alarm/1 :: (any()) -> 'ok').
-spec(on_node_up/1 :: (node()) -> 'ok').
@@ -55,7 +56,7 @@ start() ->
ok = gen_event:add_handler(?SERVER, ?MODULE, []),
{ok, MemoryWatermark} = application:get_env(vm_memory_high_watermark),
rabbit_sup:start_restartable_child(
- vm_memory_monitor, [MemoryWatermark, fun rabbit_alarm:set_alarm/1,
+ vm_memory_monitor, [MemoryWatermark, fun rabbit_alarm:set_alarm_gc/1,
fun rabbit_alarm:clear_alarm/1]),
{ok, DiskLimit} = application:get_env(disk_free_limit),
rabbit_sup:start_restartable_child(rabbit_disk_monitor, [DiskLimit]),
@@ -67,8 +68,10 @@ register(Pid, HighMemMFA) ->
gen_event:call(?SERVER, ?MODULE, {register, Pid, HighMemMFA},
infinity).
-set_alarm(Alarm) -> gen_event:notify(?SERVER, {set_alarm, Alarm}).
-clear_alarm(Alarm) -> gen_event:notify(?SERVER, {clear_alarm, Alarm}).
+set_alarm_gc(Alarm) -> [erlang:garbage_collect(P) || P <- processes()],
+ set_alarm(Alarm).
+set_alarm(Alarm) -> gen_event:notify(?SERVER, {set_alarm, Alarm}).
+clear_alarm(Alarm) -> gen_event:notify(?SERVER, {clear_alarm, Alarm}).
get_alarms() -> gen_event:call(?SERVER, ?MODULE, get_alarms, infinity).