Skip to content

Commit a0c6a0b

Browse files
Merge pull request #13898 from rabbitmq/md/rabbit_mgmt_gc-memory
Improve memory use of `rabbit_mgmt_gc`
2 parents 98d1634 + 5a32322 commit a0c6a0b

File tree

1 file changed

+67
-67
lines changed

1 file changed

+67
-67
lines changed

deps/rabbitmq_management_agent/src/rabbit_mgmt_gc.erl

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ handle_info(start_gc, State) ->
3636
gc_queues(),
3737
gc_exchanges(),
3838
gc_nodes(),
39-
{noreply, start_timer(State)}.
39+
{noreply, start_timer(State), hibernate}.
4040

4141
terminate(_Reason, #state{timer = TRef}) ->
4242
_ = erlang:cancel_timer(TRef),
@@ -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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy