summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Nilsson <kjnilsson@gmail.com>2021-11-09 15:34:44 +0000
committerKarl Nilsson <kjnilsson@gmail.com>2021-11-10 09:10:55 +0000
commitd2fde27b565780c2b443138557c27f7ee650f250 (patch)
tree52f932eb5ada5dda0b30a546c0666e6e8a874472
parente721ab291f2c1ec2a348d917ff4913cf8b1dc7c6 (diff)
downloadrabbitmq-server-git-d2fde27b565780c2b443138557c27f7ee650f250.tar.gz
Avoid slow mnesia transaction on QQ initqq-init-opts
As we only need to make sure the rabbit_queues table is populated use a dirty write function that only does this instead. This could potentially half recovery times for many QQ scenarios.
-rw-r--r--deps/rabbit/src/rabbit_amqqueue.erl4
-rw-r--r--deps/rabbit/src/rabbit_quorum_queue.erl3
2 files changed, 6 insertions, 1 deletions
diff --git a/deps/rabbit/src/rabbit_amqqueue.erl b/deps/rabbit/src/rabbit_amqqueue.erl
index c7c774dee0..a10b30e0a5 100644
--- a/deps/rabbit/src/rabbit_amqqueue.erl
+++ b/deps/rabbit/src/rabbit_amqqueue.erl
@@ -7,6 +7,7 @@
-module(rabbit_amqqueue).
+-export([store_queue_ram_dirty/1]).
-export([warn_file_limit/0]).
-export([recover/1, stop/1, start/1, declare/6, declare/7,
delete_immediately/1, delete_exclusive/2, delete/4, purge/1,
@@ -330,6 +331,9 @@ store_queue(Q) when not ?amqqueue_is_durable(Q) ->
store_queue_ram(Q) ->
ok = mnesia:write(rabbit_queue, rabbit_queue_decorator:set(Q), write).
+store_queue_ram_dirty(Q) ->
+ ok = mnesia:dirty_write(rabbit_queue, rabbit_queue_decorator:set(Q)).
+
-spec update_decorators(name()) -> 'ok'.
update_decorators(Name) ->
diff --git a/deps/rabbit/src/rabbit_quorum_queue.erl b/deps/rabbit/src/rabbit_quorum_queue.erl
index 445345bccd..62a08c5113 100644
--- a/deps/rabbit/src/rabbit_quorum_queue.erl
+++ b/deps/rabbit/src/rabbit_quorum_queue.erl
@@ -569,7 +569,8 @@ recover(_Vhost, Queues) ->
%% present in the rabbit_queue table and not just in
%% rabbit_durable_queue
%% So many code paths are dependent on this.
- {ok, Q} = rabbit_amqqueue:ensure_rabbit_queue_record_is_initialized(Q0),
+ ok = rabbit_amqqueue:store_queue_ram_dirty(Q0),
+ Q = Q0,
case Res of
ok ->
{[Q | R0], F0};