summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGerhard Lazu <gerhard@lazu.co.uk>2018-02-22 14:35:55 +0000
committerGerhard Lazu <gerhard@lazu.co.uk>2018-03-27 16:07:35 +0100
commit034003932683f8669be0c743de2a3654adac78d2 (patch)
tree312f66a0d9c3896a252b2b8c5c4a3cedff682c5b /src
parent0752ddb4dc5f78673605616a038057616c08cc6c (diff)
downloadrabbitmq-server-git-034003932683f8669be0c743de2a3654adac78d2.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)}.