3434
3535-export ([count_local_tracked_items_of_user /1 ]).
3636
37- -ifdef (TEST ).
38- -export ([get_all_tracked_channel_table_names_for_node /1 ]).
39- -endif .
40-
4137-include_lib (" rabbit_common/include/rabbit.hrl" ).
4238
4339-import (rabbit_misc , [pget /2 ]).
5349-spec boot () -> ok .
5450
5551boot () ->
56- ensure_tracked_channels_table_for_this_node (),
57- ensure_per_user_tracked_channels_table_for_node (),
5852 clear_tracking_tables (),
5953 ok .
6054
@@ -116,27 +110,14 @@ handle_cast({user_deleted, Details}) ->
116110 _ = timer :apply_after (? TRACKING_EXECUTION_TIMEOUT , ? MODULE ,
117111 delete_tracked_channel_user_entry , [Username ]),
118112 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 .
113+ handle_cast ({node_deleted , _Details }) ->
114+ ok .
131115
132116-spec register_tracked (rabbit_types :tracked_channel ()) -> ok .
133117-dialyzer ([{nowarn_function , [register_tracked / 1 ]}]).
134118
135119register_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 .
120+ register_tracked_ets (TrackedCh ).
140121
141122register_tracked_ets (TrackedCh = # tracked_channel {pid = ChPid , username = Username }) ->
142123 case ets :lookup (? TRACKED_CHANNEL_TABLE , ChPid ) of
@@ -149,27 +130,9 @@ register_tracked_ets(TrackedCh = #tracked_channel{pid = ChPid, username = Userna
149130 end ,
150131 ok .
151132
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-
167133-spec unregister_tracked_by_pid (pid ()) -> any ().
168134unregister_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 .
135+ unregister_tracked_by_pid_ets (ChPid ).
173136
174137unregister_tracked_by_pid_ets (ChPid ) ->
175138 case ets :lookup (? TRACKED_CHANNEL_TABLE , ChPid ) of
@@ -179,27 +142,13 @@ unregister_tracked_by_pid_ets(ChPid) ->
179142 ets :delete (? TRACKED_CHANNEL_TABLE , ChPid )
180143 end .
181144
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-
193145% % @doc This function is exported and implements a rabbit_tracking
194146% % callback, however it is not used in rabbitmq-server any more. It is
195147% % only kept for backwards compatibility if 3rd-party code would rely
196148% % on it.
197149-spec unregister_tracked (rabbit_types :tracked_channel_id ()) -> ok .
198150unregister_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 .
151+ unregister_tracked_ets (ChId ).
203152
204153unregister_tracked_ets (ChId ) ->
205154 case get_tracked_channel_by_id_ets (ChId ) of
@@ -209,23 +158,10 @@ unregister_tracked_ets(ChId) ->
209158 ets :delete (? TRACKED_CHANNEL_TABLE , ChPid )
210159 end .
211160
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-
222161-spec count_tracked_items_in ({atom (), rabbit_types :username ()}) -> non_neg_integer ().
223162
224163count_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 .
164+ count_tracked_items_in_ets (Type ).
229165
230166count_tracked_items_in_ets ({user , Username }) ->
231167 rabbit_tracking :count_on_all_nodes (
@@ -236,19 +172,10 @@ count_tracked_items_in_ets({user, Username}) ->
236172count_local_tracked_items_of_user (Username ) ->
237173 rabbit_tracking :read_ets_counter (? TRACKED_CHANNEL_TABLE_PER_USER , Username ).
238174
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-
245175-spec clear_tracking_tables () -> ok .
246176
247177clear_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 .
178+ ok .
252179
253180-spec shutdown_tracked_items (list (), term ()) -> ok .
254181
@@ -267,53 +194,27 @@ list() ->
267194-spec list_of_user (rabbit_types :username ()) -> [rabbit_types :tracked_channel ()].
268195
269196list_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 .
197+ list_of_user_ets (Username ).
274198
275199list_of_user_ets (Username ) ->
276200 rabbit_tracking :match_tracked_items_ets (
277201 ? TRACKED_CHANNEL_TABLE ,
278202 # tracked_channel {username = Username , _ = '_' }).
279203
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-
285204-spec list_on_node (node ()) -> [rabbit_types :tracked_channel ()].
205+ list_on_node (Node ) when Node == node () ->
206+ list_on_node_ets ();
286207list_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 )
208+ case rabbit_misc :rpc_call (Node , ? MODULE , list_on_node , [Node ]) of
209+ List when is_list (List ) ->
210+ List ;
211+ _ ->
212+ []
299213 end .
300214
301215list_on_node_ets () ->
302216 ets :tab2list (? TRACKED_CHANNEL_TABLE ).
303217
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.
314- []
315- end .
316-
317218-spec tracked_channel_table_name_for (node ()) -> atom ().
318219
319220tracked_channel_table_name_for (Node ) ->
@@ -330,114 +231,31 @@ ensure_tracked_tables_for_this_node() ->
330231 _ = ensure_per_user_tracked_channels_table_for_this_node_ets (),
331232 ok .
332233
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-
350234% % Create tables
351235ensure_tracked_channels_table_for_this_node_ets () ->
352236 rabbit_log :info (" Setting up a table for channel tracking on this node: ~tp " ,
353237 [? TRACKED_CHANNEL_TABLE ]),
354238 ets :new (? TRACKED_CHANNEL_TABLE , [named_table , public , {write_concurrency , true },
355239 {keypos , # tracked_channel .pid }]).
356240
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-
375241ensure_per_user_tracked_channels_table_for_this_node_ets () ->
376242 rabbit_log :info (" Setting up a table for channel tracking on this node: ~tp " ,
377243 [? TRACKED_CHANNEL_TABLE_PER_USER ]),
378244 ets :new (? TRACKED_CHANNEL_TABLE_PER_USER , [named_table , public , {write_concurrency , true }]).
379245
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-
415246get_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 .
247+ get_tracked_channels_by_connection_pid_ets (ConnPid ).
420248
421249get_tracked_channels_by_connection_pid_ets (ConnPid ) ->
422250 rabbit_tracking :match_tracked_items_local (
423251 ? TRACKED_CHANNEL_TABLE ,
424252 # tracked_channel {connection = ConnPid , _ = '_' }).
425253
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 , _ = '_' }).
430-
431254get_tracked_channel_by_id_ets (ChId ) ->
432255 rabbit_tracking :match_tracked_items_ets (
433256 ? TRACKED_CHANNEL_TABLE ,
434257 # tracked_channel {id = ChId , _ = '_' }).
435258
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-
441259delete_tracked_channel_user_entry (Username ) ->
442260 rabbit_tracking :delete_tracked_entry (
443261 {rabbit_auth_backend_internal , exists , [Username ]},
0 commit comments