summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEssien Ita Essien <essiene@gmail.com>2008-12-26 10:29:00 +0100
committerEssien Ita Essien <essiene@gmail.com>2008-12-26 10:29:00 +0100
commita625e7695d9af4083a137821e52bd3afa09c85c2 (patch)
tree11f0aaae33fa1335f1b986f76757b6733d64fe91
parent9e4fdee06474001eecfd58cce1ceea7e49fde9b3 (diff)
parent4be2257979970f5b697d1e4402ca0bd6bd3ae691 (diff)
downloadrabbitmq-server-git-a625e7695d9af4083a137821e52bd3afa09c85c2.tar.gz
Merge in upstream changes
-rw-r--r--Makefile11
-rw-r--r--ebin/rabbit.app14
-rw-r--r--packaging/RPMS/Fedora/Makefile1
-rw-r--r--packaging/RPMS/Fedora/rabbitmq-server-preserve-db.sh28
-rw-r--r--packaging/RPMS/Fedora/rabbitmq-server.spec25
-rw-r--r--packaging/debs/Debian/Makefile2
-rw-r--r--packaging/debs/Debian/debian/changelog6
-rw-r--r--packaging/debs/Debian/debian/config25
-rw-r--r--packaging/debs/Debian/debian/control2
-rw-r--r--packaging/debs/Debian/debian/po/POTFILES.in1
-rw-r--r--packaging/debs/Debian/debian/postinst3
-rw-r--r--packaging/debs/Debian/debian/templates20
-rwxr-xr-xscripts/rabbitmq-mnesia-current63
-rwxr-xr-xscripts/rabbitmq-server4
-rw-r--r--src/rabbit.erl7
-rw-r--r--src/rabbit_alarm.erl25
-rw-r--r--src/rabbit_channel.erl27
-rw-r--r--src/rabbit_exchange.erl20
-rw-r--r--src/rabbit_mnesia.erl86
-rw-r--r--src/rabbit_tests.erl2
20 files changed, 141 insertions, 231 deletions
diff --git a/Makefile b/Makefile
index 75e1de7b7a..b441fcabfa 100644
--- a/Makefile
+++ b/Makefile
@@ -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, []),