Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

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

Đang mở Phù hợp với người mới
#14,579 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
72/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
gcp, google-cloud, java
Lĩnh vực
api

Hướng nghiên cứu

Bắt đầu tại BigQueryBaseService.BIGQUERY_EXCEPTION_HANDLER trong google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryBaseService.java, nơi retryOn liệt kê ConnectException, UnknownHostException và SocketException; SocketTimeoutException vắng mặt. Kiểm tra xem handler có mở gói các nguyên nhân lồng nhau trước khi khớp không, sau đó thêm trường hợp read-timeout (hoặc tương đương của nó) với cùng cài đặt retry. Hoàn thành trông giống như một unit test trong mô-đun bigquery khẳng định rằng một lệnh gọi getQueryResults thất bại với SocketTimeoutException được thử lại thay vì bị ném ở lần thử đầu tiên; lỗi interrupt của gax được theo dõi riêng trong #12860 / PR #14578.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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)
Ngôn ngữ chính
Java
Star
2.1k
Fork
1.2k
Merge trung bình
2 ngày 10 giờ
Pull request đã merge (30 ngày)
147

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của googleapis/google-cloud-java

Tất cả issue của googleapis/google-cloud-java

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.