Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

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

Ouverte
#17,903 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@steotia y travaille déjà.

Depuis le 31/7/2026.

  • #17905 par @abhi-0203 — fermée sans fusion

Évaluation

Cette issue n'a pas encore été évaluée.

Description

api: spanner priority: p2 type: bug
Determine this is the right repository
  • 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.

Langage dominant
Python
Étoiles
5.4k
Forks
1.8k
Merge moyen
2 j 13 h
PR mergées (30 j)
159

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de googleapis/google-cloud-python

Toutes les issues de googleapis/google-cloud-python

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.