You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Build a BigQuery client with a short HTTP read timeout, for example 2 s, through HttpTransportOptions.
Run a query, and call job.waitFor() while BigQuery holds getQueryResults (any query that takes more than 2 s).
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:
Issue Details
BigQueryBaseService.BIGQUERY_EXCEPTION_HANDLERretriesConnectException,UnknownHostExceptionandSocketException, but notSocketTimeoutException. So when onegetQueryResultscall insideJob.waitFortakes longer than the HTTP read timeout, the query fails at once withBigQueryException: Read timed out, after one attempt. A read timeout on this idempotent poll is as transient as aSocketException, and the job itself is still running.Job.waitForcallsgetQueryResultswith notimeoutMs, 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
SocketTimeoutExceptioninto a thread interrupt, so the caller seesBigQueryException: java.lang.InterruptedExceptioninstead (#12860, PR #14578). With that gax fix applied, the same stall fails withRead timed outafter one attempt. That remaining failure is this issue.Expected:
getQueryResults(and other idempotent reads) retries aSocketTimeoutExceptionunder the same retry settings as aSocketException.Environment
com.google.cloud:google-cloud-bigquery, with Application Default Credentials.Dependencies
com.google.cloud:google-cloud-bigquery2.54.1 (not using libraries-bom). The handler is the same onmaintoday.gaxandgax-httpjson2.84.0google-auth-library-oauth2-http1.37.1 to 1.51.0Reproducer
BigQueryclient with a short HTTP read timeout, for example 2 s, throughHttpTransportOptions.job.waitFor()while BigQuery holdsgetQueryResults(any query that takes more than 2 s).waitForthrowsBigQueryException: Read timed out(causejava.net.SocketTimeoutException) after one attempt. With current gax, it throwsBigQueryException: 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: