summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Lazu <gerhard@lazu.co.uk>2018-03-20 17:21:31 +0000
committerGerhard Lazu <gerhard@lazu.co.uk>2018-03-27 16:07:36 +0100
commitdfa270677f6b5191f0dc994a571728a8bf93957f (patch)
treecc6c52668e1afd17a89bb73a4961ceedf6194c4d
parenteab08df1ffd3ba21174fa688469b547649bc9db2 (diff)
downloadrabbitmq-server-git-dfa270677f6b5191f0dc994a571728a8bf93957f.tar.gz
Run binding deletions in a Mnesia transaction
Otherwise, if there is more than 1 node that runs rabbit_node_monitor:on_node_down/1, there will be `{aborted,no_transaction` errors. {{aborted,no_transaction}, [{mnesia,abort,1,[{file,"mnesia.erl"},{line,351}]}, {rabbit_exchange_type_topic,'-remove_bindings/3-lc$^0/1-0-',1, [{file,"src/rabbit_exchange_type_topic.erl"}, {line,78}]}, {rabbit_exchange_type_topic,remove_bindings,3, [{file,"src/rabbit_exchange_type_topic.erl"}, {line,78}]}, {rabbit_binding,x_callback,4,[{file,"src/rabbit_binding.erl"},{line,570}]}, {rabbit_binding,'-process_deletions/2-fun-0-',2, [{file,"src/rabbit_binding.erl"},{line,547}]}, {dict,map_bucket,2,[{file,"dict.erl"},{line,481}]}, {dict,map_bkt_list,2,[{file,"dict.erl"},{line,477}]}, {dict,map_bkt_list,2,[{file,"dict.erl"},{line,477}]}]} Partner-in-crime: @essen
-rw-r--r--src/rabbit_amqqueue.erl17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 88d7c597f9..ac79d56358 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -1154,11 +1154,18 @@ queues_to_delete_when_node_down(NodeDown) ->
end).
notify_queue_binding_deletions(QueueDeletions) ->
- NotifyBindingDeletions = rabbit_binding:process_deletions(
- lists:foldl(fun rabbit_binding:combine_deletions/2,
- rabbit_binding:new_deletions(), QueueDeletions),
- ?INTERNAL_USER),
- NotifyBindingDeletions().
+ rabbit_misc:execute_mnesia_tx_with_tail(
+ fun() ->
+ rabbit_binding:process_deletions(
+ lists:foldl(
+ fun rabbit_binding:combine_deletions/2,
+ rabbit_binding:new_deletions(),
+ QueueDeletions
+ ),
+ ?INTERNAL_USER
+ )
+ end
+ ).
notify_queues_deleted(QueueDeletions) ->
lists:foreach(