googleapis / googleapis/google-cloud-python

[spanner] `run_in_transaction` raises uncaught `IndexError` when `Aborted.errors` is empty

Đang mở
#17,903 0 bình luận 0 reaction 1 người được giao Được @steotia nhận Xem trên GitHub
api: spanner priority: p2 type: bug
Ngôn ngữ chính
Python
Star
5.4k
Fork
1.8k
Merge trung bình
3 ngày 4 giờ
Pull request đã merge (30 ngày)
122

Mô tả

### Determine this is the right repository

- [x] I determined this is the correct repository in which to report this bug.

### Summary of the issue

When `google.api_core.exceptions.Aborted` is raised inside `run_in_transaction` with an empty `errors` attribute (e.g., manually instantiated `Aborted("...")`), `run_in_transaction` fails with an uncaught `IndexError: list index out of range` because it directly accesses `exc.errors[0]` without checking if `exc.errors` is empty.

While instantiating `Aborted` manually without `errors` may not be the standard path, the SDK should defensively handle empty `errors` (e.g., falling back to `default_retry_delay`) instead of crashing with an `IndexError`.

### API client name and version

google-cloud-spanner==3.69.0

### Reproduction steps: code

from google.api_core.exceptions import Aborted
from google.cloud import spanner

spanner_client = spanner.Client()
instance = spanner_client.instance("your-instance-id")
database = instance.database("your-database-id")

def callback(transaction):
# Raising Aborted without providing the `errors` payload
raise Aborted("VersionMismatch: CAS failed")

database.run_in_transaction(callback)

### Reproduction steps: supporting files

_No response_

### Reproduction steps: actual results

IndexError: list index out of range
(Occurs inside `delay_seconds = _get_retry_delay(exc.errors[0], ...)`)

### Reproduction steps: expected results

The SDK handles empty `exc.errors` gracefully (e.g., uses `default_retry_delay`) and executes the transaction retry loop as intended without raising an `IndexError`.

### OS & version + platform

Windows 11

### Python environment

Python 3.14.6

### Python dependencies

Package Version
---------------------------------- ---------
certifi 2026.7.22
cffi 2.1.0
charset-normalizer 3.4.9
cryptography 49.0.0
google-api-core 2.33.0
google-auth 2.56.2
google-cloud-core 2.6.0
google-cloud-monitoring 2.31.0
google-cloud-spanner 3.69.0
google-cloud-storage 3.13.0
google-crc32c 1.8.0
google-resumable-media 2.10.0
googleapis-common-protos 1.75.0
grpc-google-iam-v1 0.14.4
grpc-interceptor 0.15.4
grpcio 1.82.1
grpcio-status 1.82.1
idna 3.18
mmh3 5.2.1
opentelemetry-api 1.44.0
opentelemetry-resourcedetector-gcp 1.12.0a0
opentelemetry-sdk 1.44.0
opentelemetry-semantic-conventions 0.65b0
pip 26.1.2
proto-plus 1.28.2
protobuf 7.35.1
pyasn1 0.6.4
pyasn1_modules 0.4.2
pycparser 3.0
requests 2.34.2
sqlparse 0.5.5
typing_extensions 4.16.0
urllib3 2.7.0

### Additional context

Defensive check like `if exc.errors:` before accessing `exc.errors[0]` would prevent `IndexError` and make error handling in `run_in_transaction` much more robust.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

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

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.