Skip to content

Commit 54e063c

Browse files
the-mikedavismergify[bot]
authored andcommitted
rabbit_mgmt_gc: Switch from gb_sets to sets v2
`sets` v2 were not yet available when this module was written. Compared to `gb_sets`, v2 `sets` are faster and more memory efficient: > List = lists:seq(1, 50_000). > tprof:profile(sets, from_list, [List, [{version, 2}]], #{type => call_memory}). ****** Process <0.94.0> -- 100.00% of total *** FUNCTION CALLS WORDS PER CALL [ %] maps:from_keys/2 1 184335 184335.00 [100.00] 184335 [ 100.0] ok > tprof:profile(gb_sets, from_list, [List], #{type => call_memory}). ****** Process <0.97.0> -- 100.00% of total *** FUNCTION CALLS WORDS PER CALL [ %] lists:rumergel/3 1 2 2.00 [ 0.00] gb_sets:from_ordset/1 1 3 3.00 [ 0.00] lists:reverse/2 1 100000 100000.00 [16.76] lists:usplit_1/5 49999 100002 2.00 [16.76] gb_sets:balance_list_1/2 65535 396605 6.05 [66.48] 596612 [100.0] (cherry picked from commit 5a32322)
1 parent ffda347 commit 54e063c

File tree

1 file changed

+66
-66
lines changed

1 file changed

+66
-66
lines changed

deps/rabbitmq_management_agent/src/rabbit_mgmt_gc.erl

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ gc_connections() ->
5656

5757
gc_vhosts() ->
5858
VHosts = rabbit_vhost:list(),
59-
GbSet = gb_sets:from_list(VHosts),
60-
gc_entity(vhost_stats_coarse_conn_stats, GbSet),
61-
gc_entity(vhost_stats_fine_stats, GbSet),
62-
gc_entity(vhost_msg_stats, GbSet),
63-
gc_entity(vhost_msg_rates, GbSet),
64-
gc_entity(vhost_stats_deliver_stats, GbSet).
59+
Set = sets:from_list(VHosts, [{version, 2}]),
60+
gc_entity(vhost_stats_coarse_conn_stats, Set),
61+
gc_entity(vhost_stats_fine_stats, Set),
62+
gc_entity(vhost_msg_stats, Set),
63+
gc_entity(vhost_msg_rates, Set),
64+
gc_entity(vhost_stats_deliver_stats, Set).
6565

6666
gc_channels() ->
6767
gc_process(channel_created_stats),
@@ -73,45 +73,45 @@ gc_channels() ->
7373

7474
gc_queues() ->
7575
Queues = rabbit_amqqueue:list_names(),
76-
GbSet = gb_sets:from_list(Queues),
76+
Set = sets:from_list(Queues, [{version, 2}]),
7777
LocalQueues = rabbit_amqqueue:list_local_names(),
78-
LocalGbSet = gb_sets:from_list(LocalQueues),
79-
gc_entity(queue_stats_publish, GbSet),
80-
gc_entity(queue_stats, LocalGbSet),
81-
gc_entity(queue_basic_stats, LocalGbSet),
82-
gc_entity(queue_msg_stats, LocalGbSet),
83-
gc_entity(queue_process_stats, LocalGbSet),
84-
gc_entity(queue_msg_rates, LocalGbSet),
85-
gc_entity(queue_stats_deliver_stats, GbSet),
86-
gc_process_and_entity(channel_queue_stats_deliver_stats_queue_index, GbSet),
87-
gc_process_and_entity(consumer_stats_queue_index, GbSet),
88-
gc_process_and_entity(consumer_stats_channel_index, GbSet),
89-
gc_process_and_entity(consumer_stats, GbSet),
90-
gc_process_and_entity(channel_exchange_stats_fine_stats_channel_index, GbSet),
91-
gc_process_and_entity(channel_queue_stats_deliver_stats, GbSet),
92-
gc_process_and_entity(channel_queue_stats_deliver_stats_channel_index, GbSet),
93-
ExchangeGbSet = gb_sets:from_list(rabbit_exchange:list_names()),
94-
gc_entities(queue_exchange_stats_publish, GbSet, ExchangeGbSet),
95-
gc_entities(queue_exchange_stats_publish_queue_index, GbSet, ExchangeGbSet),
96-
gc_entities(queue_exchange_stats_publish_exchange_index, GbSet, ExchangeGbSet).
78+
LocalSet = sets:from_list(LocalQueues, [{version, 2}]),
79+
gc_entity(queue_stats_publish, Set),
80+
gc_entity(queue_stats, LocalSet),
81+
gc_entity(queue_basic_stats, LocalSet),
82+
gc_entity(queue_msg_stats, LocalSet),
83+
gc_entity(queue_process_stats, LocalSet),
84+
gc_entity(queue_msg_rates, LocalSet),
85+
gc_entity(queue_stats_deliver_stats, Set),
86+
gc_process_and_entity(channel_queue_stats_deliver_stats_queue_index, Set),
87+
gc_process_and_entity(consumer_stats_queue_index, Set),
88+
gc_process_and_entity(consumer_stats_channel_index, Set),
89+
gc_process_and_entity(consumer_stats, Set),
90+
gc_process_and_entity(channel_exchange_stats_fine_stats_channel_index, Set),
91+
gc_process_and_entity(channel_queue_stats_deliver_stats, Set),
92+
gc_process_and_entity(channel_queue_stats_deliver_stats_channel_index, Set),
93+
ExchangeSet = sets:from_list(rabbit_exchange:list_names(), [{version, 2}]),
94+
gc_entities(queue_exchange_stats_publish, Set, ExchangeSet),
95+
gc_entities(queue_exchange_stats_publish_queue_index, Set, ExchangeSet),
96+
gc_entities(queue_exchange_stats_publish_exchange_index, Set, ExchangeSet).
9797

9898
gc_exchanges() ->
9999
Exchanges = rabbit_exchange:list_names(),
100-
GbSet = gb_sets:from_list(Exchanges),
101-
gc_entity(exchange_stats_publish_in, GbSet),
102-
gc_entity(exchange_stats_publish_out, GbSet),
103-
gc_entity(channel_exchange_stats_fine_stats_exchange_index, GbSet),
104-
gc_process_and_entity(channel_exchange_stats_fine_stats, GbSet).
100+
Set = sets:from_list(Exchanges, [{version, 2}]),
101+
gc_entity(exchange_stats_publish_in, Set),
102+
gc_entity(exchange_stats_publish_out, Set),
103+
gc_entity(channel_exchange_stats_fine_stats_exchange_index, Set),
104+
gc_process_and_entity(channel_exchange_stats_fine_stats, Set).
105105

106106
gc_nodes() ->
107107
Nodes = rabbit_nodes:list_members(),
108-
GbSet = gb_sets:from_list(Nodes),
109-
gc_entity(node_stats, GbSet),
110-
gc_entity(node_coarse_stats, GbSet),
111-
gc_entity(node_persister_stats, GbSet),
112-
gc_entity(node_node_coarse_stats_node_index, GbSet),
113-
gc_entity(node_node_stats, GbSet),
114-
gc_entity(node_node_coarse_stats, GbSet).
108+
Set = sets:from_list(Nodes, [{version, 2}]),
109+
gc_entity(node_stats, Set),
110+
gc_entity(node_coarse_stats, Set),
111+
gc_entity(node_persister_stats, Set),
112+
gc_entity(node_node_coarse_stats_node_index, Set),
113+
gc_entity(node_node_stats, Set),
114+
gc_entity(node_node_coarse_stats, Set).
115115

116116
gc_process(Table) ->
117117
ets:foldl(fun({{Pid, _} = Key, _}, none) ->
@@ -133,61 +133,61 @@ gc_process(Pid, Table, Key) ->
133133
none
134134
end.
135135

136-
gc_entity(Table, GbSet) ->
136+
gc_entity(Table, Set) ->
137137
ets:foldl(fun({{_, Id} = Key, _}, none) when Table == node_node_stats ->
138-
gc_entity(Id, Table, Key, GbSet);
138+
gc_entity(Id, Table, Key, Set);
139139
({{{_, Id}, _} = Key, _}, none) when Table == node_node_coarse_stats ->
140-
gc_entity(Id, Table, Key, GbSet);
140+
gc_entity(Id, Table, Key, Set);
141141
({{Id, _} = Key, _}, none) ->
142-
gc_entity(Id, Table, Key, GbSet);
142+
gc_entity(Id, Table, Key, Set);
143143
({Id = Key, _}, none) ->
144-
gc_entity(Id, Table, Key, GbSet);
144+
gc_entity(Id, Table, Key, Set);
145145
({{Id, _} = Key, _}, none) ->
146-
gc_entity(Id, Table, Key, GbSet)
146+
gc_entity(Id, Table, Key, Set)
147147
end, none, Table).
148148

149-
gc_entity(Id, Table, Key, GbSet) ->
150-
case gb_sets:is_member(Id, GbSet) of
149+
gc_entity(Id, Table, Key, Set) ->
150+
case sets:is_element(Id, Set) of
151151
true ->
152152
none;
153153
false ->
154154
ets:delete(Table, Key),
155155
none
156156
end.
157157

158-
gc_process_and_entity(Table, GbSet) ->
158+
gc_process_and_entity(Table, Set) ->
159159
ets:foldl(fun({{Id, Pid, _} = Key, _}, none) when Table == consumer_stats ->
160-
gc_process_and_entity(Id, Pid, Table, Key, GbSet);
160+
gc_process_and_entity(Id, Pid, Table, Key, Set);
161161
({Id = Key, {_, Pid, _}} = Object, none)
162162
when Table == consumer_stats_queue_index ->
163163
gc_object(Pid, Table, Object),
164-
gc_entity(Id, Table, Key, GbSet);
164+
gc_entity(Id, Table, Key, Set);
165165
({Pid = Key, {Id, _, _}} = Object, none)
166166
when Table == consumer_stats_channel_index ->
167-
gc_object(Id, Table, Object, GbSet),
167+
gc_object(Id, Table, Object, Set),
168168
gc_process(Pid, Table, Key);
169169
({Id = Key, {{Pid, _}, _}} = Object, none)
170170
when Table == channel_exchange_stats_fine_stats_exchange_index;
171171
Table == channel_queue_stats_deliver_stats_queue_index ->
172172
gc_object(Pid, Table, Object),
173-
gc_entity(Id, Table, Key, GbSet);
173+
gc_entity(Id, Table, Key, Set);
174174
({Pid = Key, {{_, Id}, _}} = Object, none)
175175
when Table == channel_exchange_stats_fine_stats_channel_index;
176176
Table == channel_queue_stats_deliver_stats_channel_index ->
177-
gc_object(Id, Table, Object, GbSet),
177+
gc_object(Id, Table, Object, Set),
178178
gc_process(Pid, Table, Key);
179179
({{{Pid, Id}, _} = Key, _}, none)
180180
when Table == channel_queue_stats_deliver_stats;
181181
Table == channel_exchange_stats_fine_stats ->
182-
gc_process_and_entity(Id, Pid, Table, Key, GbSet);
182+
gc_process_and_entity(Id, Pid, Table, Key, Set);
183183
({{{Pid, Id}, _} = Key, _, _, _, _, _, _, _, _}, none) ->
184-
gc_process_and_entity(Id, Pid, Table, Key, GbSet);
184+
gc_process_and_entity(Id, Pid, Table, Key, Set);
185185
({{{Pid, Id}, _} = Key, _, _, _, _}, none) ->
186-
gc_process_and_entity(Id, Pid, Table, Key, GbSet)
186+
gc_process_and_entity(Id, Pid, Table, Key, Set)
187187
end, none, Table).
188188

189-
gc_process_and_entity(Id, Pid, Table, Key, GbSet) ->
190-
case rabbit_misc:is_process_alive(Pid) andalso gb_sets:is_member(Id, GbSet) of
189+
gc_process_and_entity(Id, Pid, Table, Key, Set) ->
190+
case rabbit_misc:is_process_alive(Pid) andalso sets:is_element(Id, Set) of
191191
true ->
192192
none;
193193
false ->
@@ -204,26 +204,26 @@ gc_object(Pid, Table, Object) ->
204204
none
205205
end.
206206

207-
gc_object(Id, Table, Object, GbSet) ->
208-
case gb_sets:is_member(Id, GbSet) of
207+
gc_object(Id, Table, Object, Set) ->
208+
case sets:is_element(Id, Set) of
209209
true ->
210210
none;
211211
false ->
212212
ets:delete_object(Table, Object),
213213
none
214214
end.
215215

216-
gc_entities(Table, QueueGbSet, ExchangeGbSet) ->
216+
gc_entities(Table, QueueSet, ExchangeSet) ->
217217
ets:foldl(fun({{{Q, X}, _} = Key, _}, none)
218218
when Table == queue_exchange_stats_publish ->
219-
gc_entity(Q, Table, Key, QueueGbSet),
220-
gc_entity(X, Table, Key, ExchangeGbSet);
219+
gc_entity(Q, Table, Key, QueueSet),
220+
gc_entity(X, Table, Key, ExchangeSet);
221221
({Q, {{_, X}, _}} = Object, none)
222222
when Table == queue_exchange_stats_publish_queue_index ->
223-
gc_object(X, Table, Object, ExchangeGbSet),
224-
gc_entity(Q, Table, Q, QueueGbSet);
223+
gc_object(X, Table, Object, ExchangeSet),
224+
gc_entity(Q, Table, Q, QueueSet);
225225
({X, {{Q, _}, _}} = Object, none)
226226
when Table == queue_exchange_stats_publish_exchange_index ->
227-
gc_object(Q, Table, Object, QueueGbSet),
228-
gc_entity(X, Table, X, ExchangeGbSet)
227+
gc_object(Q, Table, Object, QueueSet),
228+
gc_entity(X, Table, X, ExchangeSet)
229229
end, none, Table).

0 commit comments

Comments
 (0)