Skip to content

Commit 12dc56b

Browse files
aleDszjonatanklosko
andcommitted
Stores the node in session for clustering (#3158)
Co-authored-by: Jonatan Kłosko <jonatanklosko@gmail.com>
1 parent fa7879d commit 12dc56b

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

lib/livebook/zta/livebook_teams.ex

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ defmodule Livebook.ZTA.LivebookTeams do
1818
id = Keyword.fetch!(opts, :identity_key)
1919
team = Livebook.Hubs.fetch_hub!(id)
2020

21-
if :ets.whereis(__MODULE__) == :undefined do
22-
:ets.new(__MODULE__, [:named_table, :public, :set, read_concurrency: true])
23-
end
21+
:ets.new(name, [:named_table, :public, :set, read_concurrency: true])
2422

2523
NimbleZTA.put(name, team)
2624
:ignore
@@ -31,7 +29,7 @@ defmodule Livebook.ZTA.LivebookTeams do
3129
team = NimbleZTA.get(name)
3230

3331
if Livebook.Hubs.TeamClient.identity_enabled?(team.id) do
34-
handle_request(conn, team, conn.params)
32+
handle_request(name, conn, team, conn.params)
3533
else
3634
{conn, %{}}
3735
end
@@ -55,14 +53,16 @@ defmodule Livebook.ZTA.LivebookTeams do
5553
|> redirect(external: url)
5654
end
5755

58-
defp handle_request(conn, team, %{"teams_identity" => _, "code" => code}) do
56+
defp handle_request(name, conn, team, %{"teams_identity" => _, "code" => code}) do
5957
with {:ok, access_token} <- retrieve_access_token(team, code),
6058
{:ok, payload} <- Teams.Requests.get_user_info(team, access_token) do
6159
metadata = build_metadata(team.id, payload)
62-
:ets.insert(__MODULE__, {access_token, {System.os_time(:second) + 3 * 3600, metadata}})
60+
exp = System.os_time(:second) + 3 * 3600
61+
:ets.insert(name, {access_token, {exp, metadata}})
6362

6463
{conn
6564
|> put_session(:livebook_teams_access_token, access_token)
65+
|> put_session(:livebook_teams_metadata_node, node())
6666
|> redirect(to: conn.request_path)
6767
|> halt(), metadata}
6868
else
@@ -74,14 +74,14 @@ defmodule Livebook.ZTA.LivebookTeams do
7474
end
7575
end
7676

77-
defp handle_request(conn, _team, %{"teams_identity" => _, "failed_reason" => reason}) do
77+
defp handle_request(_name, conn, _team, %{"teams_identity" => _, "failed_reason" => reason}) do
7878
{conn
7979
|> put_session(:teams_failed_reason, reason)
8080
|> redirect(to: conn.request_path)
8181
|> halt(), nil}
8282
end
8383

84-
defp handle_request(conn, team, %{"teams_redirect" => _, "redirect_to" => redirect_to}) do
84+
defp handle_request(_name, conn, team, %{"teams_redirect" => _, "redirect_to" => redirect_to}) do
8585
case Teams.Requests.create_auth_request(team) do
8686
{:ok, %{"authorize_uri" => authorize_uri}} ->
8787
uri =
@@ -101,10 +101,10 @@ defmodule Livebook.ZTA.LivebookTeams do
101101
end
102102
end
103103

104-
defp handle_request(conn, team, _params) do
104+
defp handle_request(name, conn, team, _params) do
105105
case get_session(conn) do
106106
%{"livebook_teams_access_token" => access_token} ->
107-
validate_access_token(conn, team, access_token)
107+
validate_access_token(name, conn, team, access_token)
108108

109109
%{"teams_error" => true} ->
110110
{conn
@@ -166,20 +166,27 @@ defmodule Livebook.ZTA.LivebookTeams do
166166
{conn |> html(html_document) |> halt(), nil}
167167
end
168168

169-
defp validate_access_token(conn, team, access_token) do
169+
defp validate_access_token(name, conn, team, access_token) do
170+
node = get_session(conn, :livebook_teams_metadata_node)
171+
170172
case Teams.Requests.get_user_info(team, access_token) do
171173
{:ok, payload} ->
172174
{conn, build_metadata(team.id, payload)}
173175

174176
:econnrefused ->
175-
data = :ets.lookup_element(__MODULE__, access_token, 2, nil)
177+
data =
178+
try do
179+
:erpc.call(node, :ets, :lookup_element, [name, access_token, 2, nil])
180+
catch
181+
_, _ -> nil
182+
end
176183

177184
case {System.os_time(:second), data} do
178185
{current_timestamp, {exp, metadata}} when current_timestamp <= exp ->
179186
{conn, metadata}
180187

181188
{_, entry} ->
182-
entry && :ets.delete(__MODULE__, access_token)
189+
entry && :erpc.call(node, :ets, :delete, [name, access_token])
183190

184191
{conn
185192
|> put_status(:service_unavailable)

test/livebook_teams/zta/livebook_teams_test.exs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,12 @@ defmodule Livebook.ZTA.LivebookTeamsTest do
144144

145145
# simulate if the token already expired
146146
exp = System.os_time(:second) - 5 * 60
147-
{_, metadata} = :ets.lookup_element(LivebookTeams, access_token, 2)
148-
:ets.insert(LivebookTeams, {access_token, {exp, metadata}})
147+
metadata_node = get_session(conn, :livebook_teams_metadata_node)
148+
149+
{_, metadata} =
150+
:erpc.call(metadata_node, :ets, :lookup_element, [test, access_token, 2, nil])
151+
152+
:erpc.call(metadata_node, :ets, :insert, [test, {access_token, {exp, metadata}}])
149153

150154
# now it should return status 503
151155
assert {%{status: 503, halted: true, resp_body: body}, nil} =

0 commit comments

Comments
 (0)