summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Lazu <gerhard@lazu.co.uk>2018-03-20 17:21:31 +0000
committerMichael Klishin <michael@clojurewerkz.org>2018-03-28 00:56:36 +0300
commit876cd3117ff755caf9ed52a1b96f76d3276e7bf5 (patch)
tree2d6d0e2aa5c9cc1e3267735b09dc1a2257dbedea
parent37ef9722bdf11905300b9684a03f97d8d7c04d25 (diff)
downloadrabbitmq-server-git-876cd3117ff755caf9ed52a1b96f76d3276e7bf5.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(