summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2015-12-09 08:04:29 -0800
committerMichael Klishin <michael@clojurewerkz.org>2015-12-09 08:04:29 -0800
commit99c68002bfd87e5ee1a08dee0c777832f39f95af (patch)
treebed97fff8666cc204ea6698ad664a16c3c92fa10
parent81834de912bce65f5a3cd9a77b9e137a8cef0570 (diff)
parent497ad281afc4af593e5bfacf53100e3da6cb1c76 (diff)
downloadrabbitmq-server-git-99c68002bfd87e5ee1a08dee0c777832f39f95af.tar.gz
Merge branch 'master' into rabbitmq-server-479
-rw-r--r--Makefile3
-rw-r--r--docs/rabbitmqctl.1.xml34
-rwxr-xr-xscripts/rabbitmq-server-ha.ocf19
-rwxr-xr-xscripts/set_rabbitmq_policy.sh5
-rw-r--r--src/rabbit_control_main.erl26
-rw-r--r--src/rabbit_resource_monitor_misc.erl6
-rw-r--r--src/rabbit_upgrade.erl9
7 files changed, 89 insertions, 13 deletions
diff --git a/Makefile b/Makefile
index 1afbfeec9f..aca411be26 100644
--- a/Makefile
+++ b/Makefile
@@ -262,6 +262,9 @@ $(SOURCE_DIST): $(ERLANG_MK_RECURSIVE_DEPS_LIST)
grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" $@/deps/$$(basename $$dep)/erlang.mk; then \
echo "include ../../erlang.mk" > $@/deps/$$(basename $$dep)/erlang.mk; \
fi; \
+ sed -E -i.bak "s|^[[:blank:]]*include[[:blank:]]+\.\./.*erlang.mk$$|include ../../erlang.mk|" \
+ $@/deps/$$(basename $$dep)/Makefile && \
+ rm $@/deps/$$(basename $$dep)/Makefile.bak; \
if test -f "$$dep/license_info"; then \
cp "$$dep/license_info" "$@/deps/licensing/license_info_$$(basename "$$dep")"; \
cat "$$dep/license_info" >> $@/LICENSE; \
diff --git a/docs/rabbitmqctl.1.xml b/docs/rabbitmqctl.1.xml
index b9e478cb53..fb4959b276 100644
--- a/docs/rabbitmqctl.1.xml
+++ b/docs/rabbitmqctl.1.xml
@@ -1966,8 +1966,8 @@
<listitem><para>
The new memory limit at which flow control is
triggered, expressed in bytes as an integer number
- greater than or equal to 0 or as string with memory unit
- (e.g. 1024MB). Available units are:
+ greater than or equal to 0 or as a string with memory units
+ (e.g. 512M or 1G). Available units are:
k, kiB: kibibytes (2^10 bytes)
M, MiB: mebibytes (2^20)
G, GiB: gibibytes (2^30)
@@ -1979,6 +1979,36 @@
</variablelist>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><cmdsynopsis><command>set_disk_free_limit</command> <arg choice="req"><replaceable>disk_limit</replaceable></arg></cmdsynopsis></term>
+ <listitem>
+ <variablelist>
+ <varlistentry>
+ <term>disk_limit</term>
+ <listitem><para>
+ Lower bound limit as an integer in bytes or a string with memory units (see vm_memory_high_watermark),
+ e.g. 512M or 1G. Once free disk space reaches the limit, a disk alarm will be set.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><cmdsynopsis><command>set_disk_free_limit mem_relative</command> <arg choice="req"><replaceable>fraction</replaceable></arg></cmdsynopsis></term>
+ <listitem>
+ <variablelist>
+ <varlistentry>
+ <term>fraction</term>
+ <listitem><para>
+ Limit relative to the total amount available RAM
+ as a non-negative floating point number.
+ Values lower than 1.0 can be dangerous and
+ should be used carefully.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect2>
</refsect1>
diff --git a/scripts/rabbitmq-server-ha.ocf b/scripts/rabbitmq-server-ha.ocf
index 1e4ebd0f1e..376c661a45 100755
--- a/scripts/rabbitmq-server-ha.ocf
+++ b/scripts/rabbitmq-server-ha.ocf
@@ -13,6 +13,9 @@
#
# See usage() function below for more details ...
#
+# Note that the script uses set_rabbitmq_policy.sh script located in the
+# same directory to setup RabbitMQ policies.
+#
#######################################################################
# Initialization:
@@ -92,6 +95,11 @@ UEND
}
meta_data() {
+ # The EXTENDED_OCF_PARAMS parameter below does not exist by default
+ # and hence converted to an empty string unless overridden. It
+ # could be used by an extention script to add new parameters. For
+ # example see https://review.openstack.org/#/c/249180/10
+
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
@@ -268,6 +276,8 @@ If too many timeouts happen in a raw, the monitor call will return with error.
<content type="string" default="${OCF_RESKEY_max_rabbitmqctl_timeouts_default}" />
</parameter>
+$EXTENDED_OCF_PARAMS
+
</parameters>
<actions>
@@ -1734,11 +1744,10 @@ action_promote() {
ocf_log info "${LH} action end."
exit $OCF_FAILED_MASTER
fi
- ocf_log info "${LH} Setting HA policy for all queues"
- ${OCF_RESKEY_ctl} set_policy ha-all "." '{"ha-mode":"all", "ha-sync-mode":"automatic"}' --apply-to all --priority 0
- ${OCF_RESKEY_ctl} set_policy heat_rpc_expire "^heat-engine-listener\\." '{"expires":3600000,"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to all --priority 1
- ${OCF_RESKEY_ctl} set_policy results_expire "^results\\." '{"expires":3600000,"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to all --priority 1
- ${OCF_RESKEY_ctl} set_policy tasks_expire "^tasks\\." '{"expires":3600000,"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to all --priority 1
+
+ local set_policy_path="$(dirname $0)/set_rabbitmq_policy.sh"
+ . $set_policy_path
+
# create timestamp file
ocf_log info "${LH} Updating start timestamp"
ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --update $(now)
diff --git a/scripts/set_rabbitmq_policy.sh b/scripts/set_rabbitmq_policy.sh
new file mode 100755
index 0000000000..a88b0c417a
--- /dev/null
+++ b/scripts/set_rabbitmq_policy.sh
@@ -0,0 +1,5 @@
+# This script is called by rabbitmq-server-ha.ocf during RabbitMQ
+# cluster start up. It is a convenient place to set your cluster
+# policy here, for example:
+# ${OCF_RESKEY_ctl} set_policy ha-all "." '{"ha-mode":"all", "ha-sync-mode":"automatic"}' --apply-to all --priority 0
+
diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl
index 91a079da93..c064e82ac6 100644
--- a/src/rabbit_control_main.erl
+++ b/src/rabbit_control_main.erl
@@ -88,6 +88,7 @@
{trace_on, [?VHOST_DEF]},
{trace_off, [?VHOST_DEF]},
set_vm_memory_high_watermark,
+ set_disk_free_limit,
help
]).
@@ -426,6 +427,27 @@ action(set_vm_memory_high_watermark, Node, ["absolute", Arg], _Opts, Inform) ->
{error_string, "Unable to parse absolute memory limit value ~p", [Arg]}
end;
+action(set_disk_free_limit, Node, [Arg], _Opts, Inform) ->
+ case rabbit_resource_monitor_misc:parse_information_unit(Arg) of
+ {ok, Limit} ->
+ Inform("Setting disk free limit on ~p to ~p bytes", [Node, Limit]),
+ rpc_call(Node, rabbit_disk_monitor, set_disk_free_limit, [Limit]);
+ {error, parse_error} ->
+ {error_string, "Unable to parse disk free limit value ~p", [Arg]}
+ end;
+
+action(set_disk_free_limit, Node, ["mem_relative", Arg], _Opts, Inform) ->
+ Frac = list_to_float(case string:chr(Arg, $.) of
+ 0 -> Arg ++ ".0";
+ _ -> Arg
+ end),
+ Inform("Setting disk free limit on ~p to ~p of total RAM", [Node, Frac]),
+ rpc_call(Node,
+ rabbit_disk_monitor,
+ set_disk_free_limit,
+ [{mem_relative, Frac}]);
+
+
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\"",
@@ -667,10 +689,10 @@ read_pid_file(PidFile, Wait) ->
become(BecomeNode) ->
error_logger:tty(false),
- ok = net_kernel:stop(),
case net_adm:ping(BecomeNode) of
pong -> exit({node_running, BecomeNode});
- pang -> io:format(" * Impersonating node: ~s...", [BecomeNode]),
+ pang -> ok = net_kernel:stop(),
+ io:format(" * Impersonating node: ~s...", [BecomeNode]),
{ok, _} = rabbit_cli:start_distribution(BecomeNode),
io:format(" done~n", []),
Dir = mnesia:system_info(directory),
diff --git a/src/rabbit_resource_monitor_misc.erl b/src/rabbit_resource_monitor_misc.erl
index 88f3bd1121..f90b8ce310 100644
--- a/src/rabbit_resource_monitor_misc.erl
+++ b/src/rabbit_resource_monitor_misc.erl
@@ -30,10 +30,12 @@ parse_information_unit(Value) when is_integer(Value) -> {ok, Value};
parse_information_unit(Value) when is_list(Value) ->
case re:run(Value,
"^(?<VAL>[0-9]+)(?<UNIT>kB|KB|MB|GB|kb|mb|gb|Kb|Mb|Gb|kiB|KiB|MiB|GiB|kib|mib|gib|KIB|MIB|GIB|k|K|m|M|g|G)?$",
- [{capture, all_names, list}]) of
+ [{capture, all_but_first, list}]) of
{match, [[], _]} ->
{ok, list_to_integer(Value)};
- {match, [Unit, Num]} ->
+ {match, [Num]} ->
+ {ok, list_to_integer(Num)};
+ {match, [Num, Unit]} ->
Multiplier = case Unit of
KiB when KiB =:= "k"; KiB =:= "kiB"; KiB =:= "K"; KiB =:= "KIB"; KiB =:= "kib" -> 1024;
MiB when MiB =:= "m"; MiB =:= "MiB"; MiB =:= "M"; MiB =:= "MIB"; MiB =:= "mib" -> 1024*1024;
diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl
index daf39b8acc..0a85ef3e7d 100644
--- a/src/rabbit_upgrade.erl
+++ b/src/rabbit_upgrade.erl
@@ -100,7 +100,12 @@ ensure_backup_taken() ->
false -> ok = take_backup();
_ -> ok
end;
- true -> throw({error, previous_upgrade_failed})
+ true ->
+ error("Found lock file at ~s.
+ Either previous upgrade is in progress or has failed.
+ Database backup path: ~s",
+ [lock_filename(), backup_dir()]),
+ throw({error, previous_upgrade_failed})
end.
take_backup() ->
@@ -108,7 +113,7 @@ take_backup() ->
case rabbit_mnesia:copy_db(BackupDir) of
ok -> info("upgrades: Mnesia dir backed up to ~p~n",
[BackupDir]);
- {error, E} -> throw({could_not_back_up_mnesia_dir, E})
+ {error, E} -> throw({could_not_back_up_mnesia_dir, E, BackupDir})
end.
ensure_backup_removed() ->