Skip to content

Commit 0bfb768

Browse files
joshkjjcarstens
andauthored
Remove the need to store the devices deployment in the DeviceChannel (#1860)
This is all about reducing the information stored in the assigns for the `DeviceChannel`. It's also allowed us to remove a bunch of preloads which were being done often and fairly aggressively. --------- Co-authored-by: Jon Carstens <[email protected]>
1 parent c926042 commit 0bfb768

File tree

5 files changed

+42
-33
lines changed

5 files changed

+42
-33
lines changed

lib/nerves_hub/archives.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule NervesHub.Archives do
77

88
require Logger
99

10+
alias NervesHub.Deployments.Deployment
1011
alias NervesHub.Archives.Archive
1112
alias NervesHub.Fwup
1213
alias NervesHub.Products.Product
@@ -66,6 +67,16 @@ defmodule NervesHub.Archives do
6667
|> Repo.one!()
6768
end
6869

70+
@spec archive_for_deployment(integer()) :: Archive.t() | nil
71+
def archive_for_deployment(nil), do: nil
72+
73+
def archive_for_deployment(deployment_id) do
74+
Archive
75+
|> join(:inner, [a], d in Deployment, on: d.archive_id == a.id)
76+
|> where([a, d], d.id == ^deployment_id)
77+
|> Repo.one()
78+
end
79+
6980
# TODO: check on other return signatures
7081
@spec create(Product.t(), String.t()) ::
7182
{:ok, Archive.t()}

lib/nerves_hub/audit_logs/templates/device_templates.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,8 @@ defmodule NervesHub.AuditLogs.DeviceTemplates do
7272
AuditLogs.audit!(device, device, description)
7373
end
7474

75-
@spec audit_device_deployment_update_triggered(Device.t(), UUIDv7.t()) :: :ok
76-
def audit_device_deployment_update_triggered(device, reference_id) do
77-
deployment = device.deployment
75+
@spec audit_device_deployment_update_triggered(Device.t(), Deployment.t(), UUIDv7.t()) :: :ok
76+
def audit_device_deployment_update_triggered(device, deployment, reference_id) do
7877
firmware = deployment.firmware
7978

8079
description =

lib/nerves_hub/deployments.ex

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,22 @@ defmodule NervesHub.Deployments do
120120
end
121121
end
122122

123+
@spec get_deployment_for_device(Device.t()) :: {:ok, Deployment.t()} | {:error, :not_found}
124+
def get_deployment_for_device(%Device{deployment_id: deployment_id}) do
125+
Deployment
126+
|> where([d], d.id == ^deployment_id)
127+
|> join(:left, [d], f in assoc(d, :firmware))
128+
|> preload([d, f], firmware: f)
129+
|> Repo.one()
130+
|> case do
131+
nil ->
132+
{:error, :not_found}
133+
134+
deployment ->
135+
{:ok, deployment}
136+
end
137+
end
138+
123139
@spec get_deployment(Product.t(), String.t()) :: {:ok, Deployment.t()} | {:error, :not_found}
124140
def get_deployment(%Product{id: product_id}, deployment_id) do
125141
from(
@@ -385,7 +401,8 @@ defmodule NervesHub.Deployments do
385401
@spec verify_deployment_membership(Device.t()) :: Device.t()
386402
def verify_deployment_membership(%Device{deployment_id: deployment_id} = device)
387403
when not is_nil(deployment_id) do
388-
%{deployment: deployment} = device = Repo.preload(device, deployment: :firmware)
404+
{:ok, deployment} = get_deployment_for_device(device)
405+
389406
bad_architecture = device.firmware_metadata.architecture != deployment.firmware.architecture
390407
bad_platform = device.firmware_metadata.platform != deployment.firmware.platform
391408

@@ -436,18 +453,14 @@ defmodule NervesHub.Deployments do
436453

437454
DeviceTemplates.audit_set_deployment(device, deployment, :one_found)
438455

439-
device
440-
|> Devices.update_deployment(deployment)
441-
|> preload_with_firmware_and_archive(true)
456+
Devices.update_deployment(device, deployment)
442457

443458
[deployment | _] ->
444459
set_deployment_telemetry(:multiple_found, device, deployment)
445460

446461
DeviceTemplates.audit_set_deployment(device, deployment, :multiple_found)
447462

448-
device
449-
|> Devices.update_deployment(deployment)
450-
|> preload_with_firmware_and_archive(true)
463+
Devices.update_deployment(device, deployment)
451464
end
452465
end
453466

lib/nerves_hub/devices.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ defmodule NervesHub.Devices do
1010
alias NervesHub.AuditLogs
1111
alias NervesHub.AuditLogs.DeviceTemplates
1212
alias NervesHub.Certificate
13+
alias NervesHub.Deployments
1314
alias NervesHub.Deployments.Deployment
1415
alias NervesHub.Deployments.Orchestrator
1516
alias NervesHub.Devices.CACertificate
@@ -673,7 +674,7 @@ defmodule NervesHub.Devices do
673674
def resolve_update(%{deployment_id: nil}), do: %UpdatePayload{update_available: false}
674675

675676
def resolve_update(device) do
676-
deployment = Repo.preload(device.deployment, [:firmware])
677+
{:ok, deployment} = Deployments.get_deployment_for_device(device)
677678

678679
case verify_update_eligibility(device, deployment) do
679680
{:ok, _device} ->

lib/nerves_hub_web/channels/device_channel.ex

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ defmodule NervesHubWeb.DeviceChannel do
4141
device
4242
|> Deployments.verify_deployment_membership()
4343
|> Deployments.set_deployment()
44+
|> Map.put(:deployment, nil)
4445

4546
maybe_send_public_keys(device, socket, params)
4647

@@ -124,8 +125,6 @@ defmodule NervesHubWeb.DeviceChannel do
124125

125126
@decorate with_span("Channels.DeviceChannel.handle_info:deployments/update")
126127
def handle_info({"deployments/update", inflight_update}, %{assigns: %{device: device}} = socket) do
127-
device = deployment_preload(device)
128-
129128
payload = Devices.resolve_update(device)
130129

131130
case payload.update_available do
@@ -140,6 +139,7 @@ defmodule NervesHubWeb.DeviceChannel do
140139
# as a loosely valid attempt to update
141140
DeviceTemplates.audit_device_deployment_update_triggered(
142141
device,
142+
payload.deployment,
143143
socket.assigns.reference_id
144144
)
145145

@@ -154,14 +154,7 @@ defmodule NervesHubWeb.DeviceChannel do
154154
end
155155

156156
def handle_info(%Broadcast{event: "archives/updated"}, socket) do
157-
device = deployment_preload(socket.assigns.device)
158-
159-
socket =
160-
socket
161-
|> assign(:device, device)
162-
|> maybe_send_archive()
163-
164-
{:noreply, socket}
157+
{:noreply, maybe_send_archive(socket)}
165158
end
166159

167160
def handle_info(%Broadcast{event: "moved"}, %{assigns: %{device: device}} = socket) do
@@ -317,7 +310,7 @@ defmodule NervesHubWeb.DeviceChannel do
317310

318311
socket =
319312
socket
320-
|> assign(:device, deployment_preload(device))
313+
|> assign(:device, device)
321314
|> assign(:update_started?, true)
322315

323316
{:noreply, socket}
@@ -449,7 +442,7 @@ defmodule NervesHubWeb.DeviceChannel do
449442

450443
defp update_device(socket, device) do
451444
socket
452-
|> assign(:device, deployment_preload(device))
445+
|> assign(:device, device)
453446
|> update_deployment_subscription(device)
454447
end
455448

@@ -476,20 +469,12 @@ defmodule NervesHubWeb.DeviceChannel do
476469
end
477470
end
478471

479-
defp deployment_preload(device) do
480-
Repo.preload(device, [deployment: [:archive, :firmware]], force: true)
481-
end
482-
483-
defp maybe_send_archive(socket) do
484-
device = deployment_preload(socket.assigns.device)
485-
472+
defp maybe_send_archive(%{assigns: %{device: device}} = socket) do
486473
updates_enabled = device.updates_enabled && !Devices.device_in_penalty_box?(device)
487474
version_match = Version.match?(socket.assigns.device_api_version, ">= 2.0.0")
488475

489476
if updates_enabled && version_match do
490-
if device.deployment && device.deployment.archive do
491-
archive = device.deployment.archive
492-
477+
if archive = Archives.archive_for_deployment(device.deployment_id) do
493478
push(socket, "archive", %{
494479
size: archive.size,
495480
uuid: archive.uuid,

0 commit comments

Comments
 (0)