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.
This commit is contained in:
Graham McIntire 2026-02-06 13:06:37 -06:00 committed by Graham McIntire
parent 6a29ee1671
commit 5f04d716ba
No known key found for this signature in database

View file

@ -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