From 9950aa11c2a544246a0e601cbf946b3d242cf111 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Mon, 20 Apr 2026 15:02:29 -0500 Subject: [PATCH] fix(backfill): mark path enrichments :unavailable when pos2 is missing Contacts lacking pos2 had terrain/radar/mechanism stuck on :pending, so BackfillEnqueueWorker re-scanned them every cron cycle. Mark these statuses :unavailable so the enqueue filter excludes them; a later pos2 edit resets them back to :pending via Radio.reset_enrichment_statuses/2. --- .../workers/contact_weather_enqueue_worker.ex | 14 ++++++++++++++ .../contact_weather_enqueue_worker_test.exs | 19 +++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/microwaveprop/workers/contact_weather_enqueue_worker.ex b/lib/microwaveprop/workers/contact_weather_enqueue_worker.ex index 914229e8..570e18d3 100644 --- a/lib/microwaveprop/workers/contact_weather_enqueue_worker.ex +++ b/lib/microwaveprop/workers/contact_weather_enqueue_worker.ex @@ -97,9 +97,23 @@ defmodule Microwaveprop.Workers.ContactWeatherEnqueueWorker do if contact.pos1 && contact.pos2 do mark_path_statuses(contact, ids, types, jobs_by_type) + else + # Path enrichments (terrain/radar/mechanism) need both endpoints. + # Marking :unavailable stops BackfillEnqueueWorker from re-scanning + # these contacts every cron cycle. Radio.reset_enrichment_statuses/2 + # will flip them back to :pending if pos2 is added later. + mark_missing_path_statuses(ids, types) end end + defp mark_missing_path_statuses(ids, types) do + if :terrain in types, do: Radio.set_enrichment_status!(ids, :terrain_status, :unavailable) + if :radar in types, do: Radio.set_enrichment_status!(ids, :radar_status, :unavailable) + + if :mechanism in types, + do: Radio.set_enrichment_status!(ids, :propagation_mechanism_status, :unavailable) + end + defp mark_pos1_statuses(contact, ids, types, jobs_by_type) do if :weather in types, do: mark_status!(ids, :weather_status, jobs_by_type[:weather]) if :hrrr in types, do: mark_hrrr_status!(contact, ids, jobs_by_type[:hrrr]) diff --git a/test/microwaveprop/workers/contact_weather_enqueue_worker_test.exs b/test/microwaveprop/workers/contact_weather_enqueue_worker_test.exs index 8503d332..c82d882b 100644 --- a/test/microwaveprop/workers/contact_weather_enqueue_worker_test.exs +++ b/test/microwaveprop/workers/contact_weather_enqueue_worker_test.exs @@ -370,13 +370,13 @@ defmodule Microwaveprop.Workers.ContactWeatherEnqueueWorkerTest do assert updated.terrain_status == :queued end - test "skips terrain for QSOs missing pos2" do - _qso = create_contact(%{pos2: nil}) + test "marks terrain :unavailable for QSOs missing pos2" do + contact = create_contact(%{pos2: nil, grid2: nil}) - assert :ok = ContactWeatherEnqueueWorker.perform(%Oban.Job{args: %{}}) + assert :ok = ContactWeatherEnqueueWorker.enqueue_for_contact(contact) - all_contacts = Repo.all(Contact) - refute Enum.any?(all_contacts, &(&1.terrain_status == :queued)) + updated = Repo.get!(Contact, contact.id) + assert updated.terrain_status == :unavailable end end @@ -682,7 +682,7 @@ defmodule Microwaveprop.Workers.ContactWeatherEnqueueWorkerTest do assert updated.iemre_status == :queued end - test "works for QSO without pos2 or grid2 (terrain stays pending)" do + test "works for QSO without pos2 or grid2 (path statuses flip to :unavailable)" do _station = create_asos_station("KDFW", 32.90, -97.04) contact = create_contact(%{pos2: nil, grid2: nil}) @@ -691,9 +691,12 @@ defmodule Microwaveprop.Workers.ContactWeatherEnqueueWorkerTest do updated = Repo.get!(Contact, contact.id) assert updated.weather_status == :queued assert updated.hrrr_status == :queued - # terrain requires pos2, so it can't be queued - assert updated.terrain_status == :pending assert updated.iemre_status == :queued + # Path-dependent enrichments need pos2 — marking :unavailable keeps + # BackfillEnqueueWorker from re-scanning these contacts every cron. + assert updated.terrain_status == :unavailable + assert updated.radar_status == :unavailable + assert updated.propagation_mechanism_status == :unavailable end # Pre-2014 contacts have no HRRR data ever; mark hrrr_status :unavailable