From 5f04d716ba6843e69c2ff8f140f75fe4781ea540 Mon Sep 17 00:00:00 2001 From: mayor Date: Fri, 6 Feb 2026 13:06:37 -0600 Subject: [PATCH] fix: handle device deletion during discovery Previously, if a device was deleted while a discovery job was in progress, the wait_loop would crash with Ecto.NoResultsError when trying to check if discovery had completed. Now uses get_device_with_details which returns nil for missing devices, and gracefully returns {:error, :device_deleted} instead of crashing. --- lib/towerops/workers/discovery_worker.ex | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/towerops/workers/discovery_worker.ex b/lib/towerops/workers/discovery_worker.ex index a6c88412..0756a786 100644 --- a/lib/towerops/workers/discovery_worker.ex +++ b/lib/towerops/workers/discovery_worker.ex @@ -395,21 +395,30 @@ defmodule Towerops.Workers.DiscoveryWorker do # Check if discovery completed (last_discovery_at changed) true -> - device = Devices.get_device!(device_id) + case Devices.get_device_with_details(device_id) do + nil -> + Logger.warning( + "Device not found for discovery request", + device_id: device_id + ) - if device.last_discovery_at == initial_discovery_at do - # Wait 500ms before checking again - Process.sleep(500) - wait_loop(device_id, agent_token_id, initial_discovery_at, start_time, timeout_ms) - else - Logger.info( - "Agent discovery completed successfully", - device_id: device_id, - agent_token_id: agent_token_id, - elapsed_ms: elapsed - ) + {:error, :device_deleted} - :ok + device -> + if device.last_discovery_at == initial_discovery_at do + # Wait 500ms before checking again + Process.sleep(500) + wait_loop(device_id, agent_token_id, initial_discovery_at, start_time, timeout_ms) + else + Logger.info( + "Agent discovery completed successfully", + device_id: device_id, + agent_token_id: agent_token_id, + elapsed_ms: elapsed + ) + + :ok + end end end end