diff options
| author | Essien Ita Essien <essiene@gmail.com> | 2008-12-26 10:29:00 +0100 |
|---|---|---|
| committer | Essien Ita Essien <essiene@gmail.com> | 2008-12-26 10:29:00 +0100 |
| commit | a625e7695d9af4083a137821e52bd3afa09c85c2 (patch) | |
| tree | 11f0aaae33fa1335f1b986f76757b6733d64fe91 | |
| parent | 9e4fdee06474001eecfd58cce1ceea7e49fde9b3 (diff) | |
| parent | 4be2257979970f5b697d1e4402ca0bd6bd3ae691 (diff) | |
| download | rabbitmq-server-git-a625e7695d9af4083a137821e52bd3afa09c85c2.tar.gz | |
Merge in upstream changes
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | ebin/rabbit.app | 14 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/Makefile | 1 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server-preserve-db.sh | 28 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server.spec | 25 | ||||
| -rw-r--r-- | packaging/debs/Debian/Makefile | 2 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/changelog | 6 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/config | 25 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/control | 2 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/po/POTFILES.in | 1 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/postinst | 3 | ||||
| -rw-r--r-- | packaging/debs/Debian/debian/templates | 20 | ||||
| -rwxr-xr-x | scripts/rabbitmq-mnesia-current | 63 | ||||
| -rwxr-xr-x | scripts/rabbitmq-server | 4 | ||||
| -rw-r--r-- | src/rabbit.erl | 7 | ||||
| -rw-r--r-- | src/rabbit_alarm.erl | 25 | ||||
| -rw-r--r-- | src/rabbit_channel.erl | 27 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 20 | ||||
| -rw-r--r-- | src/rabbit_mnesia.erl | 86 | ||||
| -rw-r--r-- | src/rabbit_tests.erl | 2 |
20 files changed, 141 insertions, 231 deletions
@@ -11,6 +11,8 @@ TARGETS=$(EBIN_DIR)/rabbit_framing.beam $(patsubst $(SOURCE_DIR)/%.erl, $(EBIN_D WEB_URL=http://stage.rabbitmq.com/ MANPAGES=$(patsubst %.pod, %.gz, $(wildcard docs/*.[0-9].pod)) +PYTHON=python + ifndef USE_SPECS # our type specs rely on features / bug fixes in dialyzer that are # only available in R12B-3 upwards @@ -42,10 +44,10 @@ $(EBIN_DIR)/%.beam: $(SOURCE_DIR)/%.erl $(INCLUDE_DIR)/rabbit_framing.hrl $(INCL # ERLC_EMULATOR="erl -smp" erlc $(ERLC_OPTS) $< $(INCLUDE_DIR)/rabbit_framing.hrl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_PATH) - python codegen.py header $(AMQP_SPEC_JSON_PATH) > $@ + $(PYTHON) codegen.py header $(AMQP_SPEC_JSON_PATH) > $@ $(SOURCE_DIR)/rabbit_framing.erl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_PATH) - python codegen.py body $(AMQP_SPEC_JSON_PATH) > $@ + $(PYTHON) codegen.py body $(AMQP_SPEC_JSON_PATH) > $@ $(EBIN_DIR)/rabbit.boot $(EBIN_DIR)/rabbit.script: $(EBIN_DIR)/rabbit.app $(EBIN_DIR)/rabbit.rel $(TARGETS) erl -noshell -eval 'systools:make_script("ebin/rabbit", [{path, ["ebin"]}]), halt().' @@ -76,10 +78,6 @@ run: all RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS) -s rabbit" \ ./scripts/rabbitmq-server -check-mnesia-schema: all - $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \ - ./scripts/rabbitmq-mnesia-current - run-node: all $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \ RABBITMQ_NODE_ONLY=true \ @@ -167,7 +165,6 @@ install: all docs_all cp scripts/rabbitmq-server $(SBIN_DIR) cp scripts/rabbitmqctl $(SBIN_DIR) cp scripts/rabbitmq-multi $(SBIN_DIR) - cp scripts/rabbitmq-mnesia-current $(SBIN_DIR) for section in 1 5; do \ mkdir -p $(MAN_DIR)/man$$section; \ for manpage in docs/*.$$section.pod; do \ diff --git a/ebin/rabbit.app b/ebin/rabbit.app index 0326f461b8..70a1320855 100644 --- a/ebin/rabbit.app +++ b/ebin/rabbit.app @@ -2,9 +2,9 @@ [{description, "RabbitMQ"}, {id, "RabbitMQ"}, {vsn, "%%VERSION%%"}, - {modules, [rabbit, - buffering_proxy, + {modules, [buffering_proxy, rabbit_access_control, + rabbit_alarm, rabbit_amqqueue, rabbit_amqqueue_process, rabbit_amqqueue_sup, @@ -12,20 +12,25 @@ rabbit_binary_parser, rabbit_channel, rabbit_control, + rabbit, rabbit_error_logger, + rabbit_error_logger_file_h, rabbit_exchange, - rabbit_framing, rabbit_framing_channel, + rabbit_framing, rabbit_heartbeat, rabbit_load, rabbit_log, + rabbit_memsup_linux, rabbit_misc, rabbit_mnesia, + rabbit_multi, rabbit_networking, rabbit_node_monitor, rabbit_persister, rabbit_reader, rabbit_router, + rabbit_sasl_report_file_h, rabbit_sup, rabbit_tests, rabbit_tracer, @@ -48,4 +53,5 @@ {extra_startup_steps, []}, {default_user, <<"guest">>}, {default_pass, <<"guest">>}, - {default_vhost, <<"/">>}]}]}. + {default_vhost, <<"/">>}, + {memory_alarms, false}]}]}. diff --git a/packaging/RPMS/Fedora/Makefile b/packaging/RPMS/Fedora/Makefile index 5610de515b..c05f14a7cb 100644 --- a/packaging/RPMS/Fedora/Makefile +++ b/packaging/RPMS/Fedora/Makefile @@ -17,7 +17,6 @@ prepare: cp init.d SOURCES/rabbitmq-server.init cp rabbitmqctl_wrapper SOURCES/rabbitmq-server.wrapper cp rabbitmq-server.logrotate SOURCES/rabbitmq-server.logrotate - cp rabbitmq-server-preserve-db.sh SOURCES server: prepare rpmbuild -ba SPECS/rabbitmq-server.spec $(DEFINES) --target i386 diff --git a/packaging/RPMS/Fedora/rabbitmq-server-preserve-db.sh b/packaging/RPMS/Fedora/rabbitmq-server-preserve-db.sh deleted file mode 100644 index e885b6b80f..0000000000 --- a/packaging/RPMS/Fedora/rabbitmq-server-preserve-db.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -if [ "$1x" = "x" ]; then - echo "You haven't specified the initial location of the RabbitMQ database" - exit 1 -fi - -if [ ! -d "$1" ]; then - echo "The directory containing the RabbitMQ database doesn't exist" - exit 1 -fi - -echo -echo "The RabbitMQ database schema has changed." -echo "If your RabbitMQ database contains important data," -echo "such as user accounts, durable exchanges and queues," -echo "or persistent messages, then we recommend you contact" -echo "support@rabbitmq.com for assistance with the upgrade." -echo "The current RabbitMQ database will be moved to the" -echo "directory: " - -CURRENT_MNESIA_DIR=$1 -DATE=`date +'%d_%m_%Y'` -TMP_OLD_MNESIA_DIR=$CURRENT_MNESIA_DIR.$$.${DATE} -mv "$CURRENT_MNESIA_DIR" "$TMP_OLD_MNESIA_DIR" - -echo "$TMP_OLD_MNESIA_DIR" -echo
\ No newline at end of file diff --git a/packaging/RPMS/Fedora/rabbitmq-server.spec b/packaging/RPMS/Fedora/rabbitmq-server.spec index 3cde1dc923..13cfb0372e 100644 --- a/packaging/RPMS/Fedora/rabbitmq-server.spec +++ b/packaging/RPMS/Fedora/rabbitmq-server.spec @@ -7,7 +7,6 @@ Source: http://www.rabbitmq.com/releases/rabbitmq-server/v%{version}/%{name}-%{v Source1: rabbitmq-server.init Source2: rabbitmq-server.wrapper Source3: rabbitmq-server.logrotate -Source4: rabbitmq-server-preserve-db.sh URL: http://www.rabbitmq.com/ Vendor: LShift Ltd., Cohesive Financial Technologies LLC., Rabbit Technlogies Ltd. %if 0%{?debian} @@ -75,10 +74,16 @@ install -m 0755 %SOURCE2 %{buildroot}%{_sbindir}/rabbitmqctl %endif mkdir -p %{buildroot}/etc/logrotate.d -install %SOURCE3 %{buildroot}/etc/logrotate.d/rabbitmq-server +install -m 0644 %SOURCE3 %{buildroot}/etc/logrotate.d/rabbitmq-server rm %{_maindir}/LICENSE %{_maindir}/LICENSE-MPL-RabbitMQ %{_maindir}/INSTALL +#Build the list of files +rm -f %{_builddir}/filelist.%{name}.rpm +echo '%defattr(-,root,root, -)' >> %{_builddir}/filelist.%{name}.rpm +(cd %{buildroot}; find . ! -regex '\./etc.*' \ + -type f | sed -e 's/^\.//' >> %{_builddir}/filelist.%{name}.rpm) + %post # create rabbitmq group if ! getent group rabbitmq >/dev/null; then @@ -88,17 +93,12 @@ fi # create rabbitmq user if ! getent passwd rabbitmq >/dev/null; then useradd -r -g rabbitmq --home /var/lib/rabbitmq rabbitmq - usermod -c "Rabbit AMQP Messaging Server" rabbitmq + usermod -c "RabbitMQ messaging server" rabbitmq fi chown -R rabbitmq:rabbitmq /var/lib/rabbitmq chown -R rabbitmq:rabbitmq /var/log/rabbitmq -su rabbitmq -s /bin/sh -c %{_rabbitbindir}/rabbitmq-mnesia-current -if [ $? = 1 ]; then - /bin/sh %SOURCE4 /var/lib/rabbitmq/mnesia -fi - /sbin/chkconfig --add %{name} /sbin/service rabbitmq-server start @@ -112,12 +112,8 @@ if [ $1 = 0 ]; then # Leave rabbitmq user and group fi -%files +%files -f ../filelist.%{name}.rpm %defattr(-,root,root,-) -%{_erllibdir}/rabbitmq_server-%{version}/ -%{_rabbitbindir}/ -%{_mandir}/ -%{_sbindir}/rabbitmqctl %dir /var/lib/rabbitmq %dir /var/log/rabbitmq /etc/rc.d/init.d/rabbitmq-server @@ -128,6 +124,9 @@ fi rm -rf %{buildroot} %changelog +* Wed Dec 17 2008 Matthias Radestock <matthias@lshift.net> 1.5.0-1 +- New upstream release + * Thu Jul 24 2008 Tony Garnock-Jones <tonyg@lshift.net> 1.4.0-1 - New upstream release diff --git a/packaging/debs/Debian/Makefile b/packaging/debs/Debian/Makefile index 0bf3a2d8c6..9479feb001 100644 --- a/packaging/debs/Debian/Makefile +++ b/packaging/debs/Debian/Makefile @@ -21,7 +21,7 @@ package: clean cp -r debian $(UNPACKED_DIR) chmod a+x $(UNPACKED_DIR)/debian/rules UNOFFICIAL_RELEASE=$(UNOFFICIAL_RELEASE) VERSION=$(VERSION) ./check-changelog.sh rabbitmq-server $(UNPACKED_DIR) - cd $(UNPACKED_DIR); debconf-updatepo; GNUPGHOME=$(GNUPG_PATH)/.gnupg dpkg-buildpackage -rfakeroot $(SIGNING) + cd $(UNPACKED_DIR); GNUPGHOME=$(GNUPG_PATH)/.gnupg dpkg-buildpackage -rfakeroot $(SIGNING) rm -rf $(UNPACKED_DIR) clean: diff --git a/packaging/debs/Debian/debian/changelog b/packaging/debs/Debian/debian/changelog index 07f5a8dd41..e8be8d8d8c 100644 --- a/packaging/debs/Debian/debian/changelog +++ b/packaging/debs/Debian/debian/changelog @@ -1,3 +1,9 @@ +rabbitmq-server (1.5.0-1) testing; urgency=low + + * New Upstream Release + + -- Matthias Radestock <matthias@lshift.net> Wed, 17 Dec 2008 18:23:47 +0000 + rabbitmq-server (1.4.0-1) testing; urgency=low * New Upstream Release diff --git a/packaging/debs/Debian/debian/config b/packaging/debs/Debian/debian/config deleted file mode 100644 index 9020888aad..0000000000 --- a/packaging/debs/Debian/debian/config +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -e - -# Source debconf library. -. /usr/share/debconf/confmodule - -if ! su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-mnesia-current ; then - db_beginblock - db_input high rabbitmq-server/mnesia-dir-note || true - db_input high rabbitmq-server/do-what-with-mnesia-dir || true - db_endblock - db_go - - db_get rabbitmq-server/do-what-with-mnesia-dir - if [ "$RET" = "Deleted" ]; then - rm -r /var/lib/rabbitmq/mnesia/ - elif [ "$RET" = "Moved" ]; then - db_input high rabbitmq-server/move-mnesia-dir-where || true - db_go - - db_get rabbitmq-server/move-mnesia-dir-where - - mkdir -p "`dirname $RET`" - mv /var/lib/rabbitmq/mnesia "$RET" - fi -fi diff --git a/packaging/debs/Debian/debian/control b/packaging/debs/Debian/debian/control index d5d49f3fe9..b2b3ab0236 100644 --- a/packaging/debs/Debian/debian/control +++ b/packaging/debs/Debian/debian/control @@ -7,7 +7,7 @@ Standards-Version: 3.8.0 Package: rabbitmq-server Architecture: all -Depends: erlang-nox, adduser, ${misc:Depends} +Depends: erlang-nox, adduser, logrotate, ${misc:Depends} Description: An AMQP server written in Erlang RabbitMQ is an implementation of AMQP, the emerging standard for high performance enterprise messaging. The RabbitMQ server is a robust and diff --git a/packaging/debs/Debian/debian/po/POTFILES.in b/packaging/debs/Debian/debian/po/POTFILES.in deleted file mode 100644 index cef83a3407..0000000000 --- a/packaging/debs/Debian/debian/po/POTFILES.in +++ /dev/null @@ -1 +0,0 @@ -[type: gettext/rfc822deb] templates diff --git a/packaging/debs/Debian/debian/postinst b/packaging/debs/Debian/debian/postinst index d0575628fe..495b8331f0 100644 --- a/packaging/debs/Debian/debian/postinst +++ b/packaging/debs/Debian/debian/postinst @@ -26,7 +26,7 @@ fi # create rabbitmq user if ! getent passwd rabbitmq >/dev/null; then adduser --system --ingroup rabbitmq --home /var/lib/rabbitmq --no-create-home rabbitmq - usermod -c "Rabbit AMQP Messaging Server" rabbitmq + usermod -c "RabbitMQ messaging server" rabbitmq fi chown -R rabbitmq:rabbitmq /var/lib/rabbitmq @@ -34,7 +34,6 @@ chown -R rabbitmq:rabbitmq /var/log/rabbitmq case "$1" in configure) - . /usr/share/debconf/confmodule ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/packaging/debs/Debian/debian/templates b/packaging/debs/Debian/debian/templates deleted file mode 100644 index 2d5acc155e..0000000000 --- a/packaging/debs/Debian/debian/templates +++ /dev/null @@ -1,20 +0,0 @@ -Template: rabbitmq-server/mnesia-dir-note -Type: note -_Description: Schema changed - The RabbitMQ database schema has changed. If your RabbitMQ database - contains important data, such as user accounts, durable exchanges and - queues, or persistent messages, then it is recommended to contact - support@rabbitmq.com for assistance with the upgrade. If you want to - experiment with the new version in the meantime, simply move the database - directory to a safe place. In all other cases just remove the directory. - -Template: rabbitmq-server/do-what-with-mnesia-dir -Type: select -_Choices: Moved, Deleted, Kept (WILL BREAK) -Default: Moved -_Description: The old RabbitMQ database directory should be: - -Template: rabbitmq-server/move-mnesia-dir-where -Type: string -Default: /var/lib/rabbitmq/mnesia-old/ -_Description: Directory where the old RabbitMQ database should be moved: diff --git a/scripts/rabbitmq-mnesia-current b/scripts/rabbitmq-mnesia-current deleted file mode 100755 index e7e1118cf4..0000000000 --- a/scripts/rabbitmq-mnesia-current +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh -## The contents of this file are subject to the Mozilla Public License -## Version 1.1 (the "License"); you may not use this file except in -## compliance with the License. You may obtain a copy of the License at -## http://www.mozilla.org/MPL/ -## -## Software distributed under the License is distributed on an "AS IS" -## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -## License for the specific language governing rights and limitations -## under the License. -## -## The Original Code is RabbitMQ. -## -## The Initial Developers of the Original Code are LShift Ltd, -## Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd. -## -## Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd, -## Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd -## are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial -## Technologies LLC, and Rabbit Technologies Ltd. -## -## Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift -## Ltd. Portions created by Cohesive Financial Technologies LLC are -## Copyright (C) 2007-2009 Cohesive Financial Technologies -## LLC. Portions created by Rabbit Technologies Ltd are Copyright -## (C) 2007-2009 Rabbit Technologies Ltd. -## -## All Rights Reserved. -## -## Contributor(s): ______________________________________. -## - -[ -f /etc/default/rabbitmq ] && . /etc/default/rabbitmq - -[ "x" = "x$RABBITMQ_CLUSTER_CONFIG_FILE" ] && RABBITMQ_CLUSTER_CONFIG_FILE=${CLUSTER_CONFIG_FILE} -[ "x" = "x$RABBITMQ_CLUSTER_CONFIG_FILE" ] && RABBITMQ_CLUSTER_CONFIG_FILE=/etc/default/rabbitmq_cluster.config -[ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=${NODENAME} -[ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=rabbit -[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS} -[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=0.0.0.0 -[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${NODE_PORT} -[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=5672 -[ "x" = "x$RABBITMQ_LOG_BASE" ] && RABBITMQ_LOG_BASE=${LOG_BASE} -[ "x" = "x$RABBITMQ_LOG_BASE" ] && RABBITMQ_LOG_BASE=/var/log/rabbitmq -[ "x" = "x$RABBITMQ_MNESIA_BASE" ] && RABBITMQ_MNESIA_BASE=${MNESIA_BASE} -[ "x" = "x$RABBITMQ_MNESIA_BASE" ] && RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia -[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${MNESIA_DIR} -[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME} - -if [ -f "$RABBITMQ_CLUSTER_CONFIG_FILE" ]; then - RABBITMQ_CLUSTER_CONFIG_OPTION="-rabbit cluster_config \"$RABBITMQ_CLUSTER_CONFIG_FILE\"" -else - RABBITMQ_CLUSTER_CONFIG_OPTION="" -fi - -exec erl \ - -pa "`dirname $0`/../ebin" \ - -noshell \ - -sname ${RABBITMQ_NODENAME} \ - -eval 'halt(case rabbit_mnesia:schema_current() of true -> 0; false -> 1 end).' \ - -mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \ - -kernel error_logger '{file,"'/dev/null'"}' \ - ${RABBITMQ_CLUSTER_CONFIG_OPTION} diff --git a/scripts/rabbitmq-server b/scripts/rabbitmq-server index f9678258c4..403b6e801d 100755 --- a/scripts/rabbitmq-server +++ b/scripts/rabbitmq-server @@ -42,8 +42,8 @@ [ "x" = "x$RABBITMQ_SSL_IP_ADDRESS" ] && RABBITMQ_SSL_IP_ADDRESS=0.0.0.0 [ "x" = "x$RABBITMQ_SSL_PORT" ] && RABBITMQ_SSL_PORT=${SSL_PORT} [ "x" = "x$RABBITMQ_SSL_PORT" ] && RABBITMQ_SSL_PORT=5673 -[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_ERL_ARGS=${SERVER_ERL_ARGS} -[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_ERL_ARGS="+K true +A30 \ +[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_SERVER_ERL_ARGS=${SERVER_ERL_ARGS} +[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_SERVER_ERL_ARGS="+K true +A30 \ -kernel inet_default_listen_options [{nodelay,true},{sndbuf,16384},{recbuf,4096}] \ -kernel inet_default_connect_options [{nodelay,true}]" [ "x" = "x$RABBITMQ_CLUSTER_CONFIG_FILE" ] && RABBITMQ_CLUSTER_CONFIG_FILE=${CLUSTER_CONFIG_FILE} diff --git a/src/rabbit.erl b/src/rabbit.erl index 63ececb73e..6891fe736f 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -163,11 +163,8 @@ start(normal, []) -> ok = rabbit_amqqueue:start(), - ok = rabbit_alarm:start( - case application:get_env(start_memsup) of - {ok, Val} -> Val; - undefined -> true - end), + {ok, MemoryAlarms} = application:get_env(memory_alarms), + ok = rabbit_alarm:start(MemoryAlarms), ok = rabbit_binary_generator: check_empty_content_body_frame_size(), diff --git a/src/rabbit_alarm.erl b/src/rabbit_alarm.erl index 43c4ad90c0..7bbed8b715 100644 --- a/src/rabbit_alarm.erl +++ b/src/rabbit_alarm.erl @@ -55,12 +55,12 @@ %%---------------------------------------------------------------------------- -start(StartMemsup) -> - ok = alarm_handler:add_alarm_handler(?MODULE), +start(MemoryAlarms) -> + ok = alarm_handler:add_alarm_handler(?MODULE, [MemoryAlarms]), case whereis(memsup) of - undefined -> if StartMemsup -> ok = start_memsup(), - ok = adjust_memsup_interval(); - true -> ok + undefined -> if MemoryAlarms -> ok = start_memsup(), + ok = adjust_memsup_interval(); + true -> ok end; _ -> ok = adjust_memsup_interval() end. @@ -74,9 +74,15 @@ register(Pid, HighMemMFA) -> %%---------------------------------------------------------------------------- -init([]) -> - {ok, #alarms{alertees = dict:new()}}. +init([MemoryAlarms]) -> + {ok, #alarms{alertees = case MemoryAlarms of + true -> dict:new(); + false -> undefined + end}}. +handle_call({register, _Pid, _HighMemMFA}, + State = #alarms{alertees = undefined}) -> + {ok, ok, State}; handle_call({register, Pid, HighMemMFA}, State = #alarms{alertees = Alertess}) -> _MRef = erlang:monitor(process, Pid), @@ -102,6 +108,9 @@ handle_event({clear_alarm, system_memory_high_watermark}, State) -> handle_event(_Event, State) -> {ok, State}. +handle_info({'DOWN', _MRef, process, _Pid, _Reason}, + State = #alarms{alertees = undefined}) -> + {ok, State}; handle_info({'DOWN', _MRef, process, Pid, _Reason}, State = #alarms{alertees = Alertess}) -> {ok, State#alarms{alertees = dict:erase(Pid, Alertess)}}; @@ -165,6 +174,8 @@ adjust_memsup_interval() -> {set_check_interval, ?MEMSUP_CHECK_INTERVAL}, infinity). +alert(_Alert, undefined) -> + ok; alert(Alert, Alertees) -> dict:fold(fun (Pid, {M, F, A}, Acc) -> ok = erlang:apply(M, F, A ++ [Pid, Alert]), diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 5d7fde90ef..19104bcb90 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -111,20 +111,25 @@ init(ProxyPid, [ReaderPid, WriterPid, Username, VHost]) -> consumer_mapping = dict:new()}. handle_message({method, Method, Content}, State) -> - case (catch handle_method(Method, Content, State)) of - {reply, Reply, NewState} -> - ok = rabbit_writer:send_command(NewState#ch.writer_pid, Reply), - NewState; - {noreply, NewState} -> - NewState; - stop -> - exit(normal); - {'EXIT', {amqp, Error, Explanation, none}} -> + try + case handle_method(Method, Content, State) of + {reply, Reply, NewState} -> + ok = rabbit_writer:send_command(NewState#ch.writer_pid, Reply), + NewState; + {noreply, NewState} -> + NewState; + stop -> + exit(normal) + end + catch + exit:{amqp, Error, Explanation, none} -> terminate({amqp, Error, Explanation, rabbit_misc:method_record_type(Method)}, State); - {'EXIT', Reason} -> - terminate(Reason, State) + exit:normal -> + terminate(normal, State); + _:Reason -> + terminate({Reason, erlang:get_stacktrace()}, State) end; handle_message(terminate, State) -> diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 299747d141..925c335cee 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -238,7 +238,19 @@ route(#exchange{name = Name, type = topic}, RoutingKey) -> %% TODO: This causes a full scan for each entry %% with the same exchange (see bug 19336) topic_matches(BindingKey, RoutingKey)]), - lookup_qpids(mnesia:async_dirty(fun qlc:e/1, [Query])); + lookup_qpids( + try + mnesia:async_dirty(fun qlc:e/1, [Query]) + catch exit:{aborted, {badarg, _}} -> + %% work around OTP-7025, which was fixed in R12B-1, by + %% falling back on a less efficient method + [QName || #route{binding = #binding{queue_name = QName, + key = BindingKey}} <- + mnesia:dirty_match_object( + #route{binding = #binding{exchange_name = Name, + _ = '_'}}), + topic_matches(BindingKey, RoutingKey)] + end); route(X = #exchange{type = fanout}, _) -> route_internal(X, '_'); @@ -256,8 +268,10 @@ route_internal(#exchange{name = Name}, RoutingKey) -> lookup_qpids(Queues) -> sets:fold( fun(Key, Acc) -> - [#amqqueue{pid = QPid}] = mnesia:dirty_read({amqqueue, Key}), - [QPid | Acc] + case mnesia:dirty_read({amqqueue, Key}) of + [#amqqueue{pid = QPid}] -> [QPid | Acc]; + [] -> Acc + end end, [], sets:from_list(Queues)). %% TODO: Should all of the route and binding management not be diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 57dd92563d..d19c37cb44 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -36,9 +36,6 @@ -export([table_names/0]). -%% Called by rabbitmq-mnesia-current script --export([schema_current/0]). - %% create_tables/0 exported for helping embed RabbitMQ in or alongside %% other mnesia-using Erlang applications, such as ejabberd -export([create_tables/0]). @@ -57,7 +54,6 @@ -spec(reset/0 :: () -> 'ok'). -spec(force_reset/0 :: () -> 'ok'). -spec(create_tables/0 :: () -> 'ok'). --spec(schema_current/0 :: () -> bool()). -endif. @@ -101,20 +97,6 @@ cluster(ClusterNodes) -> reset() -> reset(false). force_reset() -> reset(true). -%% This is invoked by rabbitmq-mnesia-current. -schema_current() -> - application:start(mnesia), - ok = ensure_mnesia_running(), - ok = ensure_mnesia_dir(), - ok = init_db(read_cluster_nodes_config()), - try - ensure_schema_integrity(), - true - catch - {error, {schema_integrity_check_failed, _Reason}} -> - false - end. - %%-------------------------------------------------------------------- table_definitions() -> @@ -169,17 +151,12 @@ ensure_mnesia_not_running() -> yes -> throw({error, mnesia_unexpectedly_running}) end. -ensure_schema_integrity() -> - case catch lists:foreach(fun (Tab) -> - mnesia:table_info(Tab, version) - end, - table_names()) of - {'EXIT', Reason} -> throw({error, {schema_integrity_check_failed, - Reason}}); - _ -> ok - end, +check_schema_integrity() -> %%TODO: more thorough checks - ok. + case catch [mnesia:table_info(Tab, version) || Tab <- table_names()] of + {'EXIT', Reason} -> {error, Reason}; + _ -> ok + end. %% The cluster node config file contains some or all of the disk nodes %% that are members of the cluster this node is / should be a part of. @@ -259,7 +236,20 @@ init_db(ClusterNodes) -> case mnesia:change_config(extra_db_nodes, ClusterNodes -- [node()]) of {ok, []} -> if WasDiskNode and IsDiskNode -> - ok; + case check_schema_integrity() of + ok -> + ok; + {error, Reason} -> + %% NB: we cannot use rabbit_log here since + %% it may not have been started yet + error_logger:warning_msg( + "schema integrity check failed: ~p~n" ++ + "moving database to backup location " ++ + "and recreating schema from scratch~n", + [Reason]), + ok = move_db(), + ok = create_schema() + end; WasDiskNode -> throw({error, {cannot_convert_disk_node_to_ram_node, ClusterNodes}}); @@ -292,6 +282,28 @@ create_schema() -> cannot_start_mnesia), create_tables(). +move_db() -> + mnesia:stop(), + MnesiaDir = filename:dirname(mnesia:system_info(directory) ++ "/"), + {{Year, Month, Day}, {Hour, Minute, Second}} = erlang:universaltime(), + BackupDir = lists:flatten( + io_lib:format("~s_~w~2..0w~2..0w~2..0w~2..0w~2..0w", + [MnesiaDir, + Year, Month, Day, Hour, Minute, Second])), + case file:rename(MnesiaDir, BackupDir) of + ok -> + %% NB: we cannot use rabbit_log here since it may not have + %% been started yet + error_logger:warning_msg("moved database from ~s to ~s~n", + [MnesiaDir, BackupDir]), + ok; + {error, Reason} -> throw({error, {cannot_backup_mnesia, + MnesiaDir, BackupDir, Reason}}) + end, + ok = ensure_mnesia_dir(), + rabbit_misc:ensure_ok(mnesia:start(), cannot_start_mnesia), + ok. + create_tables() -> lists:foreach(fun ({Tab, TabArgs}) -> case mnesia:create_table(Tab, TabArgs) of @@ -353,13 +365,17 @@ create_local_table_copy(Tab, Type) -> ok. wait_for_tables() -> - ok = ensure_schema_integrity(), - case mnesia:wait_for_tables(table_names(), 30000) of - ok -> ok; - {timeout, BadTabs} -> - throw({error, {timeout_waiting_for_tables, BadTabs}}); + case check_schema_integrity() of + ok -> + case mnesia:wait_for_tables(table_names(), 30000) of + ok -> ok; + {timeout, BadTabs} -> + throw({error, {timeout_waiting_for_tables, BadTabs}}); + {error, Reason} -> + throw({error, {failed_waiting_for_tables, Reason}}) + end; {error, Reason} -> - throw({error, {failed_waiting_for_tables, Reason}}) + throw({error, {schema_integrity_check_failed, Reason}}) end. reset(Force) -> diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index 1853a85511..df2e71d9e6 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -139,8 +139,6 @@ test_topic_matching() -> passed. test_app_management() -> - true = rabbit_mnesia:schema_current(), - %% starting, stopping, status ok = control_action(stop_app, []), ok = control_action(stop_app, []), |
