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")