From 6e66c80120e61ef1b421157ee63e19da4cee0fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Mon, 18 Apr 2022 18:06:04 +0200 Subject: [PATCH] Keep memory usage state at the root on homepage (#1129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Keep memory usage state at the root on homepage * Update lib/livebook/system_resources.ex Co-authored-by: José Valim Co-authored-by: José Valim --- lib/livebook/settings.ex | 2 +- lib/livebook/system_resources.ex | 9 ++++++--- lib/livebook_web/live/home_live.ex | 8 +++++++- .../live/home_live/close_session_component.ex | 1 - .../live/home_live/edit_sessions_component.ex | 2 -- .../live/home_live/session_list_component.ex | 19 +++---------------- 6 files changed, 17 insertions(+), 24 deletions(-) diff --git a/lib/livebook/settings.ex b/lib/livebook/settings.ex index cf270cf92..0a6686010 100644 --- a/lib/livebook/settings.ex +++ b/lib/livebook/settings.ex @@ -13,7 +13,7 @@ defmodule Livebook.Settings do @doc """ Returns the current autosave path. """ - @spec autosave_path() :: String.t() + @spec autosave_path() :: String.t() | nil def autosave_path() do case storage().fetch_key(:settings, "global", :autosave_path) do {:ok, value} -> value diff --git a/lib/livebook/system_resources.ex b/lib/livebook/system_resources.ex index c77886152..65a4950de 100644 --- a/lib/livebook/system_resources.ex +++ b/lib/livebook/system_resources.ex @@ -46,13 +46,16 @@ defmodule Livebook.SystemResources do @impl true def handle_cast(:update, state) do - measure() + memory = measure() + Phoenix.PubSub.local_broadcast(Livebook.PubSub, "system_resources", {:memory_update, memory}) {:noreply, state} end defp measure() do - memory = :memsup.get_system_memory_data() - :ets.insert(@name, {:memory, %{total: memory[:total_memory], free: memory[:free_memory]}}) + memory_data = :memsup.get_system_memory_data() + memory = %{total: memory_data[:total_memory], free: memory_data[:free_memory]} + :ets.insert(@name, {:memory, memory}) + memory end defp schedule() do diff --git a/lib/livebook_web/live/home_live.ex b/lib/livebook_web/live/home_live.ex index 29cd71cc7..57ef6f5e1 100644 --- a/lib/livebook_web/live/home_live.ex +++ b/lib/livebook_web/live/home_live.ex @@ -11,6 +11,7 @@ defmodule LivebookWeb.HomeLive do def mount(params, _session, socket) do if connected?(socket) do Phoenix.PubSub.subscribe(Livebook.PubSub, "tracker_sessions") + Phoenix.PubSub.subscribe(Livebook.PubSub, "system_resources") end sessions = Sessions.list_sessions() @@ -113,7 +114,8 @@ defmodule LivebookWeb.HomeLive do
<.live_component module={LivebookWeb.HomeLive.SessionListComponent} id="session-list" - sessions={@sessions}/> + sessions={@sessions} + memory={@memory} />
@@ -335,6 +337,10 @@ defmodule LivebookWeb.HomeLive do {:noreply, socket} end + def handle_info({:memory_update, memory}, socket) do + {:noreply, assign(socket, memory: memory)} + end + defp files(sessions) do Enum.map(sessions, & &1.file) end diff --git a/lib/livebook_web/live/home_live/close_session_component.ex b/lib/livebook_web/live/home_live/close_session_component.ex index a5d7154be..db5abf70e 100644 --- a/lib/livebook_web/live/home_live/close_session_component.ex +++ b/lib/livebook_web/live/home_live/close_session_component.ex @@ -33,7 +33,6 @@ defmodule LivebookWeb.HomeLive.CloseSessionComponent do @impl true def handle_event("close", %{}, socket) do Livebook.Session.close(socket.assigns.session.pid) - SessionListComponent.refresh_memory_info() {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} end end diff --git a/lib/livebook_web/live/home_live/edit_sessions_component.ex b/lib/livebook_web/live/home_live/edit_sessions_component.ex index 2c58ff184..cee769280 100644 --- a/lib/livebook_web/live/home_live/edit_sessions_component.ex +++ b/lib/livebook_web/live/home_live/edit_sessions_component.ex @@ -54,7 +54,6 @@ defmodule LivebookWeb.HomeLive.EditSessionsComponent do |> Enum.map(& &1.pid) |> Livebook.Session.close() - SessionListComponent.refresh_memory_info() {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} end @@ -64,7 +63,6 @@ defmodule LivebookWeb.HomeLive.EditSessionsComponent do |> Enum.map(& &1.pid) |> Livebook.Session.disconnect_runtime() - SessionListComponent.refresh_memory_info() {:noreply, push_patch(socket, to: socket.assigns.return_to, replace: true)} end diff --git a/lib/livebook_web/live/home_live/session_list_component.ex b/lib/livebook_web/live/home_live/session_list_component.ex index 000ede691..0f5b41124 100644 --- a/lib/livebook_web/live/home_live/session_list_component.ex +++ b/lib/livebook_web/live/home_live/session_list_component.ex @@ -12,10 +12,6 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do end @impl true - def update(%{memory_timestamp: ts}, socket) do - {:ok, assign(socket, :memory_timestamp, ts)} - end - def update(assigns, socket) do {sessions, assigns} = Map.pop!(assigns, :sessions) @@ -30,11 +26,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do socket = socket |> assign(assigns) - |> assign( - sessions: sessions, - show_autosave_note?: show_autosave_note?, - memory_timestamp: System.os_time() - ) + |> assign(sessions: sessions, show_autosave_note?: show_autosave_note?) {:ok, socket} end @@ -50,7 +42,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
- <.memory_info memory_timestamp={@memory_timestamp} /> + <.memory_info memory={@memory} /> <%= if @sessions != [] do %> <.edit_sessions sessions={@sessions} socket={@socket}/> <% end %> @@ -191,7 +183,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do end defp memory_info(assigns) do - %{free: free, total: total} = Livebook.SystemResources.memory() + %{free: free, total: total} = assigns.memory used = total - free percentage = Float.round(used / total * 100, 2) 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 session = Enum.find(socket.assigns.sessions, &(&1.id == session_id)) Session.disconnect_runtime(session.pid) - refresh_memory_info() {:noreply, socket} end @@ -300,10 +291,6 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do time_words <> " ago" end - def refresh_memory_info do - send_update(__MODULE__, memory_timestamp: System.os_time(), id: "session-list") - end - def toggle_edit(:on) do JS.remove_class("hidden", to: "[data-el-bulk-edit-member]") |> JS.add_class("hidden", to: "#toggle-edit")