Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[java-bigquery] getQueryResults does not retry a SocketTimeoutException (read timeout)

Ouverte Adaptée aux débutants
#14,579 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
gcp, google-cloud, java
Domaine
api

Piste de recherche

Commencez à BigQueryBaseService.BIGQUERY_EXCEPTION_HANDLER dans google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryBaseService.java, où retryOn liste ConnectException, UnknownHostException et SocketException ; SocketTimeoutException est absente. Vérifiez si le handler déballe les causes imbriquées avant la mise en correspondance, puis ajoutez le cas de read-timeout (ou son équivalent) avec les mêmes paramètres de retry. Terminé ressemble à un test unitaire dans le module bigquery qui affirme qu'un appel getQueryResults échouant avec une SocketTimeoutException est réessayé plutôt que levé lors de la première tentative ; le défaut d'interruption gax est suivi séparément dans #12860 / PR #14578.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Issue Details

BigQueryBaseService.BIGQUERY_EXCEPTION_HANDLER retries ConnectException, UnknownHostException and SocketException, but not SocketTimeoutException. So when one getQueryResults call inside Job.waitFor takes longer than the HTTP read timeout, the query fails at once with BigQueryException: Read timed out, after one attempt. A read timeout on this idempotent poll is as transient as a SocketException, and the job itself is still running.

Job.waitFor calls getQueryResults with no timeoutMs, so BigQuery holds each call for up to 10 s. java-bigquery sets the HTTP read timeout to 60,000 ms by default. A poll that gets no answer within 60 s, most likely a connection that died, fails the whole query, although the job is still running and the next poll would succeed. A longer read timeout does not help a dead connection. Only a retry does.

Edited 2026-10-04: an earlier version said the default read timeout is 20,000 ms. It is 60,000 ms.

Today a second defect hides this one: gax turns the SocketTimeoutException into a thread interrupt, so the caller sees BigQueryException: java.lang.InterruptedException instead (#12860, PR #14578). With that gax fix applied, the same stall fails with Read timed out after one attempt. That remaining failure is this issue.

Expected: getQueryResults (and other idempotent reads) retries a SocketTimeoutException under the same retry settings as a SocketException.

Environment

  • OS Type and Version: macOS 26.6.2 (arm64)
  • Java Version and JDK Vendor: OpenJDK 25 (2025-09-16 LTS)
  • Deployment: a JVM server that calls BigQuery through com.google.cloud:google-cloud-bigquery, with Application Default Credentials.

Dependencies

  • Client library: com.google.cloud:google-cloud-bigquery 2.54.1 (not using libraries-bom). The handler is the same on main today.
  • Gax: gax and gax-httpjson 2.84.0
  • Auth: google-auth-library-oauth2-http 1.37.1 to 1.51.0
  • Google-Http-Java-Client: 1.47.1 to 2.2.0

Reproducer

  1. Build a BigQuery client with a short HTTP read timeout, for example 2 s, through HttpTransportOptions.
  2. Run a query, and call job.waitFor() while BigQuery holds getQueryResults (any query that takes more than 2 s).
  3. With a gax that has the #14578 fix, waitFor throws BigQueryException: Read timed out (cause java.net.SocketTimeoutException) after one attempt. With current gax, it throws BigQueryException: java.lang.InterruptedException.

The same wait with the default timeout succeeds. The handler in question is in google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryBaseService.java:

.abortOn(RuntimeException.class)
.retryOn(java.net.ConnectException.class)
.retryOn(java.net.UnknownHostException.class)
.retryOn(java.net.SocketException.class)
Langage dominant
Java
Étoiles
2.1k
Forks
1.2k
Merge moyen
2 j 10 h
PR mergées (30 j)
147

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de googleapis/google-cloud-java

Toutes les issues de googleapis/google-cloud-java

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.