summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <mklishin@pivotal.io>2019-07-08 22:01:21 +0300
committerGitHub <noreply@github.com>2019-07-08 22:01:21 +0300
commitdfcb4d154eada2cd3ff4fc0906dbf8877137bed1 (patch)
treecebda5964958361142a6d18d01fb1958058c6304
parentd35182b709ed91b12b9b988ba28d1dcbf063370d (diff)
parent50ac865517c84e01a122e5a8e92a1313b7114d67 (diff)
downloadrabbitmq-server-git-dfcb4d154eada2cd3ff4fc0906dbf8877137bed1.tar.gz
Merge pull request #2024 from rabbitmq/management-only-apiv3.8.0-beta.5
Queue, connection and exchange count functions
-rw-r--r--src/rabbit_amqqueue.erl6
-rw-r--r--src/rabbit_connection_tracking.erl26
-rw-r--r--src/rabbit_exchange.erl7
-rw-r--r--test/unit_inbroker_non_parallel_SUITE.erl45
4 files changed, 81 insertions, 3 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 9922a3f105..cbe8738c5a 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -30,6 +30,7 @@
-export([list/0, list/1, info_keys/0, info/1, info/2, info_all/1, info_all/2,
emit_info_all/5, list_local/1, info_local/1,
emit_info_local/4, emit_info_down/4]).
+-export([count/0]).
-export([list_down/1, count/1, list_names/0, list_names/1, list_local_names/0,
list_with_possible_retry/1]).
-export([list_by_type/1]).
@@ -792,6 +793,11 @@ list() ->
do_list() ->
mnesia:dirty_match_object(rabbit_queue, amqqueue:pattern_match_all()).
+-spec count() -> non_neg_integer().
+
+count() ->
+ mnesia:table_info(rabbit_queue, size).
+
-spec list_names() -> [rabbit_amqqueue:name()].
list_names() -> mnesia:dirty_all_keys(rabbit_queue).
diff --git a/src/rabbit_connection_tracking.erl b/src/rabbit_connection_tracking.erl
index aa5eb15464..88951eabe9 100644
--- a/src/rabbit_connection_tracking.erl
+++ b/src/rabbit_connection_tracking.erl
@@ -39,7 +39,9 @@
list/0, list/1, list_on_node/1, list_on_node/2, list_of_user/1,
tracked_connection_from_connection_created/1,
tracked_connection_from_connection_state/1,
- count_connections_in/1]).
+ count_connections_in/1,
+ lookup/1,
+ count/0]).
-include_lib("rabbit.hrl").
@@ -287,6 +289,20 @@ unregister_connection(ConnId = {Node, _Name}) when Node =:= node() ->
mnesia:dirty_delete(TableName, ConnId)
end.
+-spec lookup(rabbit_types:connection_name()) -> rabbit_types:tracked_connection() | 'not_found'.
+
+lookup(Name) ->
+ Nodes = rabbit_mnesia:cluster_nodes(running),
+ lookup(Name, Nodes).
+
+lookup(_, []) ->
+ not_found;
+lookup(Name, [Node | Nodes]) ->
+ TableName = tracked_connection_table_name_for(Node),
+ case mnesia:dirty_read(TableName, {Node, Name}) of
+ [] -> lookup(Name, Nodes);
+ [Row] -> Row
+ end.
-spec list() -> [rabbit_types:tracked_connection()].
@@ -297,6 +313,14 @@ list() ->
Acc ++ mnesia:dirty_match_object(Tab, #tracked_connection{_ = '_'})
end, [], rabbit_mnesia:cluster_nodes(running)).
+-spec count() -> non_neg_integer().
+
+count() ->
+ lists:foldl(
+ fun (Node, Acc) ->
+ Tab = tracked_connection_table_name_for(Node),
+ Acc + mnesia:table_info(Tab, size)
+ end, 0, rabbit_mnesia:cluster_nodes(running)).
-spec list(rabbit_types:vhost()) -> [rabbit_types:tracked_connection()].
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index b4ba89ca08..86c11c4ad2 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -23,7 +23,7 @@
lookup/1, lookup_or_die/1, list/0, list/1, lookup_scratch/2,
update_scratch/3, update_decorators/1, immutable/1,
info_keys/0, info/1, info/2, info_all/1, info_all/2, info_all/4,
- route/2, delete/3, validate_binding/2]).
+ route/2, delete/3, validate_binding/2, count/0]).
-export([list_names/0]).
%% these must be run inside a mnesia tx
-export([maybe_auto_delete/2, serial/1, peek_serial/1, update/2]).
@@ -238,6 +238,11 @@ lookup_or_die(Name) ->
list() -> mnesia:dirty_match_object(rabbit_exchange, #exchange{_ = '_'}).
+-spec count() -> non_neg_integer().
+
+count() ->
+ mnesia:table_info(rabbit_exchange, size).
+
-spec list_names() -> [rabbit_exchange:name()].
list_names() -> mnesia:dirty_all_keys(rabbit_exchange).
diff --git a/test/unit_inbroker_non_parallel_SUITE.erl b/test/unit_inbroker_non_parallel_SUITE.erl
index 0f6e5a5de0..4f11adefbc 100644
--- a/test/unit_inbroker_non_parallel_SUITE.erl
+++ b/test/unit_inbroker_non_parallel_SUITE.erl
@@ -18,6 +18,7 @@
-include_lib("eunit/include/eunit.hrl").
-include_lib("common_test/include/ct.hrl").
+-include_lib("eunit/include/eunit.hrl").
-include_lib("kernel/include/file.hrl").
-include_lib("amqp_client/include/amqp_client.hrl").
@@ -42,7 +43,11 @@ groups() ->
log_management, %% Check log files.
log_file_initialised_during_startup,
log_file_fails_to_initialise_during_startup,
- externally_rotated_logs_are_automatically_reopened %% Check log files.
+ externally_rotated_logs_are_automatically_reopened, %% Check log files.
+ exchange_count,
+ queue_count,
+ connection_count,
+ connection_lookup
]}
].
@@ -699,6 +704,44 @@ disk_monitor_enable1() ->
passed.
%% ---------------------------------------------------------------------------
+%% Count functions for management only API purposes
+%% ---------------------------------------------------------------------------
+exchange_count(Config) ->
+ %% Default exchanges == 7
+ ?assertEqual(7, rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_exchange, count, [])).
+
+queue_count(Config) ->
+ Conn = rabbit_ct_client_helpers:open_connection(Config, 0),
+ {ok, Ch} = amqp_connection:open_channel(Conn),
+ amqp_channel:call(Ch, #'queue.declare'{ queue = <<"my-queue">> }),
+
+ ?assertEqual(1, rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_amqqueue, count, [])),
+
+ amqp_channel:call(Ch, #'queue.delete'{ queue = <<"my-queue">> }),
+ rabbit_ct_client_helpers:close_channel(Ch),
+ rabbit_ct_client_helpers:close_connection(Conn),
+ ok.
+
+connection_count(Config) ->
+ Conn = rabbit_ct_client_helpers:open_connection(Config, 0),
+
+ ?assertEqual(1, rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_connection_tracking, count, [])),
+
+ rabbit_ct_client_helpers:close_connection(Conn),
+ ok.
+
+connection_lookup(Config) ->
+ Conn = rabbit_ct_client_helpers:open_connection(Config, 0),
+
+ [Connection] = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_connection_tracking, list, []),
+ ?assertMatch(Connection, rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_connection_tracking,
+ lookup,
+ [Connection#tracked_connection.name])),
+
+ rabbit_ct_client_helpers:close_connection(Conn),
+ ok.
+
+%% ---------------------------------------------------------------------------
%% rabbitmqctl helpers.
%% ---------------------------------------------------------------------------