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

[Spanner] Retries of UNAVAILABLE errors when resuming a result stream not working properly

Đang mở
#9,737 0 bình luận 0 reaction 1 người được giao Xem trên GitHub

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

@Hectorhammett đang làm issue này rồi.

Từ ngày 25/9/2026.

Đánh giá

Issue này chưa được đánh giá.

Mô tả

Result::rows() can retry UNAVAILABLE errors forever, when the server keeps returning UNAVAILABLE after the first stream is interrupted. The retry limit from RetrySettings (default 3) is never applied.

This issue is a bit hard to explain but here goes...

The bit of code that needs fixing is here.
https://github.com/googleapis/google-cloud-php/blob/c891a48bd3bd3f132dd7bc3bc35ff73844743abb/Spanner/src/Result.php#L182

This block is called when a ServiceException is thrown with status UNAVAILABLE while iterating through the Generator returned from $call. I think the expected behavior here is to re-execute the $call, reconnect and resume the iterating process. At first glance it seemed like it's doing exactly that.
But when I actually run it, I noticed that when $call is actually invoked in ExponentialBackoff::execute($call, ...), it's just returning the Generator that is not started (see below).

https://github.com/googleapis/google-cloud-php/blob/c891a48bd3bd3f132dd7bc3bc35ff73844743abb/Core/src/ExponentialBackoff.php#L97

Since the code inside the $call is not executed, the unstarted generator gets incorrectly assigned and the loop is continued. When $this->generator->current() is called again (Result.php:L138), and if another ServiceException (with status UNAVAILABLE) is thrown again, the whole process is repeated.

I think the expected behavior here is to have the generator start when $backoff->execute(...) is run so that backoff can actually be applied.

Result::createGenerator(...) run with a similar logic, but there the generator is started inside the callback so it runs correctly like so...

https://github.com/googleapis/google-cloud-php/blob/c891a48bd3bd3f132dd7bc3bc35ff73844743abb/Spanner/src/Result.php#L480-L483

So I think this can be fixed by changing...

$this->generator = $backoff->execute($call, [$this->resumeToken, $this->transaction()]);

to

$this->generator = $backoff->execute(function () use ($call) {
    $generator = $call();
    $generator->valid();
    return $generator;
});
Environment details
  • OS: Alpine Linux
  • PHP version: 8.5.10
  • Package name and version: google/cloud-spanner v2.11.0
Steps to reproduce
  1. Run a large query using Database::execute(...)
  2. Call rows()
  3. Start iterating.
  4. Network disconnects and throw UNAVAILABLE midway.
Ngôn ngữ chính
PHP
Star
1.2k
Fork
464
Merge trung bình
2 ngày 2 giờ
Pull request đã merge (30 ngày)
84

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-php

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

Issue tương tự

Thêm issue về PHP

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.