mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-11-08 05:04:46 +08:00
Refresh memory when closing/disconnecting sessions (#1124)
* Refresh memory when closing/disconnecting sessions * Fixes
This commit is contained in:
parent
2b19a6f55c
commit
4248de6003
4 changed files with 53 additions and 36 deletions
|
|
@ -292,33 +292,6 @@ defmodule LivebookWeb.HomeLive do
|
|||
{:noreply, push_patch(socket, to: Routes.home_path(socket, :edit_sessions, "close_all"))}
|
||||
end
|
||||
|
||||
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)
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_event("fork_session", %{"id" => session_id}, socket) do
|
||||
session = Enum.find(socket.assigns.sessions, &(&1.id == session_id))
|
||||
%{images_dir: images_dir} = session
|
||||
data = Session.get_data(session.pid)
|
||||
notebook = Notebook.forked(data.notebook)
|
||||
|
||||
origin =
|
||||
if data.file do
|
||||
{:file, data.file}
|
||||
else
|
||||
data.origin
|
||||
end
|
||||
|
||||
{:noreply,
|
||||
create_session(socket,
|
||||
notebook: notebook,
|
||||
copy_images_from: images_dir,
|
||||
origin: origin
|
||||
)}
|
||||
end
|
||||
|
||||
def handle_event("open_autosave_directory", %{}, socket) do
|
||||
file =
|
||||
Livebook.Settings.autosave_path()
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
defmodule LivebookWeb.HomeLive.CloseSessionComponent do
|
||||
use LivebookWeb, :live_component
|
||||
|
||||
import LivebookWeb.HomeLive.SessionListComponent, only: [toggle_edit: 1]
|
||||
alias LivebookWeb.HomeLive.SessionListComponent
|
||||
|
||||
@impl true
|
||||
def render(assigns) do
|
||||
|
|
@ -20,7 +20,7 @@ defmodule LivebookWeb.HomeLive.CloseSessionComponent do
|
|||
</p>
|
||||
<div class="mt-8 flex justify-end space-x-2">
|
||||
<button class="button-base button-red" role="button"
|
||||
phx-click={toggle_edit(:off) |> JS.push("close", target: @myself)}>
|
||||
phx-click={SessionListComponent.toggle_edit(:off) |> JS.push("close", target: @myself)}>
|
||||
<.remix_icon icon="close-circle-line" class="align-middle mr-1" />
|
||||
Close session
|
||||
</button>
|
||||
|
|
@ -33,6 +33,7 @@ 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
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
defmodule LivebookWeb.HomeLive.EditSessionsComponent do
|
||||
use LivebookWeb, :live_component
|
||||
|
||||
import LivebookWeb.HomeLive.SessionListComponent, only: [toggle_edit: 1]
|
||||
alias LivebookWeb.HomeLive.SessionListComponent
|
||||
|
||||
@impl true
|
||||
def render(assigns) do
|
||||
|
|
@ -13,7 +13,7 @@ defmodule LivebookWeb.HomeLive.EditSessionsComponent do
|
|||
<.message action={@action} selected_sessions={@selected_sessions} sessions={@sessions}/>
|
||||
<div class="mt-8 flex justify-end space-x-2">
|
||||
<button class="button-base button-red" role="button"
|
||||
phx-click={toggle_edit(:off) |> JS.push(@action, target: @myself)}>
|
||||
phx-click={SessionListComponent.toggle_edit(:off) |> JS.push(@action, target: @myself)}>
|
||||
<.remix_icon icon="close-circle-line" class="align-middle mr-1" />
|
||||
<%= button_label(@action) %>
|
||||
</button>
|
||||
|
|
@ -54,6 +54,7 @@ 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
|
||||
|
||||
|
|
@ -63,6 +64,7 @@ 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
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,18 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
import Livebook.Utils, only: [format_bytes: 1]
|
||||
import LivebookWeb.SessionHelpers
|
||||
|
||||
alias Livebook.{Session, Notebook}
|
||||
|
||||
@impl true
|
||||
def mount(socket) do
|
||||
{:ok, assign(socket, order_by: "date"), temporary_assigns: [memory: nil]}
|
||||
{:ok, assign(socket, order_by: "date")}
|
||||
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)
|
||||
|
||||
|
|
@ -27,7 +33,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
|> assign(
|
||||
sessions: sessions,
|
||||
show_autosave_note?: show_autosave_note?,
|
||||
memory: Livebook.SystemResources.memory()
|
||||
memory_timestamp: System.os_time()
|
||||
)
|
||||
|
||||
{:ok, socket}
|
||||
|
|
@ -44,7 +50,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
</h2>
|
||||
</div>
|
||||
<div class="flex flex-row">
|
||||
<.memory_info memory={@memory} />
|
||||
<.memory_info memory_timestamp={@memory_timestamp} />
|
||||
<%= if @sessions != [] do %>
|
||||
<.edit_sessions sessions={@sessions} socket={@socket}/>
|
||||
<% end %>
|
||||
|
|
@ -71,7 +77,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
</div>
|
||||
</div>
|
||||
<.session_list sessions={@sessions} socket={@socket}
|
||||
show_autosave_note?={@show_autosave_note?} />
|
||||
show_autosave_note?={@show_autosave_note?} myself={@myself} />
|
||||
</form>
|
||||
"""
|
||||
end
|
||||
|
|
@ -148,6 +154,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
type="button"
|
||||
role="menuitem"
|
||||
phx-click="fork_session"
|
||||
phx-target={@myself}
|
||||
phx-value-id={session.id}>
|
||||
<.remix_icon icon="git-branch-line" />
|
||||
<span class="font-medium">Fork</span>
|
||||
|
|
@ -163,6 +170,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
type="button"
|
||||
disabled={!session.memory_usage.runtime}
|
||||
role="menuitem"
|
||||
phx-target={@myself}
|
||||
phx-click={toggle_edit(:off) |> JS.push("disconnect_runtime")}
|
||||
phx-value-id={session.id}>
|
||||
<.remix_icon icon="shut-down-line" />
|
||||
|
|
@ -182,7 +190,8 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
"""
|
||||
end
|
||||
|
||||
defp memory_info(%{memory: %{free: free, total: total}} = assigns) do
|
||||
defp memory_info(assigns) do
|
||||
%{free: free, total: total} = Livebook.SystemResources.memory()
|
||||
used = total - free
|
||||
percentage = Float.round(used / total * 100, 2)
|
||||
assigns = assign(assigns, free: free, used: used, total: total, percentage: percentage)
|
||||
|
|
@ -258,11 +267,43 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
|
|||
{:noreply, assign(socket, sessions: sessions, order_by: order_by)}
|
||||
end
|
||||
|
||||
def handle_event("fork_session", %{"id" => session_id}, socket) do
|
||||
session = Enum.find(socket.assigns.sessions, &(&1.id == session_id))
|
||||
%{images_dir: images_dir} = session
|
||||
data = Session.get_data(session.pid)
|
||||
notebook = Notebook.forked(data.notebook)
|
||||
|
||||
origin =
|
||||
if data.file do
|
||||
{:file, data.file}
|
||||
else
|
||||
data.origin
|
||||
end
|
||||
|
||||
{:noreply,
|
||||
create_session(socket,
|
||||
notebook: notebook,
|
||||
copy_images_from: images_dir,
|
||||
origin: origin
|
||||
)}
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
def format_creation_date(created_at) do
|
||||
time_words = created_at |> DateTime.to_naive() |> Livebook.Utils.Time.time_ago_in_words()
|
||||
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")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue