summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-19 12:15:49 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-19 12:15:49 +0100
commit9d440e33f9c96964882b8edc0680c7ce0191d6fc (patch)
tree8491f696c690b6d48ba1b0d7f91f0b5102352b8e
parent9966edcaf16691ebf7b22b0e39f11bfa186cd676 (diff)
parent0e42a1034669fb112f66d4e2a8d6198f39b3a100 (diff)
downloadrabbitmq-server-git-9d440e33f9c96964882b8edc0680c7ce0191d6fc.tar.gz
merging in bug20013
-rw-r--r--src/rabbit_memsup.erl30
-rw-r--r--src/rabbit_memsup_darwin.erl36
-rw-r--r--src/rabbit_memsup_linux.erl36
3 files changed, 45 insertions, 57 deletions
diff --git a/src/rabbit_memsup.erl b/src/rabbit_memsup.erl
index 5f24288170..b0d57cb27e 100644
--- a/src/rabbit_memsup.erl
+++ b/src/rabbit_memsup.erl
@@ -44,7 +44,8 @@
timeout,
timer,
mod,
- mod_state
+ mod_state,
+ alarmed
}).
-define(SERVER, memsup). %% must be the same as the standard memsup
@@ -78,8 +79,9 @@ init([Mod]) ->
timeout = ?DEFAULT_MEMORY_CHECK_INTERVAL,
timer = TRef,
mod = Mod,
- mod_state = Mod:update(Fraction, InitState) },
- {ok, State}.
+ mod_state = InitState,
+ alarmed = false },
+ {ok, internal_update(State)}.
start_timer(Timeout) ->
{ok, TRef} = timer:apply_interval(Timeout, ?MODULE, update, []),
@@ -108,10 +110,8 @@ handle_call(get_memory_data, _From,
handle_call(_Request, _From, State) ->
{noreply, State}.
-handle_cast(update, State = #state { memory_fraction = MemoryFraction,
- mod = Mod, mod_state = ModState }) ->
- ModState1 = Mod:update(MemoryFraction, ModState),
- {noreply, State #state { mod_state = ModState1 }};
+handle_cast(update, State) ->
+ {noreply, internal_update(State)};
handle_cast(_Request, State) ->
{noreply, State}.
@@ -124,3 +124,19 @@ terminate(_Reason, _State) ->
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
+
+internal_update(State = #state { memory_fraction = MemoryFraction,
+ alarmed = Alarmed,
+ mod = Mod, mod_state = ModState }) ->
+ ModState1 = Mod:update(ModState),
+ {MemTotal, MemUsed, _BigProc} = Mod:get_memory_data(ModState1),
+ NewAlarmed = MemUsed / MemTotal > MemoryFraction,
+ case {Alarmed, NewAlarmed} of
+ {false, true} ->
+ alarm_handler:set_alarm({system_memory_high_watermark, []});
+ {true, false} ->
+ alarm_handler:clear_alarm(system_memory_high_watermark);
+ _ ->
+ ok
+ end,
+ State #state { mod_state = ModState1, alarmed = NewAlarmed }.
diff --git a/src/rabbit_memsup_darwin.erl b/src/rabbit_memsup_darwin.erl
index 990c5b9966..3de2d8430e 100644
--- a/src/rabbit_memsup_darwin.erl
+++ b/src/rabbit_memsup_darwin.erl
@@ -31,23 +31,21 @@
-module(rabbit_memsup_darwin).
--export([init/0, update/2, get_memory_data/1]).
+-export([init/0, update/1, get_memory_data/1]).
--record(state, {alarmed,
- total_memory,
+-record(state, {total_memory,
allocated_memory}).
%%----------------------------------------------------------------------------
-ifdef(use_specs).
--type(state() :: #state { alarmed :: boolean(),
- total_memory :: ('undefined' | non_neg_integer()),
+-type(state() :: #state { total_memory :: ('undefined' | non_neg_integer()),
allocated_memory :: ('undefined' | non_neg_integer())
}).
-spec(init/0 :: () -> state()).
--spec(update/2 :: (float(), state()) -> state()).
+-spec(update/1 :: (state()) -> state()).
-spec(get_memory_data/1 :: (state()) -> {non_neg_integer(), non_neg_integer(),
('undefined' | pid())}).
@@ -56,32 +54,20 @@
%%----------------------------------------------------------------------------
init() ->
- #state{alarmed = false,
- total_memory = undefined,
+ #state{total_memory = undefined,
allocated_memory = undefined}.
-update(MemoryFraction, State = #state{ alarmed = Alarmed }) ->
+update(State) ->
File = os:cmd("/usr/bin/vm_stat"),
Lines = string:tokens(File, "\n"),
Dict = dict:from_list(lists:map(fun parse_line/1, Lines)),
- PageSize = dict:fetch(page_size, Dict),
- Inactive = dict:fetch('Pages inactive', Dict),
- Active = dict:fetch('Pages active', Dict),
- Free = dict:fetch('Pages free', Dict),
- Wired = dict:fetch('Pages wired down', Dict),
+ [PageSize, Inactive, Active, Free, Wired] =
+ [dict:fetch(Key, Dict) ||
+ Key <- [page_size, 'Pages inactive', 'Pages active', 'Pages free',
+ 'Pages wired down']],
MemTotal = PageSize * (Inactive + Active + Free + Wired),
MemUsed = PageSize * (Active + Wired),
- NewAlarmed = MemUsed / MemTotal > MemoryFraction,
- case {Alarmed, NewAlarmed} of
- {false, true} ->
- alarm_handler:set_alarm({system_memory_high_watermark, []});
- {true, false} ->
- alarm_handler:clear_alarm(system_memory_high_watermark);
- _ ->
- ok
- end,
- State#state{alarmed = NewAlarmed,
- total_memory = MemTotal, allocated_memory = MemUsed}.
+ State#state{total_memory = MemTotal, allocated_memory = MemUsed}.
get_memory_data(State) ->
{State#state.total_memory, State#state.allocated_memory, undefined}.
diff --git a/src/rabbit_memsup_linux.erl b/src/rabbit_memsup_linux.erl
index 460fd88f87..ca942d7caa 100644
--- a/src/rabbit_memsup_linux.erl
+++ b/src/rabbit_memsup_linux.erl
@@ -31,23 +31,21 @@
-module(rabbit_memsup_linux).
--export([init/0, update/2, get_memory_data/1]).
+-export([init/0, update/1, get_memory_data/1]).
--record(state, {alarmed,
- total_memory,
+-record(state, {total_memory,
allocated_memory}).
%%----------------------------------------------------------------------------
-ifdef(use_specs).
--type(state() :: #state { alarmed :: boolean(),
- total_memory :: ('undefined' | non_neg_integer()),
+-type(state() :: #state { total_memory :: ('undefined' | non_neg_integer()),
allocated_memory :: ('undefined' | non_neg_integer())
}).
-spec(init/0 :: () -> state()).
--spec(update/2 :: (float(), state()) -> state()).
+-spec(update/1 :: (state()) -> state()).
-spec(get_memory_data/1 :: (state()) -> {non_neg_integer(), non_neg_integer(),
('undefined' | pid())}).
@@ -56,30 +54,18 @@
%%----------------------------------------------------------------------------
init() ->
- #state{alarmed = false,
- total_memory = undefined,
+ #state{total_memory = undefined,
allocated_memory = undefined}.
-update(MemoryFraction, State = #state { alarmed = Alarmed }) ->
+update(State) ->
File = read_proc_file("/proc/meminfo"),
Lines = string:tokens(File, "\n"),
Dict = dict:from_list(lists:map(fun parse_line/1, Lines)),
- MemTotal = dict:fetch('MemTotal', Dict),
- MemUsed = MemTotal
- - dict:fetch('MemFree', Dict)
- - dict:fetch('Buffers', Dict)
- - dict:fetch('Cached', Dict),
- NewAlarmed = MemUsed / MemTotal > MemoryFraction,
- case {Alarmed, NewAlarmed} of
- {false, true} ->
- alarm_handler:set_alarm({system_memory_high_watermark, []});
- {true, false} ->
- alarm_handler:clear_alarm(system_memory_high_watermark);
- _ ->
- ok
- end,
- State#state{alarmed = NewAlarmed,
- total_memory = MemTotal, allocated_memory = MemUsed}.
+ [MemTotal, MemFree, Buffers, Cached] =
+ [dict:fetch(Key, Dict) ||
+ Key <- ['MemTotal', 'MemFree', 'Buffers', 'Cached']],
+ MemUsed = MemTotal - MemFree - Buffers - Cached,
+ State#state{total_memory = MemTotal, allocated_memory = MemUsed}.
get_memory_data(State) ->
{State#state.total_memory, State#state.allocated_memory, undefined}.