summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <jean-sebastien.pedron@dumbbell.fr>2015-10-23 12:10:07 +0200
committerJean-Sébastien Pédron <jean-sebastien.pedron@dumbbell.fr>2015-10-23 12:10:07 +0200
commit9b248462c68c4e91713059681c2b554ccc754e94 (patch)
tree69b11ee16ce7c1577a758852dd2c25e627dba31a /src
parentea9e299e912f0e44a073feffcfab6c5a6de19846 (diff)
parentad461b30e9c0104277dff7ec937354d1fc1e64d5 (diff)
downloadrabbitmq-server-git-9b248462c68c4e91713059681c2b554ccc754e94.tar.gz
Merge branch 'master' into erlang.mk
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_amqqueue_process.erl5
-rw-r--r--src/rabbit_control_main.erl6
-rw-r--r--src/vm_memory_monitor.erl28
3 files changed, 28 insertions, 11 deletions
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index 15fde37c9c..452047fdb2 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -92,7 +92,8 @@
durable,
auto_delete,
arguments,
- owner_pid
+ owner_pid,
+ exclusive
]).
-define(INFO_KEYS, [pid | ?CREATION_EVENT_KEYS ++ ?STATISTICS_KEYS -- [name]]).
@@ -828,6 +829,8 @@ i(owner_pid, #q{q = #amqqueue{exclusive_owner = none}}) ->
'';
i(owner_pid, #q{q = #amqqueue{exclusive_owner = ExclusiveOwner}}) ->
ExclusiveOwner;
+i(exclusive, #q{q = #amqqueue{exclusive_owner = ExclusiveOwner}}) ->
+ is_pid(ExclusiveOwner);
i(policy, #q{q = Q}) ->
case rabbit_policy:name(Q) of
none -> '';
diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl
index fe0563bbc7..59223dc19b 100644
--- a/src/rabbit_control_main.erl
+++ b/src/rabbit_control_main.erl
@@ -410,6 +410,12 @@ action(set_vm_memory_high_watermark, Node, [Arg], _Opts, Inform) ->
Inform("Setting memory threshold on ~p to ~p", [Node, Frac]),
rpc_call(Node, vm_memory_monitor, set_vm_memory_high_watermark, [Frac]);
+action(set_vm_memory_high_watermark, Node, ["absolute", Arg], _Opts, Inform) ->
+ Limit = list_to_integer(Arg),
+ Inform("Setting memory threshold on ~p to ~pMB", [Node, Limit]),
+ rpc_call(Node, vm_memory_monitor, set_vm_memory_high_watermark,
+ [{absolute, Limit}]);
+
action(set_permissions, Node, [Username, CPerm, WPerm, RPerm], Opts, Inform) ->
VHost = proplists:get_value(?VHOST_OPT, Opts),
Inform("Setting permissions for user \"~s\" in vhost \"~s\"",
diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl
index bf9a77c174..fe68f50239 100644
--- a/src/vm_memory_monitor.erl
+++ b/src/vm_memory_monitor.erl
@@ -52,7 +52,7 @@
-record(state, {total_memory,
memory_limit,
- memory_fraction,
+ memory_config_limit,
timeout,
timer,
alarmed,
@@ -63,6 +63,7 @@
-ifdef(use_specs).
+-type(vm_memory_high_watermark() :: (float() | {'absolute', integer()})).
-spec(start_link/1 :: (float()) -> rabbit_types:ok_pid_or_error()).
-spec(start_link/3 :: (float(), fun ((any()) -> 'ok'),
fun ((any()) -> 'ok')) -> rabbit_types:ok_pid_or_error()).
@@ -70,8 +71,8 @@
-spec(get_vm_limit/0 :: () -> non_neg_integer()).
-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()).
--spec(set_vm_memory_high_watermark/1 :: (float()) -> 'ok').
+-spec(get_vm_memory_high_watermark/0 :: () -> vm_memory_high_watermark()).
+-spec(set_vm_memory_high_watermark/1 :: (vm_memory_high_watermark()) -> 'ok').
-spec(get_memory_limit/0 :: () -> non_neg_integer()).
-endif.
@@ -128,11 +129,12 @@ init([MemFraction, AlarmFuns]) ->
alarm_funs = AlarmFuns },
{ok, set_mem_limits(State, MemFraction)}.
-handle_call(get_vm_memory_high_watermark, _From, State) ->
- {reply, State#state.memory_fraction, State};
+handle_call(get_vm_memory_high_watermark, _From,
+ #state{memory_config_limit = MemLimit} = State) ->
+ {reply, MemLimit, State};
-handle_call({set_vm_memory_high_watermark, MemFraction}, _From, State) ->
- {reply, ok, set_mem_limits(State, MemFraction)};
+handle_call({set_vm_memory_high_watermark, MemLimit}, _From, State) ->
+ {reply, ok, set_mem_limits(State, MemLimit)};
handle_call(get_check_interval, _From, State) ->
{reply, State#state.timeout, State};
@@ -166,7 +168,7 @@ code_change(_OldVsn, State, _Extra) ->
%% Server Internals
%%----------------------------------------------------------------------------
-set_mem_limits(State, MemFraction) ->
+set_mem_limits(State, MemLimit) ->
case erlang:system_info(wordsize) of
4 ->
error_logger:warning_msg(
@@ -206,12 +208,18 @@ set_mem_limits(State, MemFraction) ->
_ ->
TotalMemory
end,
- MemLim = trunc(MemFraction * UsableMemory),
+ MemLim = interpret_limit(MemLimit, UsableMemory),
error_logger:info_msg("Memory limit set to ~pMB of ~pMB total.~n",
[trunc(MemLim/?ONE_MB), trunc(TotalMemory/?ONE_MB)]),
internal_update(State #state { total_memory = TotalMemory,
memory_limit = MemLim,
- memory_fraction = MemFraction}).
+ memory_config_limit = MemLimit}).
+
+interpret_limit({'absolute', MemLim}, UsableMemory) ->
+ %% Absolute memory is provided in MB
+ min(MemLim * ?ONE_MB, UsableMemory);
+interpret_limit(MemFraction, UsableMemory) ->
+ trunc(MemFraction * UsableMemory).
internal_update(State = #state { memory_limit = MemLimit,
alarmed = Alarmed,