googleapis / googleapis/google-cloud-python

`transfer_manager`: `upload_many` and `upload_many_from_filenames` can hang indefinitely even with deadline

未关闭
#17,959 0 条评论 0 个 reaction 已指派 1 人 已被 @rajeevpodar 认领 在 GitHub 查看
api: storage 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

**Context**
The docs for `transfer_manager.upload_many` and `transfer_manager.upload_many_from_filenames` say a deadline argument can be passed, which is supposed to kill the workers and raise a TimeoutError, but this doesn't seem to happen. Instead, we're seeing that it can actually hang indefinitely.

**Expected Behavior:**
A timeout error is raised after the deadline has passed.

**Actual Behavior:**
The method hangs indefinitely.

### API client name and version

google-cloud-storage v3.13.0

### Reproduction steps: code

This repro uses a patch to simulate a stuck upload. In reality, we see stuck uploads on the GCP server-side, but it's non-deterministic.

```python
import io, time
from unittest.mock import patch
from google.cloud.storage import Blob, transfer_manager

with patch.object(Blob, "_prep_and_do_upload", side_effect=lambda *a, **k: time.sleep(10)): # Simulate a stuck upload
start = time.monotonic()
transfer_manager.upload_many(
[(io.BytesIO(), Blob("x", bucket=None))],
worker_type=transfer_manager.THREAD,
deadline=.1,
)
print(f"Upload succeded in {time.monotonic() - start:.3f}s. A TimeoutError was expected.")
```

### Reproduction steps: actual results

```
❯ uv run repro.py
Upload succeded in 10.001s. A TimeoutError was expected.
```

### OS & version + platform

Ubuntu 26.04 LTS

### Python environment

Python 3.14.4

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

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