Skip to content

Commit 59db083

Browse files
Merge pull request #7331 from rabbitmq/mergify/bp/v3.12.x/pr-7270
2 parents 7975b7e + 8e89b41 commit 59db083

12 files changed

+66
-734
lines changed

deps/rabbit/src/rabbit.erl

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,6 @@
209209
[{description, "message delivery logic ready"},
210210
{requires, [core_initialized, recovery]}]}).
211211

212-
-rabbit_boot_step({connection_tracking,
213-
[{description, "connection tracking infrastructure"},
214-
{mfa, {rabbit_connection_tracking, boot, []}},
215-
{enables, routing_ready}]}).
216-
217-
-rabbit_boot_step({channel_tracking,
218-
[{description, "channel tracking infrastructure"},
219-
{mfa, {rabbit_channel_tracking, boot, []}},
220-
{enables, routing_ready}]}).
221-
222212
-rabbit_boot_step({background_gc,
223213
[{description, "background garbage collection"},
224214
{mfa, {rabbit_sup, start_restartable_child,

deps/rabbit/src/rabbit_channel_tracking.erl

Lines changed: 21 additions & 239 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717
%% * rabbit_event
1818
-behaviour(rabbit_tracking).
1919

20-
-export([boot/0,
21-
update_tracked/1,
20+
-export([update_tracked/1,
2221
handle_cast/1,
2322
register_tracked/1,
2423
unregister_tracked/1,
2524
count_tracked_items_in/1,
26-
clear_tracking_tables/0,
2725
shutdown_tracked_items/2]).
2826

2927
-export([list/0, list_of_user/1, list_on_node/1,
@@ -34,10 +32,6 @@
3432

3533
-export([count_local_tracked_items_of_user/1]).
3634

37-
-ifdef(TEST).
38-
-export([get_all_tracked_channel_table_names_for_node/1]).
39-
-endif.
40-
4135
-include_lib("rabbit_common/include/rabbit.hrl").
4236

4337
-import(rabbit_misc, [pget/2]).
@@ -49,15 +43,6 @@
4943
%% API
5044
%%
5145

52-
%% Sets up and resets channel tracking tables for this node.
53-
-spec boot() -> ok.
54-
55-
boot() ->
56-
ensure_tracked_channels_table_for_this_node(),
57-
ensure_per_user_tracked_channels_table_for_node(),
58-
clear_tracking_tables(),
59-
ok.
60-
6146
-spec update_tracked(term()) -> ok.
6247

6348
update_tracked(Event) ->
@@ -115,30 +100,13 @@ handle_cast({user_deleted, Details}) ->
115100
%% Schedule user entry deletion, allowing time for connections to close
116101
_ = timer:apply_after(?TRACKING_EXECUTION_TIMEOUT, ?MODULE,
117102
delete_tracked_channel_user_entry, [Username]),
118-
ok;
119-
handle_cast({node_deleted, Details}) ->
120-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
121-
true ->
122-
ok;
123-
false ->
124-
Node = pget(node, Details),
125-
rabbit_log_channel:info(
126-
"Node '~ts' was removed from the cluster, deleting"
127-
" its channel tracking tables...", [Node]),
128-
delete_tracked_channels_table_for_node(Node),
129-
delete_per_user_tracked_channels_table_for_node(Node)
130-
end.
103+
ok.
131104

132105
-spec register_tracked(rabbit_types:tracked_channel()) -> ok.
133106
-dialyzer([{nowarn_function, [register_tracked/1]}]).
134107

135-
register_tracked(TrackedCh = #tracked_channel{node = Node}) when Node == node() ->
136-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
137-
true -> register_tracked_ets(TrackedCh);
138-
false -> register_tracked_mnesia(TrackedCh)
139-
end.
140-
141-
register_tracked_ets(TrackedCh = #tracked_channel{pid = ChPid, username = Username}) ->
108+
register_tracked(TrackedCh = #tracked_channel{pid = ChPid, username = Username,
109+
node = Node}) when Node == node() ->
142110
case ets:lookup(?TRACKED_CHANNEL_TABLE, ChPid) of
143111
[] ->
144112
ets:insert(?TRACKED_CHANNEL_TABLE, TrackedCh),
@@ -149,85 +117,31 @@ register_tracked_ets(TrackedCh = #tracked_channel{pid = ChPid, username = Userna
149117
end,
150118
ok.
151119

152-
register_tracked_mnesia(TrackedCh =
153-
#tracked_channel{node = Node, name = Name, username = Username}) ->
154-
ChId = rabbit_tracking:id(Node, Name),
155-
TableName = tracked_channel_table_name_for(Node),
156-
PerUserChTableName = tracked_channel_per_user_table_name_for(Node),
157-
case mnesia:dirty_read(TableName, ChId) of
158-
[] ->
159-
mnesia:dirty_write(TableName, TrackedCh),
160-
mnesia:dirty_update_counter(PerUserChTableName, Username, 1),
161-
ok;
162-
[#tracked_channel{}] ->
163-
ok
164-
end,
165-
ok.
166-
167120
-spec unregister_tracked_by_pid(pid()) -> any().
168121
unregister_tracked_by_pid(ChPid) when node(ChPid) == node() ->
169-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
170-
true -> unregister_tracked_by_pid_ets(ChPid);
171-
false -> unregister_tracked_by_pid_mnesia(ChPid)
172-
end.
173-
174-
unregister_tracked_by_pid_ets(ChPid) ->
175122
case ets:lookup(?TRACKED_CHANNEL_TABLE, ChPid) of
176123
[] -> ok;
177124
[#tracked_channel{username = Username}] ->
178125
ets:update_counter(?TRACKED_CHANNEL_TABLE_PER_USER, Username, -1),
179126
ets:delete(?TRACKED_CHANNEL_TABLE, ChPid)
180127
end.
181128

182-
unregister_tracked_by_pid_mnesia(ChPid) ->
183-
case get_tracked_channel_by_pid_mnesia(ChPid) of
184-
[] -> ok;
185-
[#tracked_channel{id = ChId, node = Node, username = Username}] ->
186-
TableName = tracked_channel_table_name_for(Node),
187-
PerUserChannelTableName = tracked_channel_per_user_table_name_for(Node),
188-
189-
mnesia:dirty_update_counter(PerUserChannelTableName, Username, -1),
190-
mnesia:dirty_delete(TableName, ChId)
191-
end.
192-
193129
%% @doc This function is exported and implements a rabbit_tracking
194130
%% callback, however it is not used in rabbitmq-server any more. It is
195131
%% only kept for backwards compatibility if 3rd-party code would rely
196132
%% on it.
197133
-spec unregister_tracked(rabbit_types:tracked_channel_id()) -> ok.
198134
unregister_tracked(ChId = {Node, _Name}) when Node == node() ->
199-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
200-
true -> unregister_tracked_ets(ChId);
201-
false -> unregister_tracked_mnesia(ChId)
202-
end.
203-
204-
unregister_tracked_ets(ChId) ->
205-
case get_tracked_channel_by_id_ets(ChId) of
135+
case get_tracked_channel_by_id(ChId) of
206136
[] -> ok;
207137
[#tracked_channel{pid = ChPid, username = Username}] ->
208138
ets:update_counter(?TRACKED_CHANNEL_TABLE_PER_USER, Username, -1),
209139
ets:delete(?TRACKED_CHANNEL_TABLE, ChPid)
210140
end.
211141

212-
unregister_tracked_mnesia(ChId = {Node, _Name}) when Node =:= node() ->
213-
TableName = tracked_channel_table_name_for(Node),
214-
PerUserChannelTableName = tracked_channel_per_user_table_name_for(Node),
215-
case mnesia:dirty_read(TableName, ChId) of
216-
[] -> ok;
217-
[#tracked_channel{username = Username}] ->
218-
mnesia:dirty_update_counter(PerUserChannelTableName, Username, -1),
219-
mnesia:dirty_delete(TableName, ChId)
220-
end.
221-
222142
-spec count_tracked_items_in({atom(), rabbit_types:username()}) -> non_neg_integer().
223143

224-
count_tracked_items_in(Type) ->
225-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
226-
true -> count_tracked_items_in_ets(Type);
227-
false -> count_tracked_items_in_mnesia(Type)
228-
end.
229-
230-
count_tracked_items_in_ets({user, Username}) ->
144+
count_tracked_items_in({user, Username}) ->
231145
rabbit_tracking:count_on_all_nodes(
232146
?MODULE, count_local_tracked_items_of_user, [Username],
233147
["channels of user ", Username]).
@@ -236,20 +150,6 @@ count_tracked_items_in_ets({user, Username}) ->
236150
count_local_tracked_items_of_user(Username) ->
237151
rabbit_tracking:read_ets_counter(?TRACKED_CHANNEL_TABLE_PER_USER, Username).
238152

239-
count_tracked_items_in_mnesia({user, Username}) ->
240-
rabbit_tracking:count_tracked_items_mnesia(
241-
fun tracked_channel_per_user_table_name_for/1,
242-
#tracked_channel_per_user.channel_count, Username,
243-
"channels of user").
244-
245-
-spec clear_tracking_tables() -> ok.
246-
247-
clear_tracking_tables() ->
248-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
249-
true -> ok;
250-
false -> clear_tracked_channel_tables_for_this_node()
251-
end.
252-
253153
-spec shutdown_tracked_items(list(), term()) -> ok.
254154

255155
shutdown_tracked_items(TrackedItems, _Args) ->
@@ -267,50 +167,18 @@ list() ->
267167
-spec list_of_user(rabbit_types:username()) -> [rabbit_types:tracked_channel()].
268168

269169
list_of_user(Username) ->
270-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
271-
true -> list_of_user_ets(Username);
272-
false -> list_of_user_mnesia(Username)
273-
end.
274-
275-
list_of_user_ets(Username) ->
276-
rabbit_tracking:match_tracked_items_ets(
170+
rabbit_tracking:match_tracked_items(
277171
?TRACKED_CHANNEL_TABLE,
278172
#tracked_channel{username = Username, _ = '_'}).
279173

280-
list_of_user_mnesia(Username) ->
281-
rabbit_tracking:match_tracked_items_mnesia(
282-
fun tracked_channel_table_name_for/1,
283-
#tracked_channel{username = Username, _ = '_'}).
284-
285174
-spec list_on_node(node()) -> [rabbit_types:tracked_channel()].
175+
list_on_node(Node) when Node == node() ->
176+
ets:tab2list(?TRACKED_CHANNEL_TABLE);
286177
list_on_node(Node) ->
287-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
288-
true when Node == node() ->
289-
list_on_node_ets();
290-
true ->
291-
case rabbit_misc:rpc_call(Node, ?MODULE, list_on_node, [Node]) of
292-
List when is_list(List) ->
293-
List;
294-
_ ->
295-
[]
296-
end;
297-
false ->
298-
list_on_node_mnesia(Node)
299-
end.
300-
301-
list_on_node_ets() ->
302-
ets:tab2list(?TRACKED_CHANNEL_TABLE).
303-
304-
list_on_node_mnesia(Node) ->
305-
try mnesia:dirty_match_object(
306-
tracked_channel_table_name_for(Node),
307-
#tracked_channel{_ = '_'})
308-
catch exit:{aborted, {no_exists, _}} ->
309-
%% The table might not exist yet (or is already gone)
310-
%% between the time rabbit_nodes:list_running() runs and
311-
%% returns a specific node, and
312-
%% mnesia:dirty_match_object() is called for that node's
313-
%% table.
178+
case rabbit_misc:rpc_call(Node, ?MODULE, list_on_node, [Node]) of
179+
List when is_list(List) ->
180+
List;
181+
_ ->
314182
[]
315183
end.
316184

@@ -326,118 +194,32 @@ tracked_channel_per_user_table_name_for(Node) ->
326194
"tracked_channel_table_per_user_on_node_~ts", [Node])).
327195

328196
ensure_tracked_tables_for_this_node() ->
329-
_ = ensure_tracked_channels_table_for_this_node_ets(),
330-
_ = ensure_per_user_tracked_channels_table_for_this_node_ets(),
197+
_ = ensure_tracked_channels_table_for_this_node(),
198+
_ = ensure_per_user_tracked_channels_table_for_this_node(),
331199
ok.
332200

333-
%% internal
334-
ensure_tracked_channels_table_for_this_node() ->
335-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
336-
true ->
337-
ok;
338-
false ->
339-
ensure_tracked_channels_table_for_this_node_mnesia()
340-
end.
341-
342-
ensure_per_user_tracked_channels_table_for_node() ->
343-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
344-
true ->
345-
ok;
346-
false ->
347-
ensure_per_user_tracked_channels_table_for_this_node_mnesia()
348-
end.
349-
350201
%% Create tables
351-
ensure_tracked_channels_table_for_this_node_ets() ->
202+
ensure_tracked_channels_table_for_this_node() ->
352203
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
353204
[?TRACKED_CHANNEL_TABLE]),
354205
ets:new(?TRACKED_CHANNEL_TABLE, [named_table, public, {write_concurrency, true},
355206
{keypos, #tracked_channel.pid}]).
356207

357-
ensure_tracked_channels_table_for_this_node_mnesia() ->
358-
Node = node(),
359-
TableName = tracked_channel_table_name_for(Node),
360-
case mnesia:create_table(TableName, [{record_name, tracked_channel},
361-
{attributes, record_info(fields, tracked_channel)}]) of
362-
{atomic, ok} ->
363-
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
364-
[TableName]),
365-
ok;
366-
{aborted, {already_exists, _}} ->
367-
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
368-
[TableName]),
369-
ok;
370-
{aborted, Error} ->
371-
rabbit_log:error("Failed to create a tracked channel table for node ~tp: ~tp", [Node, Error]),
372-
ok
373-
end.
374-
375-
ensure_per_user_tracked_channels_table_for_this_node_ets() ->
208+
ensure_per_user_tracked_channels_table_for_this_node() ->
376209
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
377210
[?TRACKED_CHANNEL_TABLE_PER_USER]),
378211
ets:new(?TRACKED_CHANNEL_TABLE_PER_USER, [named_table, public, {write_concurrency, true}]).
379212

380-
ensure_per_user_tracked_channels_table_for_this_node_mnesia() ->
381-
Node = node(),
382-
TableName = tracked_channel_per_user_table_name_for(Node),
383-
case mnesia:create_table(TableName, [{record_name, tracked_channel_per_user},
384-
{attributes, record_info(fields, tracked_channel_per_user)}]) of
385-
{atomic, ok} ->
386-
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
387-
[TableName]),
388-
ok;
389-
{aborted, {already_exists, _}} ->
390-
rabbit_log:info("Setting up a table for channel tracking on this node: ~tp",
391-
[TableName]),
392-
ok;
393-
{aborted, Error} ->
394-
rabbit_log:error("Failed to create a per-user tracked channel table for node ~tp: ~tp", [Node, Error]),
395-
ok
396-
end.
397-
398-
clear_tracked_channel_tables_for_this_node() ->
399-
[rabbit_tracking:clear_tracking_table(T)
400-
|| T <- get_all_tracked_channel_table_names_for_node(node())].
401-
402-
delete_tracked_channels_table_for_node(Node) ->
403-
TableName = tracked_channel_table_name_for(Node),
404-
rabbit_tracking:delete_tracking_table(TableName, Node, "tracked channel").
405-
406-
delete_per_user_tracked_channels_table_for_node(Node) ->
407-
TableName = tracked_channel_per_user_table_name_for(Node),
408-
rabbit_tracking:delete_tracking_table(TableName, Node,
409-
"per-user tracked channels").
410-
411-
get_all_tracked_channel_table_names_for_node(Node) ->
412-
[tracked_channel_table_name_for(Node),
413-
tracked_channel_per_user_table_name_for(Node)].
414-
415213
get_tracked_channels_by_connection_pid(ConnPid) ->
416-
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
417-
true -> get_tracked_channels_by_connection_pid_ets(ConnPid);
418-
false -> get_tracked_channels_by_connection_pid_mnesia(ConnPid)
419-
end.
420-
421-
get_tracked_channels_by_connection_pid_ets(ConnPid) ->
422214
rabbit_tracking:match_tracked_items_local(
423-
?TRACKED_CHANNEL_TABLE,
424-
#tracked_channel{connection = ConnPid, _ = '_'}).
425-
426-
get_tracked_channels_by_connection_pid_mnesia(ConnPid) ->
427-
rabbit_tracking:match_tracked_items_mnesia(
428-
fun tracked_channel_table_name_for/1,
429-
#tracked_channel{connection = ConnPid, _ = '_'}).
215+
?TRACKED_CHANNEL_TABLE,
216+
#tracked_channel{connection = ConnPid, _ = '_'}).
430217

431-
get_tracked_channel_by_id_ets(ChId) ->
432-
rabbit_tracking:match_tracked_items_ets(
218+
get_tracked_channel_by_id(ChId) ->
219+
rabbit_tracking:match_tracked_items(
433220
?TRACKED_CHANNEL_TABLE,
434221
#tracked_channel{id = ChId, _ = '_'}).
435222

436-
get_tracked_channel_by_pid_mnesia(ChPid) ->
437-
rabbit_tracking:match_tracked_items_mnesia(
438-
fun tracked_channel_table_name_for/1,
439-
#tracked_channel{pid = ChPid, _ = '_'}).
440-
441223
delete_tracked_channel_user_entry(Username) ->
442224
rabbit_tracking:delete_tracked_entry(
443225
{rabbit_auth_backend_internal, exists, [Username]},

deps/rabbit/src/rabbit_channel_tracking_handler.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
[rabbit_event, ?MODULE, []]}},
3030
{cleanup, {gen_event, delete_handler,
3131
[rabbit_event, ?MODULE, []]}},
32-
{requires, [channel_tracking]},
32+
{requires, [tracking_metadata_store]},
3333
{enables, recovery}]}).
3434

3535
%%

0 commit comments

Comments
 (0)