summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2015-12-14 20:06:53 +0300
committerMichael Klishin <michael@clojurewerkz.org>2015-12-14 20:06:53 +0300
commit869640358a3e269704c0a6338f2014d9265a72c3 (patch)
treef07bbc5965b6dcf9b5e20ee4dc838a2259e2e3dd
parentd90a5ead3dd848af51e2673e81c14bbb96b37c2b (diff)
parentde9f60af016198973ed163b1586b9838eb194228 (diff)
downloadrabbitmq-server-git-869640358a3e269704c0a6338f2014d9265a72c3.tar.gz
Merge branch 'master' into rabbitmq-server-255
-rw-r--r--.gitignore6
-rw-r--r--.travis.yml24
-rw-r--r--packaging/RPMS/Fedora/rabbitmq-server.spec4
-rwxr-xr-xpackaging/debs/Debian/debian/rules2
-rwxr-xr-xscripts/rabbitmq-plugins5
-rw-r--r--scripts/rabbitmq-plugins.bat5
-rwxr-xr-xscripts/rabbitmq-server-ha.ocf19
-rw-r--r--scripts/rabbitmq-server.bat6
-rwxr-xr-x[-rw-r--r--]scripts/rabbitmq-server.ocf0
-rwxr-xr-xscripts/rabbitmqctl5
-rw-r--r--scripts/rabbitmqctl.bat5
-rw-r--r--scripts/set_rabbitmq_policy.sh5
-rw-r--r--src/rabbit.erl11
-rw-r--r--src/rabbit_channel_sup.erl10
-rw-r--r--src/rabbit_channel_sup_sup.erl5
-rw-r--r--src/rabbit_connection_helper_sup.erl9
-rw-r--r--src/rabbit_connection_sup.erl9
-rw-r--r--src/rabbit_mnesia.erl2
-rw-r--r--src/rabbit_priority_queue.erl6
-rw-r--r--src/rabbit_upgrade.erl9
-rw-r--r--src/tcp_listener.erl30
-rw-r--r--src/tcp_listener_sup.erl7
22 files changed, 171 insertions, 13 deletions
diff --git a/.gitignore b/.gitignore
index a0e4c809e9..b30162c1e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,4 +37,8 @@
/rabbitmq-server-*.zip
# Dialyzer
-*.plt \ No newline at end of file
+*.plt
+
+# Tracing tools
+*-ttb
+*.ti \ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000..21fc0d0a5b
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,24 @@
+sudo: false
+language: erlang
+notifications:
+ email:
+ - alerts@rabbitmq.com
+addons:
+ apt:
+ packages:
+ - xsltproc
+otp_release:
+ - "R16B03-1"
+ - "17.5"
+ - "18.0"
+
+# The checkout made by Travis is a "detached HEAD". We switch back
+# to a tag or a branch. This pleases our git_rmq fetch method in
+# rabbitmq-components.mk and the proper tag/branch is selected in
+# dependencies too.
+before_script: (test "$TRAVIS_TAG" && git checkout "$TRAVIS_TAG") || (test "$TRAVIS_BRANCH" && git checkout "$TRAVIS_BRANCH")
+
+script: make tests
+
+cache:
+ apt: true
diff --git a/packaging/RPMS/Fedora/rabbitmq-server.spec b/packaging/RPMS/Fedora/rabbitmq-server.spec
index a18c3d10a4..02a42c230f 100644
--- a/packaging/RPMS/Fedora/rabbitmq-server.spec
+++ b/packaging/RPMS/Fedora/rabbitmq-server.spec
@@ -28,6 +28,7 @@ scalable implementation of an AMQP broker.
%define _rabbit_server_ocf scripts/rabbitmq-server.ocf
%define _plugins_state_dir %{_localstatedir}/lib/rabbitmq/plugins
%define _rabbit_server_ha_ocf scripts/rabbitmq-server-ha.ocf
+%define _set_rabbitmq_policy_sh scripts/set_rabbitmq_policy.sh
%define _maindir %{buildroot}%{_rabbit_erllibdir}
@@ -52,6 +53,7 @@ mkdir -p %{buildroot}%{_localstatedir}/log/rabbitmq
install -p -D -m 0755 %{S:1} %{buildroot}%{_initrddir}/rabbitmq-server
install -p -D -m 0755 %{_rabbit_server_ocf} %{buildroot}%{_exec_prefix}/lib/ocf/resource.d/rabbitmq/rabbitmq-server
install -p -D -m 0755 %{_rabbit_server_ha_ocf} %{buildroot}%{_exec_prefix}/lib/ocf/resource.d/rabbitmq/rabbitmq-server-ha
+install -p -D -m 0644 %{_set_rabbitmq_policy_sh} %{buildroot}%{_exec_prefix}/lib/ocf/resource.d/rabbitmq/set_rabbitmq_policy.sh.example
install -p -D -m 0644 %{S:2} %{buildroot}%{_sysconfdir}/logrotate.d/rabbitmq-server
mkdir -p %{buildroot}%{_sysconfdir}/rabbitmq
@@ -103,7 +105,7 @@ if [ $1 = 0 ]; then
#Complete uninstall
/sbin/service rabbitmq-server stop
/sbin/chkconfig --del rabbitmq-server
-
+
# We do not remove /var/log and /var/lib directories
# Leave rabbitmq user and group
fi
diff --git a/packaging/debs/Debian/debian/rules b/packaging/debs/Debian/debian/rules
index 053df18115..669e30c177 100755
--- a/packaging/debs/Debian/debian/rules
+++ b/packaging/debs/Debian/debian/rules
@@ -49,6 +49,8 @@ override_dh_auto_install:
$(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/rabbitmq-server
install -p -D -m 0755 scripts/rabbitmq-server-ha.ocf \
$(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/rabbitmq-server-ha
+ install -p -D -m 0644 scripts/set_rabbitmq_policy.sh \
+ $(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/set_rabbitmq_policy.sh.example
rm $(DEB_DESTDIR)$(RMQ_ERLAPP_DIR)/LICENSE* \
$(DEB_DESTDIR)$(RMQ_ERLAPP_DIR)/INSTALL
diff --git a/scripts/rabbitmq-plugins b/scripts/rabbitmq-plugins
index e8b6c9e92b..d72df8ad86 100755
--- a/scripts/rabbitmq-plugins
+++ b/scripts/rabbitmq-plugins
@@ -19,6 +19,11 @@
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env
+# Disable erl_crash.dump by default for control scripts.
+if [ -z "$ERL_CRASH_DUMP_SECONDS" ]; then
+ export ERL_CRASH_DUMP_SECONDS=0
+fi
+
RABBITMQ_USE_LONGNAME=${RABBITMQ_USE_LONGNAME} \
exec ${ERL_DIR}erl \
-pa "${RABBITMQ_HOME}/ebin" \
diff --git a/scripts/rabbitmq-plugins.bat b/scripts/rabbitmq-plugins.bat
index 1371d5a33f..be938f0785 100644
--- a/scripts/rabbitmq-plugins.bat
+++ b/scripts/rabbitmq-plugins.bat
@@ -40,6 +40,11 @@ if not exist "!ERLANG_HOME!\bin\erl.exe" (
exit /B 1
)
+REM Disable erl_crash.dump by default for control scripts.
+if not defined ERL_CRASH_DUMP_SECONDS (
+ set ERL_CRASH_DUMP_SECONDS=0
+)
+
"!ERLANG_HOME!\bin\erl.exe" ^
-pa "!TDP0!..\ebin" ^
-noinput ^
diff --git a/scripts/rabbitmq-server-ha.ocf b/scripts/rabbitmq-server-ha.ocf
index 1e4ebd0f1e..76757b220c 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"
+ [ -f $set_policy_path ] && . $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/rabbitmq-server.bat b/scripts/rabbitmq-server.bat
index 7b5ee2e672..c1aa42c65f 100644
--- a/scripts/rabbitmq-server.bat
+++ b/scripts/rabbitmq-server.bat
@@ -72,8 +72,11 @@ if not "!RABBITMQ_NODE_IP_ADDRESS!"=="" (
)
set RABBITMQ_START_RABBIT=
+if "!RABBITMQ_ALLOW_INPUT!"=="" (
+ set RABBITMQ_START_RABBIT=!RABBITMQ_START_RABBIT! -noinput
+)
if "!RABBITMQ_NODE_ONLY!"=="" (
- set RABBITMQ_START_RABBIT=-s "!RABBITMQ_BOOT_MODULE!" boot
+ set RABBITMQ_START_RABBIT=!RABBITMQ_START_RABBIT! -s "!RABBITMQ_BOOT_MODULE!" boot
)
if "!RABBITMQ_IO_THREAD_POOL_SIZE!"=="" (
@@ -82,7 +85,6 @@ if "!RABBITMQ_IO_THREAD_POOL_SIZE!"=="" (
"!ERLANG_HOME!\bin\erl.exe" ^
-pa "!RABBITMQ_EBIN_ROOT!" ^
--noinput ^
-boot start_sasl ^
!RABBITMQ_START_RABBIT! ^
!RABBITMQ_CONFIG_ARG! ^
diff --git a/scripts/rabbitmq-server.ocf b/scripts/rabbitmq-server.ocf
index 804e65423d..804e65423d 100644..100755
--- a/scripts/rabbitmq-server.ocf
+++ b/scripts/rabbitmq-server.ocf
diff --git a/scripts/rabbitmqctl b/scripts/rabbitmqctl
index 03f8765e27..3705b9a979 100755
--- a/scripts/rabbitmqctl
+++ b/scripts/rabbitmqctl
@@ -19,6 +19,11 @@
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env
+# Disable erl_crash.dump by default for control scripts.
+if [ -z "$ERL_CRASH_DUMP_SECONDS" ]; then
+ export ERL_CRASH_DUMP_SECONDS=0
+fi
+
# We specify Mnesia dir and sasl error logger since some actions
# (e.g. forget_cluster_node --offline) require us to impersonate the
# real node.
diff --git a/scripts/rabbitmqctl.bat b/scripts/rabbitmqctl.bat
index 34236a53a9..174f61ba23 100644
--- a/scripts/rabbitmqctl.bat
+++ b/scripts/rabbitmqctl.bat
@@ -40,6 +40,11 @@ if not exist "!ERLANG_HOME!\bin\erl.exe" (
exit /B 1
)
+REM Disable erl_crash.dump by default for control scripts.
+if not defined ERL_CRASH_DUMP_SECONDS (
+ set ERL_CRASH_DUMP_SECONDS=0
+)
+
"!ERLANG_HOME!\bin\erl.exe" ^
-pa "!TDP0!..\ebin" ^
-noinput ^
diff --git a/scripts/set_rabbitmq_policy.sh b/scripts/set_rabbitmq_policy.sh
new file mode 100644
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.erl b/src/rabbit.erl
index 2b9237a15b..8d5dbb0260 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -285,12 +285,21 @@ hipe_compile() ->
%% happens when RabbitMQ is stopped (just the
%% application, not the entire node) and started
%% again.
- HM:module_info(native) =:= false],
+ already_hipe_compiled(HM)],
case HipeModules of
[] -> {ok, already_compiled};
_ -> do_hipe_compile(HipeModules)
end.
+already_hipe_compiled(Mod) ->
+ try
+ %% OTP 18.x or later
+ Mod:module_info(native) =:= false
+ %% OTP prior to 18.x
+ catch error:badarg ->
+ code:is_module_native(Mod) =:= false
+ end.
+
do_hipe_compile(HipeModules) ->
Count = length(HipeModules),
io:format("~nHiPE compiling: |~s|~n |",
diff --git a/src/rabbit_channel_sup.erl b/src/rabbit_channel_sup.erl
index e8f45f7305..66f6a81697 100644
--- a/src/rabbit_channel_sup.erl
+++ b/src/rabbit_channel_sup.erl
@@ -16,6 +16,16 @@
-module(rabbit_channel_sup).
+%% Supervises processes that implement AMQP 0-9-1 channels:
+%%
+%% * Channel process itself
+%% * Network writer (for network connections)
+%% * Limiter (handles channel QoS and flow control)
+%%
+%% Every rabbit_channel_sup is supervised by rabbit_channel_sup_sup.
+%%
+%% See also rabbit_channel, rabbit_writer, rabbit_limiter.
+
-behaviour(supervisor2).
-export([start_link/1]).
diff --git a/src/rabbit_channel_sup_sup.erl b/src/rabbit_channel_sup_sup.erl
index 2be2af91a7..9cfbb78a2b 100644
--- a/src/rabbit_channel_sup_sup.erl
+++ b/src/rabbit_channel_sup_sup.erl
@@ -16,6 +16,11 @@
-module(rabbit_channel_sup_sup).
+%% Supervisor for AMQP 0-9-1 channels. Every AMQP 0-9-1 connection has
+%% one of these.
+%%
+%% See also rabbit_channel_sup, rabbit_connection_helper_sup, rabbit_reader.
+
-behaviour(supervisor2).
-export([start_link/0, start_channel/2]).
diff --git a/src/rabbit_connection_helper_sup.erl b/src/rabbit_connection_helper_sup.erl
index d3c05ee416..d6492331ef 100644
--- a/src/rabbit_connection_helper_sup.erl
+++ b/src/rabbit_connection_helper_sup.erl
@@ -16,6 +16,15 @@
-module(rabbit_connection_helper_sup).
+%% Supervises auxiliary processes of AMQP 0-9-1 connections:
+%%
+%% * Channel supervisor
+%% * Heartbeat receiver
+%% * Heartbeat sender
+%% * Exclusive queue collector
+%%
+%% See also rabbit_heartbeat, rabbit_channel_sup_sup, rabbit_queue_collector.
+
-behaviour(supervisor2).
-export([start_link/0]).
diff --git a/src/rabbit_connection_sup.erl b/src/rabbit_connection_sup.erl
index a64a2217da..09cddb0247 100644
--- a/src/rabbit_connection_sup.erl
+++ b/src/rabbit_connection_sup.erl
@@ -16,6 +16,15 @@
-module(rabbit_connection_sup).
+%% Supervisor for a (network) AMQP 0-9-1 client connection.
+%%
+%% Supervises
+%%
+%% * rabbit_reader
+%% * Auxiliary process supervisor
+%%
+%% See also rabbit_reader, rabbit_connection_helper_sup.
+
-behaviour(supervisor2).
-behaviour(ranch_protocol).
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 974a910d49..9ef37d3c48 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -102,7 +102,7 @@ init() ->
ensure_mnesia_dir(),
case is_virgin_node() of
true ->
- rabbit_log:info("Database directory at ~s is empty. Initialising from scratch... ~n",
+ rabbit_log:info("Database directory at ~s is empty. Initialising from scratch...~n",
[dir()]),
init_from_config();
false ->
diff --git a/src/rabbit_priority_queue.erl b/src/rabbit_priority_queue.erl
index 7439b5bc32..b58a8c535e 100644
--- a/src/rabbit_priority_queue.erl
+++ b/src/rabbit_priority_queue.erl
@@ -647,6 +647,12 @@ combine_status(P, New, Old) ->
cse(infinity, _) -> infinity;
cse(_, infinity) -> infinity;
+%% queue modes
+cse(_, default) -> default;
+cse(default, _) -> default;
+cse(_, lazy) -> lazy;
+cse(lazy, _) -> lazy;
+%% numerical stats
cse(A, B) when is_number(A) -> A + B;
cse({delta, _, _, _}, _) -> {delta, todo, todo, todo};
cse(A, B) -> exit({A, B}).
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() ->
diff --git a/src/tcp_listener.erl b/src/tcp_listener.erl
index 571622c80d..dcb607ccdd 100644
--- a/src/tcp_listener.erl
+++ b/src/tcp_listener.erl
@@ -16,6 +16,36 @@
-module(tcp_listener).
+%% Represents a running TCP listener (a process that listens for inbound
+%% TCP or TLS connections). Every protocol supported typically has one
+%% or two listeners, plain TCP and (optionally) TLS, but there can
+%% be more, e.g. when multiple network interfaces are involved.
+%%
+%% A listener has 6 properties (is a tuple of 6):
+%%
+%% * IP address
+%% * Port
+%% * Node
+%% * Label (human-friendly name, e.g. AMQP 0-9-1)
+%% * Startup callback
+%% * Shutdown callback
+%%
+%% Listeners use Ranch in embedded mode to accept and "bridge" client
+%% connections with protocol entry points such as rabbit_reader.
+%%
+%% Listeners are tracked in a Mnesia table so that they can be
+%%
+%% * Shut down
+%% * Listed (e.g. in the management UI)
+%%
+%% Every tcp_listener process has callbacks that are executed on start
+%% and termination. Those must take care of listener registration
+%% among other things.
+%%
+%% Listeners are supervised by tcp_listener_sup (one supervisor per protocol).
+%%
+%% See also rabbit_networking and tcp_listener_sup.
+
-behaviour(gen_server).
-export([start_link/5]).
diff --git a/src/tcp_listener_sup.erl b/src/tcp_listener_sup.erl
index 54da154d8d..4df8a45ac1 100644
--- a/src/tcp_listener_sup.erl
+++ b/src/tcp_listener_sup.erl
@@ -16,6 +16,13 @@
-module(tcp_listener_sup).
+%% Supervises TCP listeners. There is a separate supervisor for every
+%% protocol. In case of AMQP 0-9-1, it resides under rabbit_sup. Plugins
+%% that provide protocol support (e.g. STOMP) have an instance of this supervisor in their
+%% app supervision tree.
+%%
+%% See also rabbit_networking and tcp_listener.
+
-behaviour(supervisor).
-export([start_link/9, start_link/10]).