googleapis / googleapis/google-cloud-python

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

未关闭
#17,903 0 条评论 0 个 reaction 已指派 1 人 已被 @steotia 认领 在 GitHub 查看
api: spanner priority: p2 type: bug
主要语言
Python
星标
5.4k
派生
1.8k
平均合并
3 天 4 小时
30 天内合并 PR
122

描述

### 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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。