Skip to content

Commit 80637ee

Browse files
authored
Merge pull request #416 from phoenixframework/ac-local_max_carrier_sizes
Keep max carrier size since page is opened
2 parents da3272d + ba8a886 commit 80637ee

File tree

4 files changed

+84
-82
lines changed

4 files changed

+84
-82
lines changed

config/config.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ if config_env() == :dev do
1010
config :esbuild,
1111
version: "0.14.41",
1212
default: [
13-
args: ~w(js/app.js --bundle --minify --sourcemap=external --target=es2020 --outdir=../dist/js),
13+
args:
14+
~w(js/app.js --bundle --minify --sourcemap=external --target=es2020 --outdir=../dist/js),
1415
cd: Path.expand("../assets", __DIR__),
1516
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
1617
]

lib/phoenix/live_dashboard/pages/memory_allocators_page.ex

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ defmodule Phoenix.LiveDashboard.MemoryAllocatorsPage do
2626
dom_id="memory-allocators-table"
2727
page={@page}
2828
title="Memory Allocators"
29-
row_fetcher={&fetch_memory_allocators/2}
29+
row_fetcher={{&fetch_memory_allocators/3, nil}}
3030
rows_name="memory allocators"
3131
search={false}
3232
limit={false}
@@ -49,15 +49,14 @@ defmodule Phoenix.LiveDashboard.MemoryAllocatorsPage do
4949

5050
defp chart_id(), do: "memory-allocators-chart"
5151

52-
defp fetch_memory_allocators(params, node) do
52+
defp fetch_memory_allocators(params, node, state) do
5353
%{sort_by: sort_by, sort_dir: sort_dir} = params
5454

55-
allocs =
56-
node
57-
|> SystemInfo.fetch_memory_allocators()
58-
|> Enum.sort_by(fn item -> item[sort_by] end, sort_dir)
55+
{allocs, state} = SystemInfo.fetch_memory_allocators(node, state)
5956

60-
{allocs, length(allocs)}
57+
allocs = Enum.sort_by(allocs, fn item -> item[sort_by] end, sort_dir)
58+
59+
{allocs, length(allocs), state}
6160
end
6261

6362
@impl true
@@ -67,7 +66,7 @@ defmodule Phoenix.LiveDashboard.MemoryAllocatorsPage do
6766

6867
@impl true
6968
def handle_refresh(socket) do
70-
allocs = SystemInfo.fetch_memory_allocators(socket.assigns.page.node)
69+
{allocs, _} = SystemInfo.fetch_memory_allocators(socket.assigns.page.node, nil)
7170
now = DateTime.utc_now() |> DateTime.to_unix(:microsecond)
7271

7372
chart_data =

lib/phoenix/live_dashboard/system_info.ex

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ defmodule Phoenix.LiveDashboard.SystemInfo do
111111
:rpc.call(node, __MODULE__, :app_tree_callback, [application])
112112
end
113113

114-
def fetch_memory_allocators(node) do
115-
:rpc.call(node, __MODULE__, :memory_allocators_callback, [])
114+
def fetch_memory_allocators(node, max_carrier_sizes) do
115+
:rpc.call(node, __MODULE__, :memory_allocators_callback, [max_carrier_sizes])
116116
end
117117

118118
## System callbacks
@@ -199,7 +199,7 @@ defmodule Phoenix.LiveDashboard.SystemInfo do
199199
}
200200
end
201201

202-
def memory_allocators_callback() do
202+
def memory_allocators_callback(old_max_carrier_sizes) do
203203
allocs = :erlang.system_info(:alloc_util_allocators)
204204

205205
:erlang.system_info({:allocator_sizes, allocs})
@@ -208,13 +208,14 @@ defmodule Phoenix.LiveDashboard.SystemInfo do
208208
end)
209209
|> prepend_total()
210210
|> Enum.map(fn {type, {block, current_cs, max_cs}} ->
211-
[
211+
%{
212212
name: type,
213213
block_size: block,
214214
carrier_size: current_cs,
215215
max_carrier_size: max_cs
216-
]
216+
}
217217
end)
218+
|> calc_max_carrier_sizes(old_max_carrier_sizes)
218219
end
219220

220221
defp calc_allocator_sizes(allocator_sizes) do
@@ -260,6 +261,14 @@ defmodule Phoenix.LiveDashboard.SystemInfo do
260261
[total | allocator_sizes]
261262
end
262263

264+
defp calc_max_carrier_sizes(allocators, old_max_carrier_sizes) do
265+
Enum.map_reduce(allocators, old_max_carrier_sizes || %{}, fn allocator, max_carrier_sizes ->
266+
%{name: name, carrier_size: current} = allocator
267+
max = Enum.max([old_max_carrier_sizes[name] || 0, current])
268+
{Map.put(allocator, :max_carrier_size, max), Map.put(max_carrier_sizes, name, max)}
269+
end)
270+
end
271+
263272
## Process Callbacks
264273

