From 8f34ccf3ac6c281c4a69c759237c556ccb9575d5 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 17 Feb 2010 13:52:33 +0000 Subject: A couple of Portfile fixes The revision should be 0 for a new release of rabbitmq-server (it gets bumped when the port changes for the same version of the base package). Sync with the maintainers line from the macports subversion repo. --- packaging/macports/Portfile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/macports/Portfile.in b/packaging/macports/Portfile.in index e1f58212..cf8be353 100644 --- a/packaging/macports/Portfile.in +++ b/packaging/macports/Portfile.in @@ -4,9 +4,9 @@ PortSystem 1.0 name rabbitmq-server version @VERSION@ -revision 1 +revision 0 categories net -maintainers rabbitmq.com:tonyg +maintainers paperplanes.de:meyer rabbitmq.com:tonyg openmaintainer platforms darwin description The RabbitMQ AMQP Server long_description \ -- cgit v1.2.1 From 0fe8ff7b04019d4342ec454da67222d43b19a4cf Mon Sep 17 00:00:00 2001 From: David Wragg Date: Wed, 17 Feb 2010 13:59:52 +0000 Subject: Add a script to assist in the macports submission process --- packaging/macports/make-port-diff.sh | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 packaging/macports/make-port-diff.sh diff --git a/packaging/macports/make-port-diff.sh b/packaging/macports/make-port-diff.sh new file mode 100755 index 00000000..3eb1b9f5 --- /dev/null +++ b/packaging/macports/make-port-diff.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# This script grabs the latest rabbitmq-server bits from the main +# macports subversion repo, and from the rabbitmq.com macports repo, +# and produces a diff from the former to the latter for submission +# through the macports trac. + +set -e + +dir=/tmp/$(basename $0).$$ +mkdir -p $dir/macports $dir/rabbitmq + +# Get the files from the macports subversion repo +cd $dir/macports +svn checkout http://svn.macports.org/repository/macports/trunk/dports/net/rabbitmq-server/ 2>&1 >/dev/null + +# Clear out the svn $id tag +sed -i -e 's|^# \$.*$|# $Id$|' rabbitmq-server/Portfile + +# Get the files from the rabbitmq.com macports repo +cd ../rabbitmq +curl -s http://www.rabbitmq.com/releases/macports/net/rabbitmq-server.tgz | tar xzf - + +cd .. +diff -Naur --exclude=.svn macports rabbitmq +cd / +rm -rf $dir -- cgit v1.2.1 From 8f67fbbb6b551ffaead422a670bbebf113b86998 Mon Sep 17 00:00:00 2001 From: David Wragg Date: Thu, 15 Apr 2010 17:33:01 +0100 Subject: Final small portfile tweaks to exactly match what's in Macports. --- packaging/macports/Portfile.in | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packaging/macports/Portfile.in b/packaging/macports/Portfile.in index cf8be353..74fa3f64 100644 --- a/packaging/macports/Portfile.in +++ b/packaging/macports/Portfile.in @@ -4,7 +4,6 @@ PortSystem 1.0 name rabbitmq-server version @VERSION@ -revision 0 categories net maintainers paperplanes.de:meyer rabbitmq.com:tonyg openmaintainer platforms darwin @@ -23,8 +22,7 @@ checksums \ sha1 @sha1@ \ rmd160 @rmd160@ -depends_build port:erlang -depends_run port:erlang +depends_lib port:erlang platform darwin 7 { depends_build-append port:py25-simplejson -- cgit v1.2.1 From 755c4ad125938778eac7b5013f85dd010b5c38f3 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Tue, 8 Jun 2010 14:48:44 +0100 Subject: Start bug22597 again. --- src/rabbit.erl | 3 ++- src/rabbit_mnesia.erl | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rabbit.erl b/src/rabbit.erl index c389178a..7a2faa68 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -185,6 +185,7 @@ -type(log_location() :: 'tty' | 'undefined' | string()). -type(file_suffix() :: binary()). +-type(node_type() :: disc_only | disc | ram). -spec(prepare/0 :: () -> 'ok'). -spec(start/0 :: () -> 'ok'). @@ -193,7 +194,7 @@ -spec(rotate_logs/1 :: (file_suffix()) -> 'ok' | {'error', any()}). -spec(status/0 :: () -> [{running_applications, [{atom(), string(), string()}]} | - {nodes, [erlang_node()]} | + {nodes, [{node_type(), [erlang_node()]}]} | {running_nodes, [erlang_node()]}]). -spec(log_location/1 :: ('sasl' | 'kernel') -> log_location()). diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index a0b7aa4e..20ee5232 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -47,7 +47,10 @@ -ifdef(use_specs). --spec(status/0 :: () -> [{'nodes' | 'running_nodes', [erlang_node()]}]). +-type(node_type() :: disc_only | disc | ram). + +-spec(status/0 :: () -> [{'nodes', [{node_type(), [erlang_node()]}]} | + {'running_nodes', [erlang_node()]}]). -spec(dir/0 :: () -> file_path()). -spec(ensure_mnesia_dir/0 :: () -> 'ok'). -spec(init/0 :: () -> 'ok'). @@ -64,7 +67,14 @@ %%---------------------------------------------------------------------------- status() -> - [{nodes, mnesia:system_info(db_nodes)}, + [{nodes, [{Key, Nodes} || + {Key, CopyType} <- [{disc_only, disc_only_copies}, + {disc, disc_copies}, + {ram, ram_copies}], + begin + Nodes = mnesia:table_info(schema, CopyType), + Nodes =/= [] + end]}, {running_nodes, mnesia:system_info(running_db_nodes)}]. init() -> -- cgit v1.2.1 From 94d1329300e919634ab858f15bf77aa0a72c0cf4 Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Thu, 10 Jun 2010 12:45:51 +0100 Subject: fixed crash when rabbit:status/0 called after rabbit was stopped --- src/rabbit.erl | 2 +- src/rabbit_mnesia.erl | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/rabbit.erl b/src/rabbit.erl index 7a2faa68..65c02cd2 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -185,7 +185,7 @@ -type(log_location() :: 'tty' | 'undefined' | string()). -type(file_suffix() :: binary()). --type(node_type() :: disc_only | disc | ram). +-type(node_type() :: disc_only | disc | ram | unknown). -spec(prepare/0 :: () -> 'ok'). -spec(start/0 :: () -> 'ok'). diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 20ee5232..1d4515ce 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -47,7 +47,7 @@ -ifdef(use_specs). --type(node_type() :: disc_only | disc | ram). +-type(node_type() :: disc_only | disc | ram | unknown). -spec(status/0 :: () -> [{'nodes', [{node_type(), [erlang_node()]}]} | {'running_nodes', [erlang_node()]}]). @@ -67,14 +67,21 @@ %%---------------------------------------------------------------------------- status() -> - [{nodes, [{Key, Nodes} || - {Key, CopyType} <- [{disc_only, disc_only_copies}, - {disc, disc_copies}, - {ram, ram_copies}], - begin - Nodes = mnesia:table_info(schema, CopyType), - Nodes =/= [] - end]}, + [{nodes, try [{Key, Nodes} || + {Key, CopyType} <- [{disc_only, disc_only_copies}, + {disc, disc_copies}, + {ram, ram_copies}], + begin + Nodes = mnesia:table_info(schema, CopyType), + Nodes =/= [] + end] + catch + exit:{aborted, _Reason} -> + case mnesia:system_info(db_nodes) of + [] -> []; + Nodes -> [{unknown, Nodes}] + end + end}, {running_nodes, mnesia:system_info(running_db_nodes)}]. init() -> -- cgit v1.2.1 From 61b2c9a4fdc2bf8a3a658a2aab81bb079ac43b3d Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Fri, 11 Jun 2010 10:31:00 +0100 Subject: moved common spec to rabbit.hrl; rewrote status code --- include/rabbit.hrl | 1 + src/rabbit.erl | 1 - src/rabbit_mnesia.erl | 29 +++++++++++++---------------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/include/rabbit.hrl b/include/rabbit.hrl index 0d75310b..06297c69 100644 --- a/include/rabbit.hrl +++ b/include/rabbit.hrl @@ -79,6 +79,7 @@ -type(maybe(T) :: T | 'none'). -type(erlang_node() :: atom()). +-type(node_type() :: disc_only | disc | ram | unknown). -type(ssl_socket() :: #ssl_socket{}). -type(socket() :: port() | ssl_socket()). -type(thunk(T) :: fun(() -> T)). diff --git a/src/rabbit.erl b/src/rabbit.erl index 65c02cd2..6cf6d7d5 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -185,7 +185,6 @@ -type(log_location() :: 'tty' | 'undefined' | string()). -type(file_suffix() :: binary()). --type(node_type() :: disc_only | disc | ram | unknown). -spec(prepare/0 :: () -> 'ok'). -spec(start/0 :: () -> 'ok'). diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 1d4515ce..d4b29943 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -47,8 +47,6 @@ -ifdef(use_specs). --type(node_type() :: disc_only | disc | ram | unknown). - -spec(status/0 :: () -> [{'nodes', [{node_type(), [erlang_node()]}]} | {'running_nodes', [erlang_node()]}]). -spec(dir/0 :: () -> file_path()). @@ -67,20 +65,19 @@ %%---------------------------------------------------------------------------- status() -> - [{nodes, try [{Key, Nodes} || - {Key, CopyType} <- [{disc_only, disc_only_copies}, - {disc, disc_copies}, - {ram, ram_copies}], - begin - Nodes = mnesia:table_info(schema, CopyType), - Nodes =/= [] - end] - catch - exit:{aborted, _Reason} -> - case mnesia:system_info(db_nodes) of - [] -> []; - Nodes -> [{unknown, Nodes}] - end + [{nodes, case mnesia:system_info(is_running) of + yes -> [{Key, Nodes} || + {Key, CopyType} <- [{disc_only, disc_only_copies}, + {disc, disc_copies}, + {ram, ram_copies}], + begin + Nodes = mnesia:table_info(schema, CopyType), + Nodes =/= [] + end]; + no -> case mnesia:system_info(db_nodes) of + [] -> []; + Nodes -> [{unknown, Nodes}] + end end}, {running_nodes, mnesia:system_info(running_db_nodes)}]. -- cgit v1.2.1 From fce9ba707699382fec51f68fc061f8ecaa4283b7 Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Mon, 14 Jun 2010 15:17:38 +0100 Subject: restart bug21842 off default --- src/rabbit_channel.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 3ae554d0..387064bd 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -344,7 +344,7 @@ with_exclusive_access_or_die(QName, ReaderPid, F) -> expand_queue_name_shortcut(<<>>, #ch{ most_recently_declared_queue = <<>> }) -> rabbit_misc:protocol_error( - not_allowed, "no previously declared queue", []); + not_found, "no previously declared queue", []); expand_queue_name_shortcut(<<>>, #ch{ virtual_host = VHostPath, most_recently_declared_queue = MRDQ }) -> rabbit_misc:r(VHostPath, queue, MRDQ); @@ -354,7 +354,7 @@ expand_queue_name_shortcut(QueueNameBin, #ch{ virtual_host = VHostPath }) -> expand_routing_key_shortcut(<<>>, <<>>, #ch{ most_recently_declared_queue = <<>> }) -> rabbit_misc:protocol_error( - not_allowed, "no previously declared queue", []); + not_found, "no previously declared queue", []); expand_routing_key_shortcut(<<>>, <<>>, #ch{ most_recently_declared_queue = MRDQ }) -> MRDQ; -- cgit v1.2.1 -- cgit v1.2.1 From d258d6ceff9050210b8842a5fc5fc4fcaf5dbf1f Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Thu, 17 Jun 2010 12:58:43 +0100 Subject: Move synchronous basic recover to the 0-8 broker. --- Makefile | 2 +- src/rabbit_channel.erl | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 725f20a6..3eafcc8e 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ TARGET_SRC_DIR=dist/$(TARBALL_NAME) SIBLING_CODEGEN_DIR=../rabbitmq-codegen/ AMQP_CODEGEN_DIR=$(shell [ -d $(SIBLING_CODEGEN_DIR) ] && echo $(SIBLING_CODEGEN_DIR) || echo codegen) -AMQP_SPEC_JSON_FILES=$(AMQP_CODEGEN_DIR)/amqp-0.8.json +AMQP_SPEC_JSON_FILES=$(AMQP_CODEGEN_DIR)/amqp-0.8.json $(AMQP_CODEGEN_DIR)/unbind-0.8.json $(AMQP_CODEGEN_DIR)/recover-0.8.json ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 1ab34f86..b087aac6 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -608,7 +608,7 @@ handle_method(#'basic.qos'{prefetch_count = PrefetchCount}, end, {reply, #'basic.qos_ok'{}, State#ch{limiter_pid = LimiterPid2}}; -handle_method(#'basic.recover'{requeue = true}, +handle_method(#'basic.recover_async'{requeue = true}, _, State = #ch{ transaction_id = none, unacked_message_q = UAMQ }) -> ok = fold_per_queue( @@ -620,10 +620,11 @@ handle_method(#'basic.recover'{requeue = true}, rabbit_amqqueue:requeue( QPid, lists:reverse(MsgIds), self()) end, ok, UAMQ), - %% No answer required, apparently! + %% No answer required - basic.recover is the newer, synchronous + %% variant of this method {noreply, State#ch{unacked_message_q = queue:new()}}; -handle_method(#'basic.recover'{requeue = false}, +handle_method(#'basic.recover_async'{requeue = false}, _, State = #ch{ transaction_id = none, writer_pid = WriterPid, unacked_message_q = UAMQ }) -> @@ -645,13 +646,22 @@ handle_method(#'basic.recover'{requeue = false}, WriterPid, false, ConsumerTag, DeliveryTag, {QName, QPid, MsgId, true, Message}) end, ok, UAMQ), - %% No answer required, apparently! + %% No answer required - basic.recover is the newer, synchronous + %% variant of this method {noreply, State}; -handle_method(#'basic.recover'{}, _, _State) -> +handle_method(#'basic.recover_async'{}, _, _State) -> rabbit_misc:protocol_error( not_allowed, "attempt to recover a transactional channel",[]); +handle_method(#'basic.recover'{requeue = Requeue}, Content, State) -> + {noreply, State2 = #ch{writer_pid = WriterPid}} = + handle_method(#'basic.recover_async'{requeue = Requeue}, + Content, + State), + ok = rabbit_writer:send_command(WriterPid, #'basic.recover_ok'{}), + {noreply, State2}; + handle_method(#'exchange.declare'{exchange = ExchangeNameBin, type = TypeNameBin, passive = false, -- cgit v1.2.1 From 98ababda28aaaf48593f5e5bf333560e73cb74d3 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Thu, 17 Jun 2010 13:05:52 +0100 Subject: Put all our extensions in one file. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3eafcc8e..36b045f7 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ TARGET_SRC_DIR=dist/$(TARBALL_NAME) SIBLING_CODEGEN_DIR=../rabbitmq-codegen/ AMQP_CODEGEN_DIR=$(shell [ -d $(SIBLING_CODEGEN_DIR) ] && echo $(SIBLING_CODEGEN_DIR) || echo codegen) -AMQP_SPEC_JSON_FILES=$(AMQP_CODEGEN_DIR)/amqp-0.8.json $(AMQP_CODEGEN_DIR)/unbind-0.8.json $(AMQP_CODEGEN_DIR)/recover-0.8.json +AMQP_SPEC_JSON_FILES=$(AMQP_CODEGEN_DIR)/amqp-0.8.json $(AMQP_CODEGEN_DIR)/rabbitmq-0.8-extensions.json ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e -- cgit v1.2.1 From 52820dfabd9db359a9743288af0f38a597e04179 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Fri, 18 Jun 2010 11:30:10 +0100 Subject: fix syntax error that prevented compilation under Erlang/OTP R14A --- src/rabbit_exchange.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index c5149b08..7072055c 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -100,7 +100,7 @@ %%---------------------------------------------------------------------------- --define(INFO_KEYS, [name, type, durable, auto_delete, arguments]. +-define(INFO_KEYS, [name, type, durable, auto_delete, arguments]). recover() -> Exs = rabbit_misc:table_fold( -- cgit v1.2.1 From 7f8c0a2911c2563b960b8847941590a176471cf7 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Fri, 18 Jun 2010 11:57:37 +0100 Subject: correct some specs - ram durations can be 'infinity' --- src/rabbit_amqqueue.erl | 2 +- src/rabbit_memory_monitor.erl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 3c9c41bd..eebcfcb9 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -110,7 +110,7 @@ -spec(internal_delete/1 :: (queue_name()) -> 'ok' | not_found()). -spec(maybe_run_queue_via_backing_queue/2 :: (pid(), (fun ((A) -> A))) -> 'ok'). -spec(update_ram_duration/1 :: (pid()) -> 'ok'). --spec(set_ram_duration_target/2 :: (pid(), number()) -> 'ok'). +-spec(set_ram_duration_target/2 :: (pid(), number() | 'infinity') -> 'ok'). -spec(set_maximum_since_use/2 :: (pid(), non_neg_integer()) -> 'ok'). -spec(on_node_down/1 :: (erlang_node()) -> 'ok'). -spec(pseudo_queue/2 :: (binary(), pid()) -> amqqueue()). diff --git a/src/rabbit_memory_monitor.erl b/src/rabbit_memory_monitor.erl index 91e97ffe..e78b59f1 100644 --- a/src/rabbit_memory_monitor.erl +++ b/src/rabbit_memory_monitor.erl @@ -90,7 +90,8 @@ -spec(update/0 :: () -> 'ok'). -spec(register/2 :: (pid(), {atom(),atom(),[any()]}) -> 'ok'). -spec(deregister/1 :: (pid()) -> 'ok'). --spec(report_ram_duration/2 :: (pid(), float() | 'infinity') -> number()). +-spec(report_ram_duration/2 :: (pid(), float() | 'infinity') -> + number() | 'infinity'). -spec(stop/0 :: () -> 'ok'). -endif. -- cgit v1.2.1 From e8d57bd39c4ae5c0bce4d8303dfbb1a8f3324493 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Fri, 18 Jun 2010 13:19:43 +0100 Subject: Permit basic.recover on a transactional channel. --- src/rabbit_channel.erl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index b087aac6..6caacc82 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -609,8 +609,7 @@ handle_method(#'basic.qos'{prefetch_count = PrefetchCount}, {reply, #'basic.qos_ok'{}, State#ch{limiter_pid = LimiterPid2}}; handle_method(#'basic.recover_async'{requeue = true}, - _, State = #ch{ transaction_id = none, - unacked_message_q = UAMQ }) -> + _, State = #ch{ unacked_message_q = UAMQ }) -> ok = fold_per_queue( fun (QPid, MsgIds, ok) -> %% The Qpid python test suite incorrectly assumes @@ -625,8 +624,7 @@ handle_method(#'basic.recover_async'{requeue = true}, {noreply, State#ch{unacked_message_q = queue:new()}}; handle_method(#'basic.recover_async'{requeue = false}, - _, State = #ch{ transaction_id = none, - writer_pid = WriterPid, + _, State = #ch{ writer_pid = WriterPid, unacked_message_q = UAMQ }) -> ok = rabbit_misc:queue_fold( fun ({_DeliveryTag, none, _Msg}, ok) -> @@ -650,9 +648,6 @@ handle_method(#'basic.recover_async'{requeue = false}, %% variant of this method {noreply, State}; -handle_method(#'basic.recover_async'{}, _, _State) -> - rabbit_misc:protocol_error( - not_allowed, "attempt to recover a transactional channel",[]); handle_method(#'basic.recover'{requeue = Requeue}, Content, State) -> {noreply, State2 = #ch{writer_pid = WriterPid}} = @@ -661,7 +656,6 @@ handle_method(#'basic.recover'{requeue = Requeue}, Content, State) -> State), ok = rabbit_writer:send_command(WriterPid, #'basic.recover_ok'{}), {noreply, State2}; - handle_method(#'exchange.declare'{exchange = ExchangeNameBin, type = TypeNameBin, passive = false, -- cgit v1.2.1 From 215fb035c58c4b1211e51ee296a2ae508bb687d4 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Fri, 18 Jun 2010 13:23:37 +0100 Subject: Rebalance blank lines --- src/rabbit_channel.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 6caacc82..eb3dd75e 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -648,7 +648,6 @@ handle_method(#'basic.recover_async'{requeue = false}, %% variant of this method {noreply, State}; - handle_method(#'basic.recover'{requeue = Requeue}, Content, State) -> {noreply, State2 = #ch{writer_pid = WriterPid}} = handle_method(#'basic.recover_async'{requeue = Requeue}, @@ -656,6 +655,7 @@ handle_method(#'basic.recover'{requeue = Requeue}, Content, State) -> State), ok = rabbit_writer:send_command(WriterPid, #'basic.recover_ok'{}), {noreply, State2}; + handle_method(#'exchange.declare'{exchange = ExchangeNameBin, type = TypeNameBin, passive = false, -- cgit v1.2.1 From 4c7af7a53d114a477917b3c7a572bf31ad57ca79 Mon Sep 17 00:00:00 2001 From: Emile Joubert Date: Mon, 21 Jun 2010 10:47:37 +0100 Subject: Make use of 0.9.1 error constants --- src/rabbit_channel.erl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 1ab34f86..cedadf04 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -447,13 +447,9 @@ handle_method(#'basic.publish'{exchange = ExchangeNameBin, routed -> ok; unroutable -> - %% FIXME: 312 should be replaced by the ?NO_ROUTE - %% definition, when we move to >=0-9 - ok = basic_return(Message, WriterPid, 312, <<"unroutable">>); + ok = basic_return(Message, WriterPid, no_route); not_delivered -> - %% FIXME: 313 should be replaced by the ?NO_CONSUMERS - %% definition, when we move to >=0-9 - ok = basic_return(Message, WriterPid, 313, <<"not_delivered">>) + ok = basic_return(Message, WriterPid, no_consumers) end, {noreply, case TxnKey of none -> State; @@ -946,7 +942,8 @@ binding_action(Fun, ExchangeNameBin, QueueNameBin, RoutingKey, Arguments, basic_return(#basic_message{exchange_name = ExchangeName, routing_key = RoutingKey, content = Content}, - WriterPid, ReplyCode, ReplyText) -> + WriterPid, Reason) -> + {_Close, ReplyCode, ReplyText} = rabbit_framing:lookup_amqp_exception(Reason), ok = rabbit_writer:send_command( WriterPid, #'basic.return'{reply_code = ReplyCode, -- cgit v1.2.1 From f9fb064458ccd9816f84dfaaf099c8c47ea62693 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Mon, 21 Jun 2010 12:19:52 +0100 Subject: This may be more robust in the face of docbook weirdness. At least it forces the anchors to be exactly what's visible on screen. --- docs/html-to-website-xml.xsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/html-to-website-xml.xsl b/docs/html-to-website-xml.xsl index f2117e26..662dbea0 100644 --- a/docs/html-to-website-xml.xsl +++ b/docs/html-to-website-xml.xsl @@ -58,13 +58,13 @@ - + - + -- cgit v1.2.1 From 63c7f8d467ff7abbf988daa5758af67a7e116310 Mon Sep 17 00:00:00 2001 From: Marek Majkowski Date: Mon, 21 Jun 2010 13:40:15 +0100 Subject: Macports portfile, let's not repeat port:erlang twice. --- packaging/macports/Portfile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/macports/Portfile.in b/packaging/macports/Portfile.in index b0158ab0..188a81c0 100644 --- a/packaging/macports/Portfile.in +++ b/packaging/macports/Portfile.in @@ -22,8 +22,8 @@ checksums \ sha1 @sha1@ \ rmd160 @rmd160@ -depends_build port:erlang port:xmlto port:libxslt -depends_run port:erlang +depends_lib port:erlang +depends_build port:xmlto port:libxslt platform darwin 7 { depends_build-append port:py25-simplejson -- cgit v1.2.1 From fe3d87a560d413618a2e69b47a01c4c0cd0320f9 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Mon, 21 Jun 2010 13:59:24 +0100 Subject: Cosmetics --- src/rabbit_channel.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index cedadf04..6d6d29e4 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -943,7 +943,8 @@ basic_return(#basic_message{exchange_name = ExchangeName, routing_key = RoutingKey, content = Content}, WriterPid, Reason) -> - {_Close, ReplyCode, ReplyText} = rabbit_framing:lookup_amqp_exception(Reason), + {_Close, ReplyCode, ReplyText} = + rabbit_framing:lookup_amqp_exception(Reason), ok = rabbit_writer:send_command( WriterPid, #'basic.return'{reply_code = ReplyCode, -- cgit v1.2.1 From a40971e3b11cd5a1b076ccfd4b2efc2400637f5c Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Tue, 22 Jun 2010 15:33:41 +0100 Subject: Move frame_max handling from amqp_0_9_1 to soemthing branched from default. --- src/rabbit_reader.erl | 34 +++++++++++++++++++++++----------- src/rabbit_tests.erl | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 73a58f13..6cee27df 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -53,6 +53,9 @@ -define(CLOSING_TIMEOUT, 1). -define(CHANNEL_TERMINATION_TIMEOUT, 3). -define(SILENT_CLOSE_DELAY, 3). +%% set to zero once QPid fix their negotiation +-define(FRAME_MAX, 131072). +-define(CHANNEL_MAX, 0). %--------------------------------------------------------------------------- @@ -604,9 +607,8 @@ handle_method0(#'connection.start_ok'{mechanism = Mechanism, User = rabbit_access_control:check_login(Mechanism, Response), ok = send_on_channel0( Sock, - #'connection.tune'{channel_max = 0, - %% set to zero once QPid fix their negotiation - frame_max = 131072, + #'connection.tune'{channel_max = ?CHANNEL_MAX, + frame_max = ?FRAME_MAX, heartbeat = 0}), State#v1{connection_state = tuning, connection = Connection#connection{ @@ -618,14 +620,24 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, State = #v1{connection_state = tuning, connection = Connection, sock = Sock}) -> - %% if we have a channel_max limit that the client wishes to - %% exceed, die as per spec. Not currently a problem, so we ignore - %% the client's channel_max parameter. - rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), - State#v1{connection_state = opening, - connection = Connection#connection{ - timeout_sec = ClientHeartbeat, - frame_max = FrameMax}}; + if (FrameMax =< ?FRAME_MIN_SIZE) or + (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> + rabbit_misc:protocol_error( + mistuned, "peer sent tune_ok with invalid frame_max", []); + %% If we have a channel_max limit that the client wishes to + %% exceed, die as per spec. Not currently a problem, so we ignore + %% the client's channel_max parameter. + %%(?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> + %% rabbit_misc:protocol_error( + %% mistuned, "peer sent tune_ok with invalid channel_max"); + true -> + rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), + State#v1{connection_state = opening, + connection = Connection#connection{ + timeout_sec = ClientHeartbeat, + frame_max = FrameMax}} + end; + handle_method0(#'connection.open'{virtual_host = VHostPath, insist = Insist}, State = #v1{connection_state = opening, diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index ecc2613d..a74beb99 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -55,6 +55,7 @@ all_tests() -> passed = test_pg_local(), passed = test_unfold(), passed = test_parsing(), + passed = test_content_framing(), passed = test_topic_matching(), passed = test_log_management(), passed = test_app_management(), @@ -353,6 +354,45 @@ test_field_values() -> >>), passed. +%% Test that content frames don't exceed frame-max +test_content_framing(FrameMax, Fragments) -> + [Header | Frames] = + rabbit_binary_generator:build_simple_content_frames( + 1, + #content{class_id = 0, properties_bin = <<>>, + payload_fragments_rev = Fragments}, + FrameMax), + % header is formatted correctly and the size is the total of the + % fragments + <<_FrameHeader:7/binary, _ClassAndWeight:4/binary, + BodySize:64/unsigned, _Rest/binary>> = list_to_binary(Header), + BodySize = size(list_to_binary(Fragments)), + false = lists:any( + fun (ContentFrame) -> + FrameBinary = list_to_binary(ContentFrame), + % assert + <<_TypeAndChannel:3/binary, + Size:32/unsigned, + _Payload:Size/binary, + 16#CE>> = FrameBinary, + size(FrameBinary) > FrameMax + end, + Frames), + passed. + +test_content_framing() -> + % no content + passed = test_content_framing(4096, []), + passed = test_content_framing(4096, [<<>>]), + % easily fit in one frame + passed = test_content_framing(4096, [<<"Easy">>]), + % exactly one frame (empty frame = 8 bytes) + passed = test_content_framing(11, [<<"One">>]), + % more than one frame + passed = test_content_framing(20, [<<"into more than one frame">>, + <<"This will have to go">>]), + passed. + test_topic_match(P, R) -> test_topic_match(P, R, true). -- cgit v1.2.1 From 405d275e4e0c6db3f9d56a45f239c2fb284600d4 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Tue, 22 Jun 2010 17:49:54 +0100 Subject: Don't use protocol_error as we will not send one and mistuned does not exist anyway. --- src/rabbit_reader.erl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 6cee27df..939efbbd 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -622,14 +622,13 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, sock = Sock}) -> if (FrameMax =< ?FRAME_MIN_SIZE) or (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> - rabbit_misc:protocol_error( - mistuned, "peer sent tune_ok with invalid frame_max", []); + exit(peer_sent_tune_ok_with_invalid_frame_max); + %% If we have a channel_max limit that the client wishes to %% If we have a channel_max limit that the client wishes to %% exceed, die as per spec. Not currently a problem, so we ignore %% the client's channel_max parameter. %%(?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> - %% rabbit_misc:protocol_error( - %% mistuned, "peer sent tune_ok with invalid channel_max"); + %% exit(peer_sent_tune_ok_with_invalid_channel_max); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 006228aa8a47abfbdc6bdb7c247c593df763e94e Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Tue, 22 Jun 2010 18:09:50 +0100 Subject: Or maybe we do want a protocol_error, but let's use a real one. --- src/rabbit_reader.erl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 939efbbd..ba412562 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -622,13 +622,14 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, sock = Sock}) -> if (FrameMax =< ?FRAME_MIN_SIZE) or (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> - exit(peer_sent_tune_ok_with_invalid_frame_max); - %% If we have a channel_max limit that the client wishes to + rabbit_misc:protocol_error( + not_allowed, "peer sent tune_ok with invalid frame_max", []); %% If we have a channel_max limit that the client wishes to %% exceed, die as per spec. Not currently a problem, so we ignore %% the client's channel_max parameter. %%(?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> - %% exit(peer_sent_tune_ok_with_invalid_channel_max); + %% rabbit_misc:protocol_error( + %% not_allowed, "peer sent tune_ok with invalid channel_max"); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 64b88a0baaea86218b9742acc2510868e89ce9d0 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Tue, 22 Jun 2010 18:17:49 +0100 Subject: Make error messages terser. --- src/rabbit_reader.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index ba412562..8b7cba48 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -623,13 +623,13 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, if (FrameMax =< ?FRAME_MIN_SIZE) or (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( - not_allowed, "peer sent tune_ok with invalid frame_max", []); + not_allowed, "invalid frame_max", []); %% If we have a channel_max limit that the client wishes to %% exceed, die as per spec. Not currently a problem, so we ignore %% the client's channel_max parameter. %%(?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> %% rabbit_misc:protocol_error( - %% not_allowed, "peer sent tune_ok with invalid channel_max"); + %% not_allowed, "invalid channel_max"); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 827dda957742958a3c16d07fcb95234c80f5d2c2 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 23 Jun 2010 11:12:40 +0100 Subject: Cosmetics --- src/rabbit_tests.erl | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index a74beb99..cf782497 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -362,33 +362,33 @@ test_content_framing(FrameMax, Fragments) -> #content{class_id = 0, properties_bin = <<>>, payload_fragments_rev = Fragments}, FrameMax), - % header is formatted correctly and the size is the total of the - % fragments + %% header is formatted correctly and the size is the total of the + %% fragments <<_FrameHeader:7/binary, _ClassAndWeight:4/binary, - BodySize:64/unsigned, _Rest/binary>> = list_to_binary(Header), + BodySize:64/unsigned, _Rest/binary>> = list_to_binary(Header), BodySize = size(list_to_binary(Fragments)), false = lists:any( fun (ContentFrame) -> FrameBinary = list_to_binary(ContentFrame), - % assert + %% assert <<_TypeAndChannel:3/binary, - Size:32/unsigned, - _Payload:Size/binary, - 16#CE>> = FrameBinary, + Size:32/unsigned, + _Payload:Size/binary, + 16#CE>> = FrameBinary, size(FrameBinary) > FrameMax end, Frames), passed. test_content_framing() -> - % no content + %% no content passed = test_content_framing(4096, []), passed = test_content_framing(4096, [<<>>]), - % easily fit in one frame + %% easily fit in one frame passed = test_content_framing(4096, [<<"Easy">>]), - % exactly one frame (empty frame = 8 bytes) + %% exactly one frame (empty frame = 8 bytes) passed = test_content_framing(11, [<<"One">>]), - % more than one frame + %% more than one frame passed = test_content_framing(20, [<<"into more than one frame">>, <<"This will have to go">>]), passed. -- cgit v1.2.1 From e89ba7b5527684b83ae75e06eb85195391065561 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 23 Jun 2010 11:16:20 +0100 Subject: Remove commented out code to enforce CHANNEL_MAX, we don't care. --- src/rabbit_reader.erl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 8b7cba48..14f790ec 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -624,12 +624,6 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( not_allowed, "invalid frame_max", []); - %% If we have a channel_max limit that the client wishes to - %% exceed, die as per spec. Not currently a problem, so we ignore - %% the client's channel_max parameter. - %%(?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> - %% rabbit_misc:protocol_error( - %% not_allowed, "invalid channel_max"); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From f7e1929492d067a83c5f1eddd06856380e6f0a70 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 23 Jun 2010 11:44:37 +0100 Subject: Reinstate channel_max check. --- src/rabbit_reader.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 14f790ec..e8198fbf 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -614,7 +614,7 @@ handle_method0(#'connection.start_ok'{mechanism = Mechanism, connection = Connection#connection{ user = User, client_properties = ClientProperties}}; -handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, +handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, frame_max = FrameMax, heartbeat = ClientHeartbeat}, State = #v1{connection_state = tuning, @@ -624,6 +624,9 @@ handle_method0(#'connection.tune_ok'{channel_max = _ChannelMax, (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( not_allowed, "invalid frame_max", []); + (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> + rabbit_misc:protocol_error( + not_allowed, "invalid channel_max", []); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 755a29a28811baeca65f025ee2f43cb7c723f23f Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Wed, 23 Jun 2010 12:06:45 +0100 Subject: added support for make-3.80 (and a deprecation warning) --- Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 725f20a6..e1c8cb37 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,8 @@ ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e ERL_EBIN=erl -noinput -pa $(EBIN_DIR) +NEED_MAKE := 3.81 + define usage_xml_to_erl $(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, $(SOURCE_DIR)/rabbit_%_usage.erl, $(subst -,_,$(1)))) endef @@ -76,6 +78,11 @@ SCRIPTS_REL_PATH=$(shell ./calculate-relative $(TARGET_DIR)/sbin $(SBIN_DIR)) endif endif +ifeq ($(filter $(NEED_MAKE),(firstword $(sort $(MAKE_VERSION) $(NEED_MAKE)))),) +$(warning Versions of make prior to $(NEED_MAKE) are not supported) +.DEFAULT_GOAL=all # Introduced in 3.81 +endif + all: $(TARGETS) $(DEPS_FILE): $(SOURCES) $(INCLUDES) @@ -268,7 +275,7 @@ install_dirs: mkdir -p $(SBIN_DIR) mkdir -p $(MAN_DIR) -$(foreach XML, $(USAGES_XML), $(eval $(call usage_dep, $(XML)))) +$(foreach XML,$(USAGES_XML),$(eval $(call usage_dep, $(XML)))) # Note that all targets which depend on clean must have clean in their # name. Also any target that doesn't depend on clean should not have -- cgit v1.2.1 From c07bf3559405a133d17a50659952a9457869ced9 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 23 Jun 2010 12:22:42 +0100 Subject: I think this logic finally makes sense. --- src/rabbit_reader.erl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index e8198fbf..9d84a270 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -54,7 +54,7 @@ -define(CHANNEL_TERMINATION_TIMEOUT, 3). -define(SILENT_CLOSE_DELAY, 3). %% set to zero once QPid fix their negotiation --define(FRAME_MAX, 131072). +-define(FRAME_MAX, 0). -define(CHANNEL_MAX, 0). %--------------------------------------------------------------------------- @@ -620,13 +620,18 @@ handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, State = #v1{connection_state = tuning, connection = Connection, sock = Sock}) -> - if (FrameMax =< ?FRAME_MIN_SIZE) or + if (FrameMax /= 0) and (FrameMax < ?FRAME_MIN_SIZE) -> + rabbit_misc:protocol_error( + not_allowed, "frame_max ~p smaller than ~p", + [FrameMax, ?FRAME_MIN_SIZE]); (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( - not_allowed, "invalid frame_max", []); + not_allowed, "frame_max ~p larger than ~p", + [FrameMax, ?FRAME_MAX]); (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> rabbit_misc:protocol_error( - not_allowed, "invalid channel_max", []); + not_allowed, "channel_max ~p larger than ~p", + [ChannelMax, ?CHANNEL_MAX]); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 511d94e1bb706c3f61da9a698be1bd2449921e38 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 23 Jun 2010 12:23:53 +0100 Subject: Argh. --- src/rabbit_reader.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 9d84a270..78327ce2 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -54,7 +54,7 @@ -define(CHANNEL_TERMINATION_TIMEOUT, 3). -define(SILENT_CLOSE_DELAY, 3). %% set to zero once QPid fix their negotiation --define(FRAME_MAX, 0). +-define(FRAME_MAX, 131072). -define(CHANNEL_MAX, 0). %--------------------------------------------------------------------------- -- cgit v1.2.1 From 3b23a9ad37253fd0b3a2a6f920ee0d7549285d40 Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Wed, 23 Jun 2010 16:13:33 +0100 Subject: ssl works again --- ebin/rabbit_app.in | 4 ++-- src/rabbit_networking.erl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ebin/rabbit_app.in b/ebin/rabbit_app.in index bdf407eb..ce94cafe 100644 --- a/ebin/rabbit_app.in +++ b/ebin/rabbit_app.in @@ -11,8 +11,8 @@ rabbit_sup, rabbit_tcp_client_sup]}, {applications, [kernel, stdlib, sasl, mnesia, os_mon]}, -%% we also depend on ssl but it shouldn't be in here as we don't -%% actually want to start it +%% we also depend on crypto, public_key and ssl but they shouldn't be +%% in here as we don't actually want to start it {mod, {rabbit, []}}, {env, [{tcp_listeners, [{"0.0.0.0", 5672}]}, {ssl_listeners, []}, diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index c3d0b7b7..68ffc98a 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -102,7 +102,7 @@ boot_ssl() -> {ok, []} -> ok; {ok, SslListeners} -> - ok = rabbit_misc:start_applications([crypto, ssl]), + ok = rabbit_misc:start_applications([crypto, public_key, ssl]), {ok, SslOpts} = application:get_env(ssl_options), [start_ssl_listener(Host, Port, SslOpts) || {Host, Port} <- SslListeners], ok -- cgit v1.2.1 From 4c73c83cf977550dc51ed188849409bccc1c1251 Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Thu, 24 Jun 2010 11:29:34 +0100 Subject: Use ~w rather than ~p. --- src/rabbit_reader.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 78327ce2..31c42b59 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -622,15 +622,15 @@ handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, sock = Sock}) -> if (FrameMax /= 0) and (FrameMax < ?FRAME_MIN_SIZE) -> rabbit_misc:protocol_error( - not_allowed, "frame_max ~p smaller than ~p", + not_allowed, "frame_max ~w smaller than ~w", [FrameMax, ?FRAME_MIN_SIZE]); (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( - not_allowed, "frame_max ~p larger than ~p", + not_allowed, "frame_max ~w larger than ~w", [FrameMax, ?FRAME_MAX]); (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> rabbit_misc:protocol_error( - not_allowed, "channel_max ~p larger than ~p", + not_allowed, "channel_max ~w larger than ~w", [ChannelMax, ?CHANNEL_MAX]); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), -- cgit v1.2.1 From 5583675319290861d2b051bde65459516d4f1ea4 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 24 Jun 2010 12:25:16 +0100 Subject: shut up compiler --- src/rabbit_reader.erl | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 31c42b59..fb49fb7b 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -55,6 +55,8 @@ -define(SILENT_CLOSE_DELAY, 3). %% set to zero once QPid fix their negotiation -define(FRAME_MAX, 131072). +%% NB: when setting this to non-zero the section of code in the +%% connection.tune_ok handler below needs to be uncommented -define(CHANNEL_MAX, 0). %--------------------------------------------------------------------------- @@ -628,10 +630,15 @@ handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, rabbit_misc:protocol_error( not_allowed, "frame_max ~w larger than ~w", [FrameMax, ?FRAME_MAX]); - (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> - rabbit_misc:protocol_error( - not_allowed, "channel_max ~w larger than ~w", - [ChannelMax, ?CHANNEL_MAX]); + %% The following is commented out in order to suppress compiler + %% warnings about unreachable code. If CHANNEL_MAX is ever + %% changed to a value other than 0 this region should be + %% uncommented. + %% + %% (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> + %% rabbit_misc:protocol_error( + %% not_allowed, "channel_max ~w larger than ~w", + %% [ChannelMax, ?CHANNEL_MAX]); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From d1295d6afe97420f0b90c5f93a53a9ef83a1f03b Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 24 Jun 2010 14:36:19 +0100 Subject: get rid of channel_max checks ...until we actually support channel_max settings properly. That way we avoid dead code / unused var warnings from the compiler --- src/rabbit_reader.erl | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index fb49fb7b..30e0bb75 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -53,11 +53,7 @@ -define(CLOSING_TIMEOUT, 1). -define(CHANNEL_TERMINATION_TIMEOUT, 3). -define(SILENT_CLOSE_DELAY, 3). -%% set to zero once QPid fix their negotiation --define(FRAME_MAX, 131072). -%% NB: when setting this to non-zero the section of code in the -%% connection.tune_ok handler below needs to be uncommented --define(CHANNEL_MAX, 0). +-define(FRAME_MAX, 131072). %% set to zero once QPid fix their negotiation %--------------------------------------------------------------------------- @@ -609,15 +605,14 @@ handle_method0(#'connection.start_ok'{mechanism = Mechanism, User = rabbit_access_control:check_login(Mechanism, Response), ok = send_on_channel0( Sock, - #'connection.tune'{channel_max = ?CHANNEL_MAX, + #'connection.tune'{channel_max = 0, frame_max = ?FRAME_MAX, heartbeat = 0}), State#v1{connection_state = tuning, connection = Connection#connection{ user = User, client_properties = ClientProperties}}; -handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, - frame_max = FrameMax, +handle_method0(#'connection.tune_ok'{frame_max = FrameMax, heartbeat = ClientHeartbeat}, State = #v1{connection_state = tuning, connection = Connection, @@ -630,15 +625,6 @@ handle_method0(#'connection.tune_ok'{channel_max = ChannelMax, rabbit_misc:protocol_error( not_allowed, "frame_max ~w larger than ~w", [FrameMax, ?FRAME_MAX]); - %% The following is commented out in order to suppress compiler - %% warnings about unreachable code. If CHANNEL_MAX is ever - %% changed to a value other than 0 this region should be - %% uncommented. - %% - %% (?CHANNEL_MAX /= 0) and (ChannelMax > ?CHANNEL_MAX) -> - %% rabbit_misc:protocol_error( - %% not_allowed, "channel_max ~w larger than ~w", - %% [ChannelMax, ?CHANNEL_MAX]); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), State#v1{connection_state = opening, -- cgit v1.2.1 From 566ce4e3231b9586f371735a0f367dca3a4d1910 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 24 Jun 2010 15:31:03 +0100 Subject: tweak error message --- src/rabbit_reader.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 30e0bb75..8ba58740 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -619,11 +619,11 @@ handle_method0(#'connection.tune_ok'{frame_max = FrameMax, sock = Sock}) -> if (FrameMax /= 0) and (FrameMax < ?FRAME_MIN_SIZE) -> rabbit_misc:protocol_error( - not_allowed, "frame_max ~w smaller than ~w", + not_allowed, "frame_max=~w < ~w min size", [FrameMax, ?FRAME_MIN_SIZE]); (?FRAME_MAX /= 0) and (FrameMax > ?FRAME_MAX) -> rabbit_misc:protocol_error( - not_allowed, "frame_max ~w larger than ~w", + not_allowed, "frame_max=~w > ~w max size", [FrameMax, ?FRAME_MAX]); true -> rabbit_heartbeat:start_heartbeat(Sock, ClientHeartbeat), -- cgit v1.2.1 From fbc63971530f171c2c90b144037e21983d0cdf91 Mon Sep 17 00:00:00 2001 From: Emile Joubert Date: Thu, 24 Jun 2010 16:52:50 +0100 Subject: Rebase bug21848 --- src/rabbit_reader.erl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 8ba58740..b2218fa0 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -486,10 +486,18 @@ handle_frame(Type, Channel, Payload, State) -> closing -> %% According to the spec, after sending a %% channel.close we must ignore all frames except + %% channel.close and channel.close_ok. In the + %% event of a channel.close, we should send back a %% channel.close_ok. case AnalyzedFrame of {method, 'channel.close_ok', _} -> erase({channel, Channel}); + {method, 'channel.close', _} -> + %% We're already closing this channel, so + %% there's no cleanup to do (notify + %% queues, etc.) + ok = rabbit_writer:send_command(State#v1.sock, + #'channel.close_ok'{}); _ -> ok end, State; -- cgit v1.2.1 From bcebe216aed566ede2e95a3642220f85574b1480 Mon Sep 17 00:00:00 2001 From: Alexandru Scvortov Date: Thu, 24 Jun 2010 19:50:34 +0100 Subject: blow up if make is to old --- Makefile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e1c8cb37..fc1aea8f 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,8 @@ ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e ERL_EBIN=erl -noinput -pa $(EBIN_DIR) -NEED_MAKE := 3.81 +# Versions prior to this are not supported +NEED_MAKE := 3.80 define usage_xml_to_erl $(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, $(SOURCE_DIR)/rabbit_%_usage.erl, $(subst -,_,$(1)))) @@ -78,8 +79,10 @@ SCRIPTS_REL_PATH=$(shell ./calculate-relative $(TARGET_DIR)/sbin $(SBIN_DIR)) endif endif -ifeq ($(filter $(NEED_MAKE),(firstword $(sort $(MAKE_VERSION) $(NEED_MAKE)))),) -$(warning Versions of make prior to $(NEED_MAKE) are not supported) +ifeq ($(filter $(NEED_MAKE),$(firstword $(sort $(NEED_MAKE) $(MAKE_VERSION)))),) +$(error Versions of make prior to $(NEED_MAKE) are not supported) +endif +ifeq ($(filter 3.81,$(firstword $(sort 3.81 $(MAKE_VERSION)))),) .DEFAULT_GOAL=all # Introduced in 3.81 endif -- cgit v1.2.1 From 2cd4ccecb0fa65887bf61c5029e59f7c1aca1a17 Mon Sep 17 00:00:00 2001 From: Emile Joubert Date: Fri, 25 Jun 2010 10:17:01 +0100 Subject: Rebase bug21849 --- src/rabbit_reader.erl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index b2218fa0..f2a903dc 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -103,6 +103,8 @@ %% heartbeat timeout -> *throw* %% closing: %% socket close -> *terminate* +%% receive connection.close -> send connection.close_ok, +%% *closing* %% receive frame -> ignore, *closing* %% handshake_timeout -> ignore, *closing* %% heartbeat timeout -> *throw* @@ -119,6 +121,8 @@ %% start terminate_connection timer, *closed* %% closed: %% socket close -> *terminate* +%% receive connection.close -> send connection.close_ok, +%% *closed* %% receive connection.close_ok -> self() ! terminate_connection, %% *closed* %% receive frame -> ignore, *closed* @@ -674,6 +678,12 @@ handle_method0(#'connection.close'{}, State = #v1{connection_state = running}) -> lists:foreach(fun rabbit_framing_channel:shutdown/1, all_channels()), maybe_close(State#v1{connection_state = closing}); +handle_method0(#'connection.close'{}, State = #v1{connection_state = CS}) + when CS =:= closing; CS =:= closed -> + %% We're already closed or closing, so we don't need to cleanup + %% anything. + ok = send_on_channel0(State#v1.sock, #'connection.close_ok'{}), + State; handle_method0(#'connection.close_ok'{}, State = #v1{connection_state = closed}) -> self() ! terminate_connection, -- cgit v1.2.1 From 316912564f15dbbfbfc995bf177bb721b7539137 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Fri, 25 Jun 2010 12:14:30 +0100 Subject: Simplify logic, plus cosmetics. Both conditionals can now be read as: if we find the eldest of our requirements and the current version, and if that eldest thing is not our requirement then we must have something older, so we take some action --- Makefile | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index fc1aea8f..3f270783 100644 --- a/Makefile +++ b/Makefile @@ -62,9 +62,6 @@ ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e ERL_EBIN=erl -noinput -pa $(EBIN_DIR) -# Versions prior to this are not supported -NEED_MAKE := 3.80 - define usage_xml_to_erl $(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, $(SOURCE_DIR)/rabbit_%_usage.erl, $(subst -,_,$(1)))) endef @@ -79,11 +76,16 @@ SCRIPTS_REL_PATH=$(shell ./calculate-relative $(TARGET_DIR)/sbin $(SBIN_DIR)) endif endif -ifeq ($(filter $(NEED_MAKE),$(firstword $(sort $(NEED_MAKE) $(MAKE_VERSION)))),) +# Versions prior to this are not supported +NEED_MAKE := 3.80 +ifneq "$(NEED_MAKE)" "$(firstword $(sort $(NEED_MAKE) $(MAKE_VERSION)))" $(error Versions of make prior to $(NEED_MAKE) are not supported) endif -ifeq ($(filter 3.81,$(firstword $(sort 3.81 $(MAKE_VERSION)))),) -.DEFAULT_GOAL=all # Introduced in 3.81 + +# .DEFAULT_GOAL introduced in 3.81 +DEFAULT_GOAL_MAKE := 3.81 +ifneq "$(DEFAULT_GOAL_MAKE)" "$(firstword $(sort $(DEFAULT_GOAL_MAKE) $(MAKE_VERSION)))" +.DEFAULT_GOAL=all endif all: $(TARGETS) -- cgit v1.2.1 From a118ccb00917a78174fd481be131664e44a2914d Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Fri, 25 Jun 2010 16:56:03 +0100 Subject: Avoid unnecessary mnesia lookup and significantly simplify queue declaration code --- src/rabbit_channel.erl | 57 +++++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index d337df29..8649ecc7 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -726,42 +726,33 @@ handle_method(#'queue.declare'{queue = QueueNameBin, end, %% We use this in both branches, because queue_declare may yet return an %% existing queue. - Finish = fun (#amqqueue{name = QueueName, - durable = Durable1, - auto_delete = AutoDelete1} = Q) - when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> - check_exclusive_access(Q, Owner, strict), - check_configure_permitted(QueueName, State), - %% We need to notify the reader within the channel - %% process so that we can be sure there are no - %% outstanding exclusive queues being declared as the - %% connection shuts down. - case Owner of - none -> ok; - _ -> ok = rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q) - end, - Q; - %% non-equivalence trumps exclusivity arbitrarily - (#amqqueue{name = QueueName}) -> - rabbit_misc:protocol_error( - precondition_failed, - "parameters for ~s not equivalent", - [rabbit_misc:rs(QueueName)]) - end, - Q = case rabbit_amqqueue:with( - rabbit_misc:r(VHostPath, queue, QueueNameBin), - Finish) of - {error, not_found} -> - ActualNameBin = - case QueueNameBin of + ActualNameBin = case QueueNameBin of <<>> -> rabbit_guid:binstring_guid("amq.gen"); Other -> check_name('queue', Other) end, - QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), - Finish(rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, - Args, Owner)); - #amqqueue{} = Other -> - Other + QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), + Q = case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, + Args, Owner) of + #amqqueue{name = QueueName, + durable = Durable1, + auto_delete = AutoDelete1} = Q1 + when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> + check_exclusive_access(Q1, Owner, strict), + check_configure_permitted(QueueName, State), + %% We need to notify the reader within the channel + %% process so that we can be sure there are no + %% outstanding exclusive queues being declared as the + %% connection shuts down. + case Owner of + none -> ok; + _ -> ok = rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q1) + end, + Q1; + %% non-equivalence trumps exclusivity arbitrarily + #amqqueue{name = QueueName} -> + rabbit_misc:protocol_error( + precondition_failed, "parameters for ~s not equivalent", + [rabbit_misc:rs(QueueName)]) end, return_queue_declare_ok(State, NoWait, Q); -- cgit v1.2.1 From 3e14d8d9d0ae179ac11a1ebb0b177830171593e2 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 29 Jun 2010 16:07:32 +0100 Subject: Rework queue declaration to avoid a race condition that could result in incorrect values in the queue.declare_ok --- src/rabbit_amqqueue.erl | 2 +- src/rabbit_amqqueue_process.erl | 4 +- src/rabbit_channel.erl | 89 +++++++++++++++++++++++------------------ 3 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index eebcfcb9..f0e536b5 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -66,7 +66,7 @@ -spec(start/0 :: () -> 'ok'). -spec(declare/5 :: (queue_name(), boolean(), boolean(), amqp_table(), - maybe(pid())) -> amqqueue()). + maybe(pid())) -> {'new' | 'existing', amqqueue()}). -spec(lookup/1 :: (queue_name()) -> {'ok', amqqueue()} | not_found()). -spec(with/2 :: (queue_name(), qfun(A)) -> A | not_found()). -spec(with_or_die/2 :: (queue_name(), qfun(A)) -> A). diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl index 5fdf0ffa..70e6e755 100644 --- a/src/rabbit_amqqueue_process.erl +++ b/src/rabbit_amqqueue_process.erl @@ -137,7 +137,7 @@ declare(Recover, From, backing_queue = BQ, backing_queue_state = undefined}) -> case rabbit_amqqueue:internal_declare(Q, Recover) of not_found -> {stop, normal, not_found, State}; - Q -> gen_server2:reply(From, Q), + Q -> gen_server2:reply(From, {new, Q}), ok = file_handle_cache:register_callback( rabbit_amqqueue, set_maximum_since_use, [self()]), @@ -146,7 +146,7 @@ declare(Recover, From, set_ram_duration_target, [self()]}), BQS = BQ:init(QName, IsDurable, Recover), noreply(State#q{backing_queue_state = BQS}); - Q1 -> {stop, normal, Q1, State} + Q1 -> {stop, normal, {existing, Q1}, State} end. terminate_shutdown(Fun, State) -> diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 8649ecc7..4a741be7 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -284,17 +284,23 @@ terminating(Reason, State = #ch{channel = Channel, reader_pid = Reader}) -> Reader ! {channel_exit, Channel, Reason}, State#ch{state = terminating}. -return_queue_declare_ok(State, NoWait, Q) -> - NewState = State#ch{most_recently_declared_queue = - (Q#amqqueue.name)#resource.name}, +return_queue_declare_ok(Q = #amqqueue{name = #resource{name = ActualName}}, + NoWait, MessageCount, ConsumerCount, Register, Owner, + State = #ch{queue_collector_pid = CollectorPid}) -> + %% We need to notify the reader within the channel process so that + %% we can be sure there are no outstanding exclusive queues being + %% declared as the connection shuts down. + ok = case Register andalso is_pid(Owner) of + true -> rabbit_reader_queue_collector:register_exclusive_queue( + CollectorPid, Q); + false -> ok + end, + NewState = State#ch{most_recently_declared_queue = ActualName}, case NoWait of - true -> {noreply, NewState}; + true -> + {noreply, NewState}; false -> - {ok, ActualName, MessageCount, ConsumerCount} = - rabbit_misc:with_exit_handler( - fun () -> {ok, Q#amqqueue.name, 0, 0} end, - fun () -> rabbit_amqqueue:stat(Q) end), - Reply = #'queue.declare_ok'{queue = ActualName#resource.name, + Reply = #'queue.declare_ok'{queue = ActualName, message_count = MessageCount, consumer_count = ConsumerCount}, {reply, Reply, NewState} @@ -716,10 +722,9 @@ handle_method(#'queue.declare'{queue = QueueNameBin, exclusive = ExclusiveDeclare, auto_delete = AutoDelete, nowait = NoWait, - arguments = Args}, + arguments = Args} = Declare, _, State = #ch{virtual_host = VHostPath, - reader_pid = ReaderPid, - queue_collector_pid = CollectorPid}) -> + reader_pid = ReaderPid}) -> Owner = case ExclusiveDeclare of true -> ReaderPid; false -> none @@ -731,30 +736,33 @@ handle_method(#'queue.declare'{queue = QueueNameBin, Other -> check_name('queue', Other) end, QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), - Q = case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, - Args, Owner) of - #amqqueue{name = QueueName, - durable = Durable1, - auto_delete = AutoDelete1} = Q1 - when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> - check_exclusive_access(Q1, Owner, strict), - check_configure_permitted(QueueName, State), - %% We need to notify the reader within the channel - %% process so that we can be sure there are no - %% outstanding exclusive queues being declared as the - %% connection shuts down. - case Owner of - none -> ok; - _ -> ok = rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q1) - end, - Q1; - %% non-equivalence trumps exclusivity arbitrarily - #amqqueue{name = QueueName} -> - rabbit_misc:protocol_error( - precondition_failed, "parameters for ~s not equivalent", - [rabbit_misc:rs(QueueName)]) - end, - return_queue_declare_ok(State, NoWait, Q); + case rabbit_amqqueue:with(QueueName, + fun (Q) -> {rabbit_amqqueue:stat(Q), Q} end) of + {{ok, _ActualName, MessageCount1, ConsumerCount1}, + #amqqueue{name = QueueName, durable = Durable1, + auto_delete = AutoDelete1} = Q1} + when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> + check_exclusive_access(Q1, Owner, strict), + check_configure_permitted(QueueName, State), + return_queue_declare_ok(Q1, NoWait, MessageCount1, ConsumerCount1, + false, Owner, State); + {{ok, _ActualName, _MessageCount1, _ConsumerCount1}, + #amqqueue{name = QueueName}} -> + rabbit_misc:protocol_error( + precondition_failed, "parameters for ~s not equivalent", + [rabbit_misc:rs(QueueName)]); + {error, not_found} -> + case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, + Args, Owner) of + {new, Q1 = #amqqueue{}} -> + return_queue_declare_ok(Q1, NoWait, 0, 0, true, Owner, + State); + {existing, _Q1} -> + %% must have been created between the stat and the + %% declare. Loop around again. + handle_method(Declare, undefined, State) + end + end; handle_method(#'queue.declare'{queue = QueueNameBin, passive = true, @@ -762,9 +770,14 @@ handle_method(#'queue.declare'{queue = QueueNameBin, _, State = #ch{virtual_host = VHostPath, reader_pid = ReaderPid}) -> QueueName = rabbit_misc:r(VHostPath, queue, QueueNameBin), + {{ok, _ActualName, MessageCount, ConsumerCount}, + #amqqueue{name = QueueName} = Q} = + rabbit_amqqueue:with_or_die( + QueueName, fun (Q1) -> {rabbit_amqqueue:stat(Q1), Q1} end), check_configure_permitted(QueueName, State), - Q = with_exclusive_access_or_die(QueueName, ReaderPid, fun (Q) -> Q end), - return_queue_declare_ok(State, NoWait, Q); + check_exclusive_access(Q, ReaderPid, lax), + return_queue_declare_ok(Q, NoWait, MessageCount, ConsumerCount, + false, none, State); handle_method(#'queue.delete'{queue = QueueNameBin, if_unused = IfUnused, -- cgit v1.2.1 From ac87cd4aec22dafad101d5b415b793631feda50d Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 29 Jun 2010 16:40:53 +0100 Subject: Make tests pass again and correct placement of permission check --- src/rabbit_channel.erl | 10 +++++----- src/rabbit_tests.erl | 7 ++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 4a741be7..01f41a0c 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -736,17 +736,17 @@ handle_method(#'queue.declare'{queue = QueueNameBin, Other -> check_name('queue', Other) end, QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), + check_configure_permitted(QueueName, State), case rabbit_amqqueue:with(QueueName, fun (Q) -> {rabbit_amqqueue:stat(Q), Q} end) of - {{ok, _ActualName, MessageCount1, ConsumerCount1}, + {{ok, _ActualName, MessageCount, ConsumerCount}, #amqqueue{name = QueueName, durable = Durable1, auto_delete = AutoDelete1} = Q1} when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> check_exclusive_access(Q1, Owner, strict), - check_configure_permitted(QueueName, State), - return_queue_declare_ok(Q1, NoWait, MessageCount1, ConsumerCount1, + return_queue_declare_ok(Q1, NoWait, MessageCount, ConsumerCount, false, Owner, State); - {{ok, _ActualName, _MessageCount1, _ConsumerCount1}, + {{ok, _ActualName, _MessageCount, _ConsumerCount}, #amqqueue{name = QueueName}} -> rabbit_misc:protocol_error( precondition_failed, "parameters for ~s not equivalent", @@ -770,11 +770,11 @@ handle_method(#'queue.declare'{queue = QueueNameBin, _, State = #ch{virtual_host = VHostPath, reader_pid = ReaderPid}) -> QueueName = rabbit_misc:r(VHostPath, queue, QueueNameBin), + check_configure_permitted(QueueName, State), {{ok, _ActualName, MessageCount, ConsumerCount}, #amqqueue{name = QueueName} = Q} = rabbit_amqqueue:with_or_die( QueueName, fun (Q1) -> {rabbit_amqqueue:stat(Q1), Q1} end), - check_configure_permitted(QueueName, State), check_exclusive_access(Q, ReaderPid, lax), return_queue_declare_ok(Q, NoWait, MessageCount, ConsumerCount, false, none, State); diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index cf782497..34eec121 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -792,10 +792,11 @@ test_server_status() -> Writer = spawn(fun () -> receive shutdown -> ok end end), Ch = rabbit_channel:start_link(1, self(), Writer, <<"user">>, <<"/">>, self()), - [Q, Q2] = [#amqqueue{} = rabbit_amqqueue:declare( + [Q, Q2] = [Queue || Name <- [<<"foo">>, <<"bar">>], + {new, Queue = #amqqueue{}} <- + [rabbit_amqqueue:declare( rabbit_misc:r(<<"/">>, queue, Name), - false, false, [], none) || - Name <- [<<"foo">>, <<"bar">>]], + false, false, [], none)]], ok = rabbit_amqqueue:basic_consume(Q, true, Ch, undefined, <<"ctag">>, true, undefined), -- cgit v1.2.1 From 1467ba4646df2ffed9848431613a0d4e1bb5fda9 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 29 Jun 2010 16:44:03 +0100 Subject: Cosmetic --- src/rabbit_channel.erl | 12 +++++------- src/rabbit_networking.erl | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 01f41a0c..703a0690 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -297,13 +297,11 @@ return_queue_declare_ok(Q = #amqqueue{name = #resource{name = ActualName}}, end, NewState = State#ch{most_recently_declared_queue = ActualName}, case NoWait of - true -> - {noreply, NewState}; - false -> - Reply = #'queue.declare_ok'{queue = ActualName, - message_count = MessageCount, - consumer_count = ConsumerCount}, - {reply, Reply, NewState} + true -> {noreply, NewState}; + false -> Reply = #'queue.declare_ok'{queue = ActualName, + message_count = MessageCount, + consumer_count = ConsumerCount}, + {reply, Reply, NewState} end. check_resource_access(Username, Resource, Perm) -> diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index c3d0b7b7..68ffc98a 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -102,7 +102,7 @@ boot_ssl() -> {ok, []} -> ok; {ok, SslListeners} -> - ok = rabbit_misc:start_applications([crypto, ssl]), + ok = rabbit_misc:start_applications([crypto, public_key, ssl]), {ok, SslOpts} = application:get_env(ssl_options), [start_ssl_listener(Host, Port, SslOpts) || {Host, Port} <- SslListeners], ok -- cgit v1.2.1 From eb538fe4426b87938f3150cd6421a91b96887b6f Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Wed, 30 Jun 2010 11:46:59 +0100 Subject: As predicted, changing this from sets:from_list/sets:fold to lists:usort/lists:foldl has a decent performance improvement, moving from being able to sustain 8kHz on a topic exchang to 8.5kHz on a topic exchange --- src/rabbit_router.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rabbit_router.erl b/src/rabbit_router.erl index 5cd15a94..75196bc0 100644 --- a/src/rabbit_router.erl +++ b/src/rabbit_router.erl @@ -90,13 +90,13 @@ match_routing_key(Name, RoutingKey) -> lookup_qpids(mnesia:dirty_select(rabbit_route, [{MatchHead, [], ['$1']}])). lookup_qpids(Queues) -> - sets:fold( + lists:foldl( fun (Key, Acc) -> case mnesia:dirty_read({rabbit_queue, Key}) of [#amqqueue{pid = QPid}] -> [QPid | Acc]; [] -> Acc end - end, [], sets:from_list(Queues)). + end, [], lists:usort(Queues)). %%-------------------------------------------------------------------- -- cgit v1.2.1 From fe76518a13ba6e8e41eb0d5d5d69155d24384d25 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Wed, 30 Jun 2010 12:35:37 +0100 Subject: Refactoring and cosmetics --- src/rabbit_channel.erl | 70 +++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 703a0690..179a9a9d 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -284,17 +284,8 @@ terminating(Reason, State = #ch{channel = Channel, reader_pid = Reader}) -> Reader ! {channel_exit, Channel, Reason}, State#ch{state = terminating}. -return_queue_declare_ok(Q = #amqqueue{name = #resource{name = ActualName}}, - NoWait, MessageCount, ConsumerCount, Register, Owner, - State = #ch{queue_collector_pid = CollectorPid}) -> - %% We need to notify the reader within the channel process so that - %% we can be sure there are no outstanding exclusive queues being - %% declared as the connection shuts down. - ok = case Register andalso is_pid(Owner) of - true -> rabbit_reader_queue_collector:register_exclusive_queue( - CollectorPid, Q); - false -> ok - end, +return_queue_declare_ok(#resource{name = ActualName}, + NoWait, MessageCount, ConsumerCount, State) -> NewState = State#ch{most_recently_declared_queue = ActualName}, case NoWait of true -> {noreply, NewState}; @@ -714,21 +705,20 @@ handle_method(#'exchange.delete'{exchange = ExchangeNameBin, return_ok(State, NoWait, #'exchange.delete_ok'{}) end; -handle_method(#'queue.declare'{queue = QueueNameBin, - passive = false, - durable = Durable, - exclusive = ExclusiveDeclare, - auto_delete = AutoDelete, - nowait = NoWait, - arguments = Args} = Declare, +handle_method(Declare = #'queue.declare'{queue = QueueNameBin, + passive = false, + durable = Durable, + exclusive = ExclusiveDeclare, + auto_delete = AutoDelete, + nowait = NoWait, + arguments = Args}, _, State = #ch{virtual_host = VHostPath, - reader_pid = ReaderPid}) -> + reader_pid = ReaderPid, + queue_collector_pid = CollectorPid}) -> Owner = case ExclusiveDeclare of true -> ReaderPid; false -> none end, - %% We use this in both branches, because queue_declare may yet return an - %% existing queue. ActualNameBin = case QueueNameBin of <<>> -> rabbit_guid:binstring_guid("amq.gen"); Other -> check_name('queue', Other) @@ -737,25 +727,30 @@ handle_method(#'queue.declare'{queue = QueueNameBin, check_configure_permitted(QueueName, State), case rabbit_amqqueue:with(QueueName, fun (Q) -> {rabbit_amqqueue:stat(Q), Q} end) of - {{ok, _ActualName, MessageCount, ConsumerCount}, - #amqqueue{name = QueueName, durable = Durable1, - auto_delete = AutoDelete1} = Q1} + {{ok, QueueName, MessageCount, ConsumerCount}, + #amqqueue{durable = Durable1, auto_delete = AutoDelete1} = Q} when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> - check_exclusive_access(Q1, Owner, strict), - return_queue_declare_ok(Q1, NoWait, MessageCount, ConsumerCount, - false, Owner, State); - {{ok, _ActualName, _MessageCount, _ConsumerCount}, - #amqqueue{name = QueueName}} -> + check_exclusive_access(Q, Owner, strict), + return_queue_declare_ok(QueueName, NoWait, MessageCount, + ConsumerCount, State); + {{ok, QueueName, _MessageCount, _ConsumerCount}, #amqqueue{}} -> rabbit_misc:protocol_error( precondition_failed, "parameters for ~s not equivalent", [rabbit_misc:rs(QueueName)]); {error, not_found} -> case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, Args, Owner) of - {new, Q1 = #amqqueue{}} -> - return_queue_declare_ok(Q1, NoWait, 0, 0, true, Owner, - State); - {existing, _Q1} -> + {new, Q = #amqqueue{}} -> + %% We need to notify the reader within the channel + %% process so that we can be sure there are no + %% outstanding exclusive queues being declared as + %% the connection shuts down. + ok = case Owner of + none -> ok; + _ -> rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q) + end, + return_queue_declare_ok(QueueName, NoWait, 0, 0, State); + {existing, _Q} -> %% must have been created between the stat and the %% declare. Loop around again. handle_method(Declare, undefined, State) @@ -769,13 +764,12 @@ handle_method(#'queue.declare'{queue = QueueNameBin, reader_pid = ReaderPid}) -> QueueName = rabbit_misc:r(VHostPath, queue, QueueNameBin), check_configure_permitted(QueueName, State), - {{ok, _ActualName, MessageCount, ConsumerCount}, - #amqqueue{name = QueueName} = Q} = + {{ok, QueueName, MessageCount, ConsumerCount}, #amqqueue{} = Q} = rabbit_amqqueue:with_or_die( - QueueName, fun (Q1) -> {rabbit_amqqueue:stat(Q1), Q1} end), + QueueName, fun (Q) -> {rabbit_amqqueue:stat(Q), Q} end), check_exclusive_access(Q, ReaderPid, lax), - return_queue_declare_ok(Q, NoWait, MessageCount, ConsumerCount, - false, none, State); + return_queue_declare_ok(QueueName, NoWait, MessageCount, ConsumerCount, + State); handle_method(#'queue.delete'{queue = QueueNameBin, if_unused = IfUnused, -- cgit v1.2.1 From ec28eca027504b57fcfe835705b248caef4fbdaf Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 30 Jun 2010 17:21:06 +0100 Subject: Fix auto-delete on unbind. --- src/rabbit_exchange.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 7072055c..ef818ef4 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -438,11 +438,11 @@ delete_binding(ExchangeName, QueueName, RoutingKey, Arguments, InnerFun) -> end) of Err = {error, _} -> Err; - {{Action, X = #exchange{ type = Type }}, B} -> + {{IsDeleted, X = #exchange{ type = Type }}, B} -> Module = type_to_module(Type), - case Action of - auto_delete -> Module:delete(X, [B]); - no_delete -> Module:remove_bindings(X, [B]) + case IsDeleted of + auto_deleted -> Module:delete(X, [B]); + no_delete -> Module:remove_bindings(X, [B]) end end. -- cgit v1.2.1 From 6bad1a486a8aecaead8fe1d77c3b414ab920884b Mon Sep 17 00:00:00 2001 From: Simon MacMullen Date: Wed, 30 Jun 2010 17:38:19 +0100 Subject: Rename no_delete to not_deleted, makes things clearer. --- src/rabbit_exchange.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index ef818ef4..d77bf833 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -335,7 +335,7 @@ delete_queue_bindings(QueueName, FwdDeleteFun) -> Module = type_to_module(Type), case IsDeleted of auto_deleted -> Module:delete(X, Bs); - no_delete -> Module:remove_bindings(X, Bs) + not_deleted -> Module:remove_bindings(X, Bs) end end, Cleanup) end. @@ -442,7 +442,7 @@ delete_binding(ExchangeName, QueueName, RoutingKey, Arguments, InnerFun) -> Module = type_to_module(Type), case IsDeleted of auto_deleted -> Module:delete(X, [B]); - no_delete -> Module:remove_bindings(X, [B]) + not_deleted -> Module:remove_bindings(X, [B]) end end. @@ -526,10 +526,10 @@ delete(ExchangeName, IfUnused) -> end. maybe_auto_delete(Exchange = #exchange{auto_delete = false}) -> - {no_delete, Exchange}; + {not_deleted, Exchange}; maybe_auto_delete(Exchange = #exchange{auto_delete = true}) -> case conditional_delete(Exchange) of - {error, in_use} -> {no_delete, Exchange}; + {error, in_use} -> {not_deleted, Exchange}; {deleted, Exchange, []} -> {auto_deleted, Exchange} end. -- cgit v1.2.1 From ccee79c48fd15c0857d1247b2bb4cb8d0e181555 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 1 Jul 2010 10:43:27 +0100 Subject: cosmetic --- src/rabbit_channel.erl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 179a9a9d..e16cb2de 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -705,13 +705,13 @@ handle_method(#'exchange.delete'{exchange = ExchangeNameBin, return_ok(State, NoWait, #'exchange.delete_ok'{}) end; -handle_method(Declare = #'queue.declare'{queue = QueueNameBin, - passive = false, - durable = Durable, - exclusive = ExclusiveDeclare, - auto_delete = AutoDelete, - nowait = NoWait, - arguments = Args}, +handle_method(#'queue.declare'{queue = QueueNameBin, + passive = false, + durable = Durable, + exclusive = ExclusiveDeclare, + auto_delete = AutoDelete, + nowait = NoWait, + arguments = Args} = Declare, _, State = #ch{virtual_host = VHostPath, reader_pid = ReaderPid, queue_collector_pid = CollectorPid}) -> -- cgit v1.2.1 From ab01e05df695781eafb16239f744b86b7347c3c0 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 1 Jul 2010 10:43:59 +0100 Subject: recurse with the correct value not that it matters --- src/rabbit_channel.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index e16cb2de..1d91494b 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -753,7 +753,7 @@ handle_method(#'queue.declare'{queue = QueueNameBin, {existing, _Q} -> %% must have been created between the stat and the %% declare. Loop around again. - handle_method(Declare, undefined, State) + handle_method(Declare, none, State) end end; -- cgit v1.2.1 From 084e69a6adf36365d253826239d11ff90f5587aa Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 1 Jul 2010 11:06:09 +0100 Subject: cosmetic: remove trailing whitespace --- src/rabbit_amqqueue.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index f0e536b5..378d0cbc 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -395,7 +395,7 @@ delegate_call(Pid, Msg, Timeout) -> delegate:invoke(Pid, fun (P) -> gen_server2:call(P, Msg, Timeout) end). delegate_pcall(Pid, Pri, Msg, Timeout) -> - delegate:invoke(Pid, + delegate:invoke(Pid, fun (P) -> gen_server2:pcall(P, Pri, Msg, Timeout) end). delegate_pcast(Pid, Pri, Msg) -> -- cgit v1.2.1