summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-01-04 11:26:57 +0000
committerMatthias Radestock <matthias@lshift.net>2009-01-04 11:26:57 +0000
commit0e47200c11c7c1849e2a5aef44509496118ca819 (patch)
tree19dd0991c86990409ad86edba2db41127191c2d9
parent25c7fce0665be4a7dca8d67827ef88e606477178 (diff)
parentcd69f807e6546b115c92728ef38ced6a1978577f (diff)
downloadrabbitmq-server-0e47200c11c7c1849e2a5aef44509496118ca819.tar.gz
merge default into v1_5_1
All the changes made on 'default' so far should go into v1_5_1. Which is lucky since we don't have to cherry pick.
-rw-r--r--ebin/rabbit.app11
-rwxr-xr-xscripts/rabbitmq-server4
-rw-r--r--src/rabbit_channel.erl13
-rw-r--r--src/rabbit_exchange.erl20
4 files changed, 35 insertions, 13 deletions
diff --git a/ebin/rabbit.app b/ebin/rabbit.app
index 93abd456..70a13208 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,
diff --git a/scripts/rabbitmq-server b/scripts/rabbitmq-server
index bb65d64d..572262c9 100755
--- a/scripts/rabbitmq-server
+++ b/scripts/rabbitmq-server
@@ -38,8 +38,8 @@
[ "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_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_channel.erl b/src/rabbit_channel.erl
index 5d7fde90..ca2782c7 100644
--- a/src/rabbit_channel.erl
+++ b/src/rabbit_channel.erl
@@ -111,20 +111,23 @@ init(ProxyPid, [ReaderPid, WriterPid, Username, VHost]) ->
consumer_mapping = dict:new()}.
handle_message({method, Method, Content}, State) ->
- case (catch handle_method(Method, Content, State)) of
+ try 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}} ->
+ exit(normal)
+ 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 299747d1..925c335c 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