summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGerhard Lazu <gerhard@lazu.co.uk>2018-02-22 14:35:55 +0000
committerMichael Klishin <michael@clojurewerkz.org>2018-03-28 00:56:35 +0300
commit11e8070f83b7a04c90a40b6cbd7c576bf67ca4e5 (patch)
tree16f17c26f015280b64220b4b6a8b4c012a8846f4 /src
parent88945e3814e43431f0dfebb76398412ec484d765 (diff)
downloadrabbitmq-server-git-11e8070f83b7a04c90a40b6cbd7c576bf67ca4e5.tar.gz
Do not read exchange & queue before deleting, simply delete
Doing a wread operation requires a table write lock. Since a delete requires a table write lock as well, we have 2 write locks instead of 1. When Mnesia is under load, this can result in many lock collisions and slow down the entire set of operations. We think that it's better to leverage fast SSDs / NVMEs and defer the Mnesia disk log write optimisation to the filesystem. For more context, see #1513 Partner-in-crime @essen
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_amqqueue.erl7
-rw-r--r--src/rabbit_exchange.erl7
2 files changed, 2 insertions, 12 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index b9f1ba3631..d5c63aec64 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -963,12 +963,7 @@ resume(QPid, ChPid) -> delegate:invoke_no_result(QPid, {gen_server2, cast, [{res
internal_delete1(QueueName, OnlyDurable) ->
ok = mnesia:delete({rabbit_queue, QueueName}),
- %% this 'guarded' delete prevents unnecessary writes to the mnesia
- %% disk log
- case mnesia:wread({rabbit_durable_queue, QueueName}) of
- [] -> ok;
- [_] -> ok = mnesia:delete({rabbit_durable_queue, QueueName})
- end,
+ mnesia:delete({rabbit_durable_queue, QueueName}),
%% we want to execute some things, as decided by rabbit_exchange,
%% after the transaction.
rabbit_binding:remove_for_destination(QueueName, OnlyDurable).
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index cc2797489d..c7a849ce2e 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -497,14 +497,9 @@ conditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
end.
unconditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
- %% this 'guarded' delete prevents unnecessary writes to the mnesia
- %% disk log
- case mnesia:wread({rabbit_durable_exchange, XName}) of
- [] -> ok;
- [_] -> ok = mnesia:delete({rabbit_durable_exchange, XName})
- end,
ok = mnesia:delete({rabbit_exchange, XName}),
ok = mnesia:delete({rabbit_exchange_serial, XName}),
+ mnesia:delete({rabbit_durable_exchange, XName}),
Bindings = rabbit_binding:remove_for_source(XName),
{deleted, X, Bindings, rabbit_binding:remove_for_destination(
XName, OnlyDurable)}.