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,