diff options
| author | Michael Klishin <michael@clojurewerkz.org> | 2015-12-14 20:06:53 +0300 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2015-12-14 20:06:53 +0300 |
| commit | 869640358a3e269704c0a6338f2014d9265a72c3 (patch) | |
| tree | f07bbc5965b6dcf9b5e20ee4dc838a2259e2e3dd | |
| parent | d90a5ead3dd848af51e2673e81c14bbb96b37c2b (diff) | |
| parent | de9f60af016198973ed163b1586b9838eb194228 (diff) | |
| download | rabbitmq-server-git-869640358a3e269704c0a6338f2014d9265a72c3.tar.gz | |
Merge branch 'master' into rabbitmq-server-255
| -rw-r--r-- | .gitignore | 6 | ||||
| -rw-r--r-- | .travis.yml | 24 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server.spec | 4 | ||||
| -rwxr-xr-x | packaging/debs/Debian/debian/rules | 2 | ||||
| -rwxr-xr-x | scripts/rabbitmq-plugins | 5 | ||||
| -rw-r--r-- | scripts/rabbitmq-plugins.bat | 5 | ||||
| -rwxr-xr-x | scripts/rabbitmq-server-ha.ocf | 19 | ||||
| -rw-r--r-- | scripts/rabbitmq-server.bat | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | scripts/rabbitmq-server.ocf | 0 | ||||
| -rwxr-xr-x | scripts/rabbitmqctl | 5 | ||||
| -rw-r--r-- | scripts/rabbitmqctl.bat | 5 | ||||
| -rw-r--r-- | scripts/set_rabbitmq_policy.sh | 5 | ||||
| -rw-r--r-- | src/rabbit.erl | 11 | ||||
| -rw-r--r-- | src/rabbit_channel_sup.erl | 10 | ||||
| -rw-r--r-- | src/rabbit_channel_sup_sup.erl | 5 | ||||
| -rw-r--r-- | src/rabbit_connection_helper_sup.erl | 9 | ||||
| -rw-r--r-- | src/rabbit_connection_sup.erl | 9 | ||||
| -rw-r--r-- | src/rabbit_mnesia.erl | 2 | ||||
| -rw-r--r-- | src/rabbit_priority_queue.erl | 6 | ||||
| -rw-r--r-- | src/rabbit_upgrade.erl | 9 | ||||
| -rw-r--r-- | src/tcp_listener.erl | 30 | ||||
| -rw-r--r-- | src/tcp_listener_sup.erl | 7 |
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]). |
