From e2f53763554986a685b1e9ec035df18ca2f6b3ea Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Mon, 30 Mar 2026 07:53:49 -0500 Subject: [PATCH] Cancel HRRR jobs on permanent failures (404, outside_grid) HTTP 404 means the HRRR data doesn't exist on NOAA S3 (pre-2014 dates, etc.) and will never succeed. Return {:cancel, reason} instead of {:error, reason} so Oban stops retrying immediately. --- lib/microwaveprop/workers/hrrr_fetch_worker.ex | 12 +++++++++++- .../workers/hrrr_fetch_worker_test.exs | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/microwaveprop/workers/hrrr_fetch_worker.ex b/lib/microwaveprop/workers/hrrr_fetch_worker.ex index 783f50f1..1b5bcb35 100644 --- a/lib/microwaveprop/workers/hrrr_fetch_worker.ex +++ b/lib/microwaveprop/workers/hrrr_fetch_worker.ex @@ -47,11 +47,21 @@ defmodule Microwaveprop.Workers.HrrrFetchWorker do :ok {:error, reason} -> - {:error, reason} + if permanent_failure?(reason) do + {:cancel, reason} + else + {:error, reason} + end end end end + # 404 means the HRRR data doesn't exist (pre-2014, etc.) — will never succeed + defp permanent_failure?("HRRR idx HTTP 404"), do: true + defp permanent_failure?("HRRR grib HTTP 404"), do: true + defp permanent_failure?(:outside_grid), do: true + defp permanent_failure?(_), do: false + defp maybe_add_derived_params(attrs, nil), do: attrs defp maybe_add_derived_params(attrs, params) do diff --git a/test/microwaveprop/workers/hrrr_fetch_worker_test.exs b/test/microwaveprop/workers/hrrr_fetch_worker_test.exs index 7763aff4..20aa6ea1 100644 --- a/test/microwaveprop/workers/hrrr_fetch_worker_test.exs +++ b/test/microwaveprop/workers/hrrr_fetch_worker_test.exs @@ -89,6 +89,24 @@ defmodule Microwaveprop.Workers.HrrrFetchWorkerTest do end end + describe "permanent_failure?/1" do + test "cancels on 404 idx" do + job = %Oban.Job{ + args: %{ + "lat" => 32.90, + "lon" => -97.04, + "valid_time" => "1995-06-15T12:00:00Z" + } + } + + Req.Test.stub(Microwaveprop.Weather.HrrrClient, fn conn -> + Plug.Conn.send_resp(conn, 404, "not found") + end) + + assert {:cancel, "HRRR idx HTTP 404"} = HrrrFetchWorker.perform(job) + end + end + defp build_profile_attrs(lat, lon, valid_time, client_result) do %{ valid_time: valid_time,