Optimise tracker diffing (#2992)

This commit is contained in:
Jonatan Kłosko 2025-05-01 17:45:16 +02:00 committed by GitHub
parent de568f84b9
commit 1ba59c6ac2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -118,19 +118,22 @@ defmodule Livebook.Tracker do
end end
defp handle_topic_diff(@sessions_topic, {joins, leaves}, state) do defp handle_topic_diff(@sessions_topic, {joins, leaves}, state) do
joins = Map.new(joins) leave_messages =
leaves = Map.new(leaves) for {id, meta} <- leaves, into: %{} do
{id, {:session_closed, meta.session}}
end
messages = messages =
for id <- Enum.uniq(Map.keys(joins) ++ Map.keys(leaves)) do for {id, meta} <- joins, into: leave_messages do
case {joins[id], leaves[id]} do # If there is a corresponding leave, it is actually an update.
{%{session: session}, nil} -> {:session_created, session} if leave_messages[id] do
{nil, %{session: session}} -> {:session_closed, session} {id, {:session_updated, meta.session}}
{%{session: session}, %{}} -> {:session_updated, session} else
{id, {:session_created, meta.session}}
end end
end end
for message <- messages do for {_id, message} <- messages do
Phoenix.PubSub.direct_broadcast!( Phoenix.PubSub.direct_broadcast!(
state.node_name, state.node_name,
state.pubsub_server, state.pubsub_server,
@ -141,19 +144,22 @@ defmodule Livebook.Tracker do
end end
defp handle_topic_diff(@apps_topic, {joins, leaves}, state) do defp handle_topic_diff(@apps_topic, {joins, leaves}, state) do
joins = Map.new(joins) leave_messages =
leaves = Map.new(leaves) for {id, meta} <- leaves, into: %{} do
{id, {:app_closed, meta.app}}
end
messages = messages =
for slug <- Enum.uniq(Map.keys(joins) ++ Map.keys(leaves)) do for {id, meta} <- joins, into: leave_messages do
case {joins[slug], leaves[slug]} do # If there is a corresponding leave, it is actually an update.
{%{app: app}, nil} -> {:app_created, app} if leave_messages[id] do
{nil, %{app: app}} -> {:app_closed, app} {id, {:app_updated, meta.app}}
{%{app: app}, %{}} -> {:app_updated, app} else
{id, {:app_created, meta.app}}
end end
end end
for message <- messages do for {_id, message} <- messages do
Phoenix.PubSub.direct_broadcast!( Phoenix.PubSub.direct_broadcast!(
state.node_name, state.node_name,
state.pubsub_server, state.pubsub_server,