summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile13
-rw-r--r--codegen.py25
-rw-r--r--src/vm_memory_monitor.erl83
3 files changed, 62 insertions, 59 deletions
diff --git a/Makefile b/Makefile
index a16a592652..cfbe3daca2 100644
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,20 @@ TARGETS=$(EBIN_DIR)/rabbit.app $(BEAM_TARGETS)
WEB_URL=http://stage.rabbitmq.com/
MANPAGES=$(patsubst %.pod, %.gz, $(wildcard docs/*.[0-9].pod))
+ifeq ($(shell python -c 'import simplejson' 2>/dev/null && echo yes),yes)
PYTHON=python
+else
+ifeq ($(shell python2.6 -c 'import simplejson' 2>/dev/null && echo yes),yes)
+PYTHON=python2.6
+else
+ifeq ($(shell python2.5 -c 'import simplejson' 2>/dev/null && echo yes),yes)
+PYTHON=python2.5
+else
+# Hmm. Missing simplejson?
+PYTHON=python
+endif
+endif
+endif
BASIC_PLT=basic.plt
RABBIT_PLT=rabbit.plt
diff --git a/codegen.py b/codegen.py
index 52c45a958c..3608f4c200 100644
--- a/codegen.py
+++ b/codegen.py
@@ -244,19 +244,10 @@ def genErl(spec):
print 'lookup_amqp_exception(%s) -> {%s, ?%s, <<"%s">>};' % \
(n.lower(), hardErrorBoolStr, n, n)
- def genIsAmqpHardErrorCode(c,v,cls):
- mCls = messageConstantClass(cls)
- if mCls == 'SOFT_ERROR' : genIsAmqpHardErrorCode1(c,'false')
- elif mCls == 'HARD_ERROR' : genIsAmqpHardErrorCode1(c,'true')
- elif mCls == '' : pass
- else: raise 'Unkown constant class', cls
-
- def genIsAmqpHardErrorCode1(c,hardErrorBoolStr):
+ def genAmqpException(c,v,cls):
n = erlangConstantName(c)
- print 'is_amqp_hard_error_code(?%s) -> %s;' % \
- (n, hardErrorBoolStr)
- print 'is_amqp_hard_error_code(%s) -> %s;' % \
- (n.lower(), hardErrorBoolStr)
+ print 'amqp_exception(?%s) -> %s;' % \
+ (n, n.lower())
methods = spec.allMethods()
@@ -274,7 +265,7 @@ def genErl(spec):
-export([encode_method_fields/1]).
-export([encode_properties/1]).
-export([lookup_amqp_exception/1]).
--export([is_amqp_hard_error_code/1]).
+-export([amqp_exception/1]).
bitvalue(true) -> 1;
bitvalue(false) -> 0;
@@ -313,12 +304,8 @@ bitvalue(undefined) -> 0.
print " rabbit_log:warning(\"Unknown AMQP error code '~p'~n\", [Code]),"
print " {true, ?INTERNAL_ERROR, <<\"INTERNAL_ERROR\">>}."
- for(c,v,cls) in spec.constants: genIsAmqpHardErrorCode(c,v,cls)
- print "is_amqp_hard_error_code(Code) when is_integer(Code) ->"
- print " true;"
- print "is_amqp_hard_error_code(Code) ->"
- print " rabbit_log:warning(\"Unknown AMQP error code '~p'~n\", [Code]),"
- print " true."
+ for(c,v,cls) in spec.constants: genAmqpException(c,v,cls)
+ print "amqp_exception(_Code) -> undefined."
def genHrl(spec):
def erlType(domain):
diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl
index 6da47933a4..8be28f523d 100644
--- a/src/vm_memory_monitor.erl
+++ b/src/vm_memory_monitor.erl
@@ -34,7 +34,7 @@
%% has a single process that's consuming all memory. In such a case,
%% during garbage collection, Erlang tries to allocate a huge chunk of
%% continuous memory, which can result in a crash or heavy swapping.
-%%
+%%
%% This module tries to warn Rabbit before such situations occur, so
%% that it has a higher chance to avoid running out of memory.
%%
@@ -42,7 +42,7 @@
-module(vm_memory_monitor).
--behaviour(gen_server2).
+-behaviour(gen_server).
-export([start_link/1]).
@@ -73,9 +73,10 @@
-ifdef(use_specs).
--spec(start_link/1 :: (float()) -> ('ignore' | {error, any()} | {'ok', pid()})).
+-spec(start_link/1 :: (float()) ->
+ ('ignore' | {'error', any()} | {'ok', pid()})).
-spec(update/0 :: () -> 'ok').
--spec(get_total_memory/0 :: () -> (non_neg_integer() | unknown)).
+-spec(get_total_memory/0 :: () -> (non_neg_integer() | 'unknown')).
-spec(get_check_interval/0 :: () -> non_neg_integer()).
-spec(set_check_interval/1 :: (non_neg_integer()) -> 'ok').
-spec(get_vm_memory_high_watermark/0 :: () -> float()).
@@ -85,25 +86,48 @@
%%----------------------------------------------------------------------------
+%% Public API
+%%----------------------------------------------------------------------------
+
+update() ->
+ gen_server:cast(?SERVER, update).
+
+get_total_memory() ->
+ get_total_memory(os:type()).
+
+get_check_interval() ->
+ gen_server:call(?MODULE, get_check_interval).
+
+set_check_interval(Fraction) ->
+ gen_server:call(?MODULE, {set_check_interval, Fraction}).
+
+get_vm_memory_high_watermark() ->
+ gen_server:call(?MODULE, get_vm_memory_high_watermark).
+
+set_vm_memory_high_watermark(Fraction) ->
+ gen_server:call(?MODULE, {set_vm_memory_high_watermark, Fraction}).
+
+%%----------------------------------------------------------------------------
%% gen_server callbacks
%%----------------------------------------------------------------------------
start_link(Args) ->
- gen_server2:start_link({local, ?SERVER}, ?MODULE, [Args], []).
+ gen_server:start_link({local, ?SERVER}, ?MODULE, [Args], []).
-init([MemFraction]) ->
+init([MemFraction]) ->
TotalMemory =
case get_total_memory() of
unknown ->
- rabbit_log:warning(
+ error_logger:warning_msg(
"Unknown total memory size for your OS ~p. "
- "Assuming memory size is ~pMB.~n",
+ "Assuming memory size is ~pMB.~n",
[os:type(), trunc(?MEMORY_SIZE_FOR_UNKNOWN_OS/1048576)]),
?MEMORY_SIZE_FOR_UNKNOWN_OS;
M -> M
end,
MemLimit = get_mem_limit(MemFraction, TotalMemory),
- rabbit_log:info("Memory limit set to ~pMB.~n", [trunc(MemLimit/1048576)]),
+ error_logger:info_msg("Memory limit set to ~pMB.~n",
+ [trunc(MemLimit/1048576)]),
TRef = start_timer(?DEFAULT_MEMORY_CHECK_INTERVAL),
State = #state { total_memory = TotalMemory,
memory_limit = MemLimit,
@@ -117,8 +141,8 @@ handle_call(get_vm_memory_high_watermark, _From, State) ->
handle_call({set_vm_memory_high_watermark, MemFraction}, _From, State) ->
MemLimit = get_mem_limit(MemFraction, State#state.total_memory),
- rabbit_log:info("Memory alarm changed to ~p, ~p bytes.~n",
- [MemFraction, MemLimit]),
+ error_logger:info_msg("Memory alarm changed to ~p, ~p bytes.~n",
+ [MemFraction, MemLimit]),
{reply, ok, State#state{memory_limit = MemLimit}};
handle_call(get_check_interval, _From, State) ->
@@ -134,41 +158,19 @@ handle_call(_Request, _From, State) ->
handle_cast(update, State) ->
{noreply, internal_update(State)};
-handle_cast(_Request, State) ->
+handle_cast(_Request, State) ->
{noreply, State}.
-handle_info(_Info, State) ->
+handle_info(_Info, State) ->
{noreply, State}.
-terminate(_Reason, _State) ->
+terminate(_Reason, _State) ->
ok.
-code_change(_OldVsn, State, _Extra) ->
+code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%----------------------------------------------------------------------------
-%% Public API
-%%----------------------------------------------------------------------------
-
-update() ->
- gen_server2:cast(?SERVER, update).
-
-get_total_memory() ->
- get_total_memory(os:type()).
-
-get_check_interval() ->
- gen_server2:call(?MODULE, get_check_interval).
-
-set_check_interval(Fraction) ->
- gen_server2:call(?MODULE, {set_check_interval, Fraction}).
-
-get_vm_memory_high_watermark() ->
- gen_server2:call(?MODULE, get_vm_memory_high_watermark).
-
-set_vm_memory_high_watermark(Fraction) ->
- gen_server2:call(?MODULE, {set_vm_memory_high_watermark, Fraction}).
-
-%%----------------------------------------------------------------------------
%% Server Internals
%%----------------------------------------------------------------------------
@@ -189,8 +191,9 @@ internal_update(State = #state { memory_limit = MemLimit,
State #state {alarmed = NewAlarmed}.
emit_update_info(State, MemUsed, MemLimit) ->
- rabbit_log:info("vm_memory_high_watermark ~p. Memory used:~p allowed:~p~n",
- [State, MemUsed, MemLimit]).
+ error_logger:info_msg(
+ "vm_memory_high_watermark ~p. Memory used:~p allowed:~p~n",
+ [State, MemUsed, MemLimit]).
start_timer(Timeout) ->
{ok, TRef} = timer:apply_interval(Timeout, ?MODULE, update, []),
@@ -202,7 +205,7 @@ get_vm_limit() ->
case erlang:system_info(wordsize) of
4 -> 4294967296; %% 4 GB for 32 bits 2^32
8 -> 281474976710656 %% 256 TB for 64 bits 2^48
- %% http://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details
+ %%http://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details
end.
get_mem_limit(MemFraction, TotalMemory) ->