diff options
| -rw-r--r-- | Makefile | 13 | ||||
| -rw-r--r-- | codegen.py | 25 | ||||
| -rw-r--r-- | src/vm_memory_monitor.erl | 83 |
3 files changed, 62 insertions, 59 deletions
@@ -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) -> |
