From 3cfd58ccb2ac66965501c574c9c7b1c239c78805 Mon Sep 17 00:00:00 2001 From: Karl Nilsson Date: Mon, 17 Mar 2025 17:19:57 +0000 Subject: [PATCH] Ra 2.16.5 - bug fixes and minor improvements Ra improvements: * Don't allow a non-voter to start elections * Register with ra directory before initialising ra server. * Trigger tick_timeout immediately after entering leader state. * Set a configurable segment max size This commit also includes a change to turn the quorum queue become leader callback to become a noop and instead rely on the more promptly tick_handler to handle the meta data store update after a leader election. This more prompt tick update means there should be a much shorter gap between the queue metrics being deleted from the old leader node to them being available again on the new node resulting in smoother message count metrics. Fix test that relied on waiting on too simplistic a property before asserting. (cherry picked from commit 4fe96dfd2740d5676724aa986d35cf47fd4b007f) --- deps/rabbit/src/rabbit_quorum_queue.erl | 19 ++-- .../test/rabbit_mgmt_only_http_SUITE.erl | 87 +++++++++---------- rabbitmq-components.mk | 2 +- 3 files changed, 51 insertions(+), 57 deletions(-) diff --git a/deps/rabbit/src/rabbit_quorum_queue.erl b/deps/rabbit/src/rabbit_quorum_queue.erl index 0d99e9a8bd9..4ec9499add1 100644 --- a/deps/rabbit/src/rabbit_quorum_queue.erl +++ b/deps/rabbit/src/rabbit_quorum_queue.erl @@ -425,11 +425,10 @@ local_or_remote_handler(ChPid, Module, Function, Args) -> erpc:cast(Node, Module, Function, Args) end. -become_leader(QName, Name) -> - %% as this function is called synchronously when a ra node becomes leader - %% we need to ensure there is no chance of blocking as else the ra node - %% may not be able to establish its leadership - spawn(fun () -> become_leader0(QName, Name) end). +become_leader(_QName, _Name) -> + %% noop now as we instead rely on the promt tick_timeout + repair to update + %% the meta data store after a leader change + ok. become_leader0(QName, Name) -> Fun = fun (Q1) -> @@ -580,7 +579,6 @@ handle_tick(QName, Nodes) -> %% this makes calls to remote processes so cannot be run inside the %% ra server - Self = self(), spawn( fun() -> try @@ -638,7 +636,7 @@ handle_tick(QName, end} | Infos0], rabbit_core_metrics:queue_stats(QName, Infos), - ok = repair_leader_record(Q, Self), + ok = repair_leader_record(Q, Name), case repair_amqqueue_nodes(Q) of ok -> ok; @@ -675,7 +673,7 @@ handle_tick(QName, Config, _Nodes) -> rabbit_log:debug("~ts: handle tick received unexpected config format ~tp", [rabbit_misc:rs(QName), Config]). -repair_leader_record(Q, Self) -> +repair_leader_record(Q, Name) -> Node = node(), case amqqueue:get_pid(Q) of {_, Node} -> @@ -683,9 +681,8 @@ repair_leader_record(Q, Self) -> ok; _ -> QName = amqqueue:get_name(Q), - rabbit_log:debug("~ts: repairing leader record", - [rabbit_misc:rs(QName)]), - {_, Name} = erlang:process_info(Self, registered_name), + rabbit_log:debug("~ts: updating leader record to current node ~b", + [rabbit_misc:rs(QName), Node]), ok = become_leader0(QName, Name), ok end, diff --git a/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl b/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl index 39e4addb2b7..38591b81a69 100644 --- a/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl +++ b/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl @@ -482,53 +482,50 @@ queues_enable_totals_test(Config) -> Publish(<<"foo">>), Fun = fun() -> - length(rabbit_ct_broker_helpers:rpc(Config, 0, ets, tab2list, - [queue_coarse_metrics])) == 2 + Queues = http_get(Config, "/queues/%2F"), + Queue = http_get(Config, "/queues/%2F/foo"), + + Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename), + NodeBin = atom_to_binary(Node, utf8), + assert_list([#{name => <<"baz">>, + vhost => <<"/">>, + durable => true, + auto_delete => false, + exclusive => false, + arguments => #{'x-queue-type' => <<"classic">>}, + node => NodeBin, + messages => 1, + messages_ready => 1, + messages_unacknowledged => 0}, + #{name => <<"foo">>, + vhost => <<"/">>, + durable => true, + auto_delete => false, + exclusive => null, + arguments => #{'x-queue-type' => <<"quorum">>}, + leader => NodeBin, + messages => 2, + messages_ready => 2, + messages_unacknowledged => 0, + members => [NodeBin]}], Queues), + assert_item(#{name => <<"foo">>, + vhost => <<"/">>, + durable => true, + auto_delete => false, + exclusive => null, + arguments => #{'x-queue-type' => <<"quorum">>}, + leader => NodeBin, + messages => 2, + messages_ready => 2, + messages_unacknowledged => 0, + members => [NodeBin]}, Queue), + + ?assert(not maps:is_key(message_stats, Queue)), + ?assert(not maps:is_key(messages_details, Queue)), + ?assert(not maps:is_key(reductions_details, Queue)), + true end, await_condition(Fun), - - Queues = http_get(Config, "/queues/%2F"), - Queue = http_get(Config, "/queues/%2F/foo"), - - Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename), - NodeBin = atom_to_binary(Node, utf8), - assert_list([#{name => <<"baz">>, - vhost => <<"/">>, - durable => true, - auto_delete => false, - exclusive => false, - arguments => #{'x-queue-type' => <<"classic">>}, - node => NodeBin, - messages => 1, - messages_ready => 1, - messages_unacknowledged => 0}, - #{name => <<"foo">>, - vhost => <<"/">>, - durable => true, - auto_delete => false, - exclusive => null, - arguments => #{'x-queue-type' => <<"quorum">>}, - leader => NodeBin, - messages => 2, - messages_ready => 2, - messages_unacknowledged => 0, - members => [NodeBin]}], Queues), - assert_item(#{name => <<"foo">>, - vhost => <<"/">>, - durable => true, - auto_delete => false, - exclusive => null, - arguments => #{'x-queue-type' => <<"quorum">>}, - leader => NodeBin, - messages => 2, - messages_ready => 2, - messages_unacknowledged => 0, - members => [NodeBin]}, Queue), - - ?assert(not maps:is_key(message_stats, Queue)), - ?assert(not maps:is_key(messages_details, Queue)), - ?assert(not maps:is_key(reductions_details, Queue)), - http_delete(Config, "/queues/%2F/foo", {group, '2xx'}), http_delete(Config, "/queues/%2F/baz", {group, '2xx'}), close_connection(Conn), diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk index 3f9dd3eec75..bc229185a1f 100644 --- a/rabbitmq-components.mk +++ b/rabbitmq-components.mk @@ -51,7 +51,7 @@ dep_khepri_mnesia_migration = hex 0.7.1 dep_meck = hex 1.0.0 dep_osiris = git https://github.com/rabbitmq/osiris v1.8.6 dep_prometheus = hex 4.11.0 -dep_ra = hex 2.16.3 +dep_ra = hex 2.16.5 dep_ranch = hex 2.2.0 dep_recon = hex 2.5.6 dep_redbug = hex 2.0.7