Classic queues: return basic info items without calling queue process

This should make listing for example only names of queues faster if
there are a lot of classic queues.

(cherry picked from commit 21556b57e6)
This commit is contained in:
Péter Gömöri 2023-11-22 18:27:20 +01:00 committed by Mergify
parent 3c349b3e11
commit b7f3e10824
1 changed files with 65 additions and 0 deletions

View File

@ -18,6 +18,19 @@
monitored = #{} :: #{pid() => ok}
}).
-define(STATIC_KEYS, [name,
durable,
auto_delete,
arguments,
pid,
leader,
members,
owner_pid,
exclusive,
policy,
operator_policy,
effective_policy_definition,
type]).
-opaque state() :: #?STATE{}.
@ -491,6 +504,16 @@ state_info(_State) ->
-spec info(amqqueue:amqqueue(), all_keys | rabbit_types:info_keys()) ->
rabbit_types:infos().
info(Q, Items) ->
AllStaticItems = is_list(Items) andalso
lists:all(fun(I) -> lists:member(I, ?STATIC_KEYS) end, Items),
case AllStaticItems of
true ->
static_info(Q, Items);
false ->
info_call(Q, Items)
end.
info_call(Q, Items) ->
QPid = amqqueue:get_pid(Q),
Req = case Items of
all_keys -> info;
@ -506,6 +529,48 @@ info(Q, Items) ->
Result
end.
static_info(Q, Items) ->
[{I, i(I, Q)} || I <- Items].
i(name, Q) ->
amqqueue:get_name(Q);
i(durable, Q) ->
amqqueue:is_durable(Q);
i(auto_delete, Q) ->
amqqueue:is_auto_delete(Q);
i(arguments, Q) ->
amqqueue:get_arguments(Q);
i(pid, Q) ->
amqqueue:get_pid(Q);
i(leader, Q) ->
node(i(pid, Q));
i(members, Q) ->
[i(leader, Q)];
i(owner_pid, Q) when ?amqqueue_exclusive_owner_is(Q, none) ->
'';
i(owner_pid, Q) ->
amqqueue:get_exclusive_owner(Q);
i(exclusive, Q) ->
ExclusiveOwner = amqqueue:get_exclusive_owner(Q),
is_pid(ExclusiveOwner);
i(policy, Q) ->
case rabbit_policy:name(Q) of
none -> '';
Policy -> Policy
end;
i(operator_policy, Q) ->
case rabbit_policy:name_op(Q) of
none -> '';
Policy -> Policy
end;
i(effective_policy_definition, Q) ->
case rabbit_policy:effective_definition(Q) of
undefined -> [];
Def -> Def
end;
i(type, _) ->
classic.
-spec purge(amqqueue:amqqueue()) ->
{ok, non_neg_integer()}.
purge(Q) when ?is_amqqueue(Q) ->