Negative or huge Retry-After makes the retry sleep throw IllegalArgumentException

Offen Anfängerfreundlich
#239 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 3 Tagen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
72/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
java
Bereich
backend

Rechercherichtung

Beginne mit getRetryAfterSecondsOrNull in httpclient/src/main/java/com/backblaze/b2/client/webApiHttpClient/B2WebApiHttpClientImpl.java, danach B2DefaultRetryPolicy.java und B2Sleeper.sleepSeconds in core/src/main/java/com/backblaze/b2/client/. Reproduziere das Problem mit einem Unit-Test, der dafür sorgt, dass B2Retryer.doRetry eine wiederholbare Exception sieht, die von getRetryAfterSecondsOrNull -1 oder 2200000 zurückgibt. Fertig ist es, wenn Retry-After-Werte außerhalb des gültigen Bereichs begrenzt (geklemmt) oder abgelehnt werden und der Sleep keine IllegalArgumentException mehr wirft.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

What happens

The Retry-After header is parsed with Integer.parseInt and returned unchanged as the wait time. B2Sleeper.sleepSeconds then computes seconds * 1000 as an int, which is negative for a negative header and overflows for values above about 2.1 million seconds, and Thread.sleep throws an unchecked IllegalArgumentException. The exception escapes the retry loop, although the code comment in B2Retryer says the sleep "won't throw".

Where

httpclient/src/main/java/com/backblaze/b2/client/webApiHttpClient/B2WebApiHttpClientImpl.java:303-314 (getRetryAfterSecondsOrNull), core/src/main/java/com/backblaze/b2/client/B2DefaultRetryPolicy.java:44-52 (returns the server value unchecked), core/src/main/java/com/backblaze/b2/client/B2Sleeper.java:37-38 (seconds * 1000), called from B2Retryer.java (sleeper.sleepSeconds(waitSeconds)).

Why it matters

Impact: Availability (a retryable error turns into an unexpected runtime exception), loud. Severity: High, because it needs a Retry-After value that is negative or over about 2.1 million seconds from the server (unusual, since the HTTP spec allows only non-negative delays), and there is no workaround besides a custom retry policy.

How to check

Found by reading the code, not reproduced. Read the four places above. A unit test could make B2Retryer.doRetry see a retryable exception whose getRetryAfterSecondsOrNull() returns -1 or 2200000 and observe the exception from Thread.sleep. Clamping the value to a sane range in the retry policy or in B2Sleeper would avoid it.

Version

Seen at v6.5.0. Present on the default branch: present.

Vorherrschende Sprache
Java
Sterne
103
Forks
23
Ø Merge
5 T. 8 Std.
Gemergte PRs (30 T.)
3

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus Backblaze/b2-sdk-java

Alle Issues in Backblaze/b2-sdk-java

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.