Packages
livebook
0.14.5
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook/apps/manager_watcher.ex
defmodule Livebook.Apps.ManagerWatcher do
# Monitors the global `Livebook.Apps.Manager` and starts a new one
# whenever needed.
use GenServer
@name __MODULE__
@doc """
Starts a new watcher process.
"""
@spec start_link(keyword()) :: GenServer.on_start()
def start_link(_opts) do
GenServer.start_link(__MODULE__, {}, name: @name)
end
@impl true
def init({}) do
# At this point the DeploymentSupervisor is still starting, so we
# start the Manager in handle_continue to avoid a dead lock
{:ok, {}, {:continue, :after_init}}
end
@impl true
def handle_continue(:after_init, {}) do
monitor_ref = maybe_start_and_monitor()
{:noreply, %{monitor_ref: monitor_ref}}
end
@impl true
def handle_info({:DOWN, ref, :process, _pid, _reason}, state) when ref == state.monitor_ref do
monitor_ref = maybe_start_and_monitor()
{:noreply, %{monitor_ref: monitor_ref}}
end
defp maybe_start_and_monitor() do
pid =
case Livebook.Apps.DeploymentSupervisor.start_manager() do
{:ok, pid} ->
report_manager_started(pid)
pid
{:error, {:already_started, pid}} ->
pid
end
Process.monitor(pid)
end
defp report_manager_started(pid) do
# We use this specifically for tests
message = {:manager_started, pid}
Phoenix.PubSub.direct_broadcast!(node(), Livebook.PubSub, "manager_watcher", message)
end
end