diff options
| author | Gerhard Lazu <gerhard@lazu.co.uk> | 2018-03-20 17:21:31 +0000 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2018-03-28 00:56:36 +0300 |
| commit | 876cd3117ff755caf9ed52a1b96f76d3276e7bf5 (patch) | |
| tree | 2d6d0e2aa5c9cc1e3267735b09dc1a2257dbedea | |
| parent | 37ef9722bdf11905300b9684a03f97d8d7c04d25 (diff) | |
| download | rabbitmq-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.erl | 17 |
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( |