265274
@processes_keys [

test/phoenix/live_dashboard/system_info_test.exs

Lines changed: 61 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -231,84 +231,77 @@ defmodule Phoenix.LiveDashboard.SystemInfoTest do
231231
end
232232

233233
describe "fetch_memory_allocators" do
234-
test "returns" do
235-
assert list = SystemInfo.fetch_memory_allocators(node())
234+
test "handles when no max_carrier_sizes is given" do
235+
assert {list, max} = SystemInfo.fetch_memory_allocators(node(), nil)
236236

237237
assert [
238-
[
239-
name: :total,
240-
block_size: _,
241-
carrier_size: _,
242-
max_carrier_size: _
243-
],
244-
[
245-
name: :temp_alloc,
246-
block_size: _,
247-
carrier_size: _,
248-
max_carrier_size: _
249-
],
250-
[
251-
name: :sl_alloc,
252-
block_size: _,
253-
carrier_size: _,
254-
max_carrier_size: _
255-
],
256-
[
257-
name: :std_alloc,
258-
block_size: _,
259-
carrier_size: _,
260-
max_carrier_size: _
261-
],
262-
[
263-
name: :ll_alloc,
264-
block_size: _,
265-
carrier_size: _,
266-
max_carrier_size: _
267-
],
268-
[
269-
name: :eheap_alloc,
270-
block_size: _,
271-
carrier_size: _,
272-
max_carrier_size: _
273-
],
274-
[
275-
name: :ets_alloc,
276-
block_size: _,
277-
carrier_size: _,
278-
max_carrier_size: _
279-
],
280-
[
281-
name: :fix_alloc,
282-
block_size: _,
283-
carrier_size: _,
284-
max_carrier_size: _
285-
],
286-
[
287-
name: :literal_alloc,
288-
block_size: _,
289-
carrier_size: _,
290-
max_carrier_size: _
291-
],
292-
[
293-
name: :binary_alloc,
294-
block_size: _,
295-
carrier_size: _,
296-
max_carrier_size: _
297-
],
298-
[
299-
name: :driver_alloc,
300-
block_size: _,
301-
carrier_size: _,
302-
max_carrier_size: _
303-
]
238+
%{name: :total, block_size: _, carrier_size: m1, max_carrier_size: m1},
239+
%{name: :temp_alloc, block_size: _, carrier_size: m2, max_carrier_size: m2},
240+
%{name: :sl_alloc, block_size: _, carrier_size: m3, max_carrier_size: m3},
241+
%{name: :std_alloc, block_size: _, carrier_size: m4, max_carrier_size: m4},
242+
%{name: :ll_alloc, block_size: _, carrier_size: m5, max_carrier_size: m5},
243+
%{name: :eheap_alloc, block_size: _, carrier_size: m6, max_carrier_size: m6},
244+
%{name: :ets_alloc, block_size: _, carrier_size: m7, max_carrier_size: m7},
245+
%{name: :fix_alloc, block_size: _, carrier_size: m8, max_carrier_size: m8},
246+
%{name: :literal_alloc, block_size: _, carrier_size: m9, max_carrier_size: m9},
247+
%{name: :binary_alloc, block_size: _, carrier_size: m10, max_carrier_size: m10},
248+
%{name: :driver_alloc, block_size: _, carrier_size: m11, max_carrier_size: m11}
304249
] = list
305250

251+
assert %{
252+
total: m1,
253+
temp_alloc: m2,
254+
sl_alloc: m3,
255+
std_alloc: m4,
256+
ll_alloc: m5,
257+
eheap_alloc: m6,
258+
ets_alloc: m7,
259+
fix_alloc: m8,
260+
literal_alloc: m9,
261+
binary_alloc: m10,
262+
driver_alloc: m11
263+
} == max
264+
306265
for alloc <- list do
307266
assert is_atom(alloc[:name])
308267
assert is_integer(alloc[:block_size])
309268
assert is_integer(alloc[:carrier_size])
310269
assert is_integer(alloc[:max_carrier_size])
311270
end
312271
end
272+
273+
test "handles max_carrier_sizes" do
274+
top = 999_999_999_999_999_999
275+
276+
max = %{
277+
total: top,
278+
temp_alloc: top,
279+
sl_alloc: top,
280+
std_alloc: top,
281+
ll_alloc: top,
282+
eheap_alloc: top,
283+
ets_alloc: top,
284+
fix_alloc: top,
285+
literal_alloc: top,
286+
binary_alloc: top,
287+
driver_alloc: top
288+
}
289+
290+
assert {list, ^max} = SystemInfo.fetch_memory_allocators(node(), max)
291+
292+
assert [
293+
%{name: :total, block_size: _, carrier_size: _, max_carrier_size: ^top},
294+
%{name: :temp_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
295+
%{name: :sl_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
296+
%{name: :std_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
297+
%{name: :ll_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
298+
%{name: :eheap_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
299+
%{name: :ets_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
300+
%{name: :fix_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
301+
%{name: :literal_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
302+
%{name: :binary_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top},
303+
%{name: :driver_alloc, block_size: _, carrier_size: _, max_carrier_size: ^top}
304+
] = list
305+
end
313306
end
314307
end

0 commit comments

Comments
 (0)