Skip to content

Commit ae97991

Browse files
committed
Add retries to HTTP timeouts in Meadow.Search.HTTP and Meadow.Utils.AWS
1 parent 868f5cc commit ae97991

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

Diff for: app/lib/meadow/search/http.ex

+11-5
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ defmodule Meadow.Search.HTTP do
5858
atoms: [:retry],
5959
rescue_only: [] do
6060
case ElastixHTTP.request(method, url, body, headers, options) do
61-
{:ok, %{status_code: status} = response} when status in 200..399 ->
62-
{:ok, response}
61+
{:ok, %{status_code: status} = response} when status in [429, 503, 504] ->
62+
{:retry, response}
6363

64-
{:ok, %{status_code: 404} = response} ->
64+
{:ok, response} ->
6565
{:ok, response}
6666

67-
{:ok, %{status_code: 429} = response} ->
68-
{:retry, response}
67+
{:error, %HTTPoison.Error{reason: :timeout} = error} ->
68+
{:retry, error}
6969

7070
{:error, error} ->
7171
{:error, error}
@@ -80,6 +80,12 @@ defmodule Meadow.Search.HTTP do
8080
result ->
8181
result |> maybe_report(%{method: method, url: url, body: body})
8282
else
83+
{:retry, %HTTPoison.Response{} = response} ->
84+
response |> maybe_report(%{method: method, url: url, body: body})
85+
86+
{:retry, reason} ->
87+
{:error, reason} |> maybe_report(%{method: method, url: url, body: body})
88+
8389
error ->
8490
error |> maybe_report(%{method: method, url: url, body: body})
8591
end

Diff for: app/lib/meadow/utils/aws.ex

+26-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ defmodule Meadow.Utils.AWS do
1010
alias Meadow.Utils.AWS.MultipartCopy
1111
alias Meadow.Utils.Pairtree
1212

13+
use Retry
14+
1315
import SweetXml, only: [sigil_x: 2]
1416

1517
require Logger
@@ -18,14 +20,36 @@ defmodule Meadow.Utils.AWS do
1820
Drop-in replacement for ExAws.request/2 that reports errors to Honeybadger
1921
"""
2022
def request(op, config_overrides \\ []) do
21-
ExAws.request(op, config_overrides) |> handle_response()
23+
retry with: exponential_backoff() |> randomize() |> cap(1_000) |> Stream.take(10),
24+
atoms: [:retry],
25+
rescue_only: [] do
26+
case ExAws.request(op, config_overrides) |> handle_response() do
27+
:timeout ->
28+
{:retry, :timeout}
29+
30+
{:error, {:http_error, status, _}} = response when status in [429, 503, 504] ->
31+
{:retry, response}
32+
33+
{:ok, result} ->
34+
{:ok, result}
35+
36+
error ->
37+
error
38+
end
39+
after
40+
{:ok, result} -> {:ok, result}
41+
{:error, error} -> {:error, error}
42+
else
43+
{:retry, error} -> error
44+
error -> error
45+
end
2246
end
2347

2448
@doc """
2549
Drop-in replacement for ExAws.request!/2 that reports errors to Honeybadger
2650
"""
2751
def request!(op, config_overrides \\ []) do
28-
case ExAws.request(op, config_overrides) |> handle_response() do
52+
case request(op, config_overrides) do
2953
{:ok, result} ->
3054
result
3155

0 commit comments

Comments
 (0)