Keep memory usage state at the root on homepage (#1129)

* Keep memory usage state at the root on homepage

* Update lib/livebook/system_resources.ex

Co-authored-by: José Valim <jose.valim@dashbit.co>

Co-authored-by: José Valim <jose.valim@dashbit.co>
This commit is contained in:
Jonatan Kłosko 2022-04-18 18:06:04 +02:00 committed by GitHub
parent 4248de6003
commit 6e66c80120
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 17 additions and 24 deletions

View file

@ -13,7 +13,7 @@ defmodule Livebook.Settings do
@doc """ @doc """
Returns the current autosave path. Returns the current autosave path.
""" """
@spec autosave_path() :: String.t() @spec autosave_path() :: String.t() | nil
def autosave_path() do def autosave_path() do
case storage().fetch_key(:settings, "global", :autosave_path) do case storage().fetch_key(:settings, "global", :autosave_path) do
{:ok, value} -> value {:ok, value} -> value

View file

@ -46,13 +46,16 @@ defmodule Livebook.SystemResources do
@impl true @impl true
def handle_cast(:update, state) do def handle_cast(:update, state) do
measure() memory = measure()
Phoenix.PubSub.local_broadcast(Livebook.PubSub, "system_resources", {:memory_update, memory})
{:noreply, state} {:noreply, state}
end end
defp measure() do defp measure() do
memory = :memsup.get_system_memory_data() memory_data = :memsup.get_system_memory_data()
:ets.insert(@name, {:memory, %{total: memory[:total_memory], free: memory[:free_memory]}}) memory = %{total: memory_data[:total_memory], free: memory_data[:free_memory]}
:ets.insert(@name, {:memory, memory})
memory
end end
defp schedule() do defp schedule() do

View file

@ -11,6 +11,7 @@ defmodule LivebookWeb.HomeLive do
def mount(params, _session, socket) do def mount(params, _session, socket) do
if connected?(socket) do if connected?(socket) do
Phoenix.PubSub.subscribe(Livebook.PubSub, "tracker_sessions") Phoenix.PubSub.subscribe(Livebook.PubSub, "tracker_sessions")
Phoenix.PubSub.subscribe(Livebook.PubSub, "system_resources")
end end
sessions = Sessions.list_sessions() sessions = Sessions.list_sessions()
@ -113,7 +114,8 @@ defmodule LivebookWeb.HomeLive do
<div id="running-sessions" class="py-12" role="region" aria-label="running sessions"> <div id="running-sessions" class="py-12" role="region" aria-label="running sessions">
<.live_component module={LivebookWeb.HomeLive.SessionListComponent} <.live_component module={LivebookWeb.HomeLive.SessionListComponent}
id="session-list" id="session-list"
sessions={@sessions}/> sessions={@sessions}
memory={@memory} />
</div> </div>
</div> </div>
</div> </div>
@ -335,6 +337,10 @@ defmodule LivebookWeb.HomeLive do
{:noreply, socket} {:noreply, socket}
end end
def handle_info({:memory_update, memory}, socket) do
{:noreply, assign(socket, memory: memory)}
end
defp files(sessions) do defp files(sessions) do
Enum.map(sessions, & &1.file) Enum.map(sessions, & &1.file)
end end

View file

@ -33,7 +33,6 @@ defmodule LivebookWeb.HomeLive.CloseSessionComponent do
@impl true @impl true
def handle_event("close", %{}, socket) do def handle_event("close", %{}, socket) do
Livebook.Session.close(socket.assigns.session.pid) Livebook.Session.close(socket.assigns.session.pid)
SessionListComponent.refresh_memory_info()
{:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)}
end end
end end

View file

@ -54,7 +54,6 @@ defmodule LivebookWeb.HomeLive.EditSessionsComponent do
|> Enum.map(& &1.pid) |> Enum.map(& &1.pid)
|> Livebook.Session.close() |> Livebook.Session.close()
SessionListComponent.refresh_memory_info()
{:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)}
end end
@ -64,7 +63,6 @@ defmodule LivebookWeb.HomeLive.EditSessionsComponent do
|> Enum.map(& &1.pid) |> Enum.map(& &1.pid)
|> Livebook.Session.disconnect_runtime() |> Livebook.Session.disconnect_runtime()
SessionListComponent.refresh_memory_info()
{:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)}
end end

View file

@ -12,10 +12,6 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
end end
@impl true @impl true
def update(%{memory_timestamp: ts}, socket) do
{:ok, assign(socket, :memory_timestamp, ts)}
end
def update(assigns, socket) do def update(assigns, socket) do
{sessions, assigns} = Map.pop!(assigns, :sessions) {sessions, assigns} = Map.pop!(assigns, :sessions)
@ -30,11 +26,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
socket = socket =
socket socket
|> assign(assigns) |> assign(assigns)
|> assign( |> assign(sessions: sessions, show_autosave_note?: show_autosave_note?)
sessions: sessions,
show_autosave_note?: show_autosave_note?,
memory_timestamp: System.os_time()
)
{:ok, socket} {:ok, socket}
end end
@ -50,7 +42,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
</h2> </h2>
</div> </div>
<div class="flex flex-row"> <div class="flex flex-row">
<.memory_info memory_timestamp={@memory_timestamp} /> <.memory_info memory={@memory} />
<%= if @sessions != [] do %> <%= if @sessions != [] do %>
<.edit_sessions sessions={@sessions} socket={@socket}/> <.edit_sessions sessions={@sessions} socket={@socket}/>
<% end %> <% end %>
@ -191,7 +183,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
end end
defp memory_info(assigns) do defp memory_info(assigns) do
%{free: free, total: total} = Livebook.SystemResources.memory() %{free: free, total: total} = assigns.memory
used = total - free used = total - free
percentage = Float.round(used / total * 100, 2) percentage = Float.round(used / total * 100, 2)
assigns = assign(assigns, free: free, used: used, total: total, percentage: percentage) assigns = assign(assigns, free: free, used: used, total: total, percentage: percentage)
@ -291,7 +283,6 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
def handle_event("disconnect_runtime", %{"id" => session_id}, socket) do def handle_event("disconnect_runtime", %{"id" => session_id}, socket) do
session = Enum.find(socket.assigns.sessions, &(&1.id == session_id)) session = Enum.find(socket.assigns.sessions, &(&1.id == session_id))
Session.disconnect_runtime(session.pid) Session.disconnect_runtime(session.pid)
refresh_memory_info()
{:noreply, socket} {:noreply, socket}
end end
@ -300,10 +291,6 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
time_words <> " ago" time_words <> " ago"
end end
def refresh_memory_info do
send_update(__MODULE__, memory_timestamp: System.os_time(), id: "session-list")
end
def toggle_edit(:on) do def toggle_edit(:on) do
JS.remove_class("hidden", to: "[data-el-bulk-edit-member]") JS.remove_class("hidden", to: "[data-el-bulk-edit-member]")
|> JS.add_class("hidden", to: "#toggle-edit") |> JS.add_class("hidden", to: "#toggle-edit")