diff options
| author | Gerhard Lazu <gerhard@lazu.co.uk> | 2018-02-22 14:35:55 +0000 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2018-03-28 00:56:35 +0300 |
| commit | 11e8070f83b7a04c90a40b6cbd7c576bf67ca4e5 (patch) | |
| tree | 16f17c26f015280b64220b4b6a8b4c012a8846f4 /src | |
| parent | 88945e3814e43431f0dfebb76398412ec484d765 (diff) | |
| download | rabbitmq-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.erl | 7 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 7 |
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)}. |
