Invert HRRR failure logic: only retry transient network/server errors
Instead of listing every permanent failure string, only retry on known transient errors (5xx, 429, network exceptions). Everything else — GRIB decode errors, 404s, range request failures, index out of range — is cancelled immediately.
This commit is contained in:
parent
8e1fd702f9
commit
bb590a3b64
1 changed files with 16 additions and 15 deletions
|
|
@ -56,28 +56,29 @@ defmodule Microwaveprop.Workers.HrrrFetchWorker do
|
||||||
:ok
|
:ok
|
||||||
|
|
||||||
{:error, reason} ->
|
{:error, reason} ->
|
||||||
if permanent_failure?(reason) do
|
if transient_failure?(reason) do
|
||||||
|
Logger.error("HRRR transient error for #{lat},#{lon} @ #{valid_time_str}: #{inspect(reason)}")
|
||||||
|
{:error, reason}
|
||||||
|
else
|
||||||
Logger.warning("HRRR permanent failure for #{lat},#{lon} @ #{valid_time_str}: #{inspect(reason)}")
|
Logger.warning("HRRR permanent failure for #{lat},#{lon} @ #{valid_time_str}: #{inspect(reason)}")
|
||||||
{:cancel, reason}
|
{:cancel, reason}
|
||||||
else
|
|
||||||
Logger.error("HRRR fetch error for #{lat},#{lon} @ #{valid_time_str}: #{inspect(reason)}")
|
|
||||||
{:error, reason}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp permanent_failure?("HRRR idx HTTP 404"), do: true
|
# Only retry on transient network/server errors — everything else is permanent
|
||||||
defp permanent_failure?("HRRR grib HTTP 404"), do: true
|
defp transient_failure?(%{__exception__: true}), do: true
|
||||||
defp permanent_failure?("HRRR range request not supported"), do: true
|
defp transient_failure?("HRRR idx HTTP " <> status), do: server_error?(status)
|
||||||
defp permanent_failure?(:outside_grid), do: true
|
defp transient_failure?("HRRR grib HTTP " <> status), do: server_error?(status)
|
||||||
defp permanent_failure?("malformed section"), do: true
|
defp transient_failure?(_), do: false
|
||||||
defp permanent_failure?("missing sections: " <> _), do: true
|
|
||||||
defp permanent_failure?("not a GRIB2 message"), do: true
|
defp server_error?(status) do
|
||||||
defp permanent_failure?("unsupported GRIB edition " <> _), do: true
|
case Integer.parse(status) do
|
||||||
defp permanent_failure?("GRIB2 extraction failed: " <> _), do: true
|
{code, _} when code in [429, 500, 502, 503, 504] -> true
|
||||||
defp permanent_failure?("GRIB2 complex packing decode failed: " <> _), do: true
|
_ -> false
|
||||||
defp permanent_failure?(_), do: false
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp maybe_add_derived_params(attrs, nil), do: attrs
|
defp maybe_add_derived_params(attrs, nil), do: attrs
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue