run_pipeline() never completes when the server side closes the connection during the pipeline; call_timeout and asyncio.wait_for don't end it
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- postgresql, python
- Lĩnh vực
- backend-api-design, database
Hướng nghiên cứu
Start by tracing the async run_pipeline() implementation and how it handles socket closure, call timeouts, and task cancellation; the report gives a Python 3.12 Thin mode reproducer using connect_async. Reproduce with a TCP proxy that closes the connection after login, then compare the result with a direct database connection. Done when the pipeline raises on connection closure and timeout or cancellation ends the wait.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Versions
- python-oracledb 4.0.1, Thin mode (
connect_async) - Python 3.12.3, Linux x86_64
- Oracle Database 23ai Free (container image), reached through a TCP proxy
What happens
The connection goes through a TCP proxy that inspects SQL. When the proxy refuses the request carrying the pipeline, it closes both TCP connections without sending a reply. await conn.run_pipeline(pipeline) then never returns or raises: there is no error and no result.
Ten seconds in, the client process holds no TCP socket to the proxy, only what looks like asyncio's internal socket pair. So python-oracledb has seen the close and dropped its socket, but the pending pipeline is never completed.
What we tried (each in its own process, killed by an outside timeout at 150 s):
| Setting | Result through the proxy | Direct to the database |
|---|---|---|
| none | no answer, killed at 150 s | 6 results, 0.2 s |
conn.call_timeout = 5000 |
no answer, 150 s | ok |
expire_time=1 |
no answer, 150 s | ok |
asyncio.wait_for(conn.run_pipeline(p), 10) |
no answer, 150 s (the cancellation hangs too) | ok |
call_timeout + expire_time |
no answer, 150 s | ok |
Expected
When the connection is closed while a pipeline is waiting for replies, run_pipeline() should raise (for example DPY-4011, "the database or network closed the connection"), as other calls on a closed connection do. call_timeout and task cancellation should also end the wait.
Repro sketch
- Put any TCP proxy between the client and a 23ai database that forwards the login, then closes both sides when it receives the first request after login.
- Run:
import asyncio, oracledb async def main(): conn = await oracledb.connect_async(user=..., password=..., dsn="proxyhost:port/FREEPDB1") p = oracledb.create_pipeline() for _ in range(6): p.add_fetchone("select 1 from dual") print(await conn.run_pipeline(p)) # never returns asyncio.run(main())
We can run a debug build or extra logging if that helps.
- Ngôn ngữ chính
- Python
- Star
- 457
- Fork
- 120
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của oracle/python-oracledb
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 15/100
oracle/python-oracledb#629 ·
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 22/100
oracle/python-oracledb#628 ·
-
Thin mode: ORA-01483 for string binds of 2731-8191 bytes on a database with the UTF8 character setĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
oracle/python-oracledb#627 · 1 bình luận · 1 reaction ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 75/100
oracle/python-oracledb#626 ·
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
oracle/python-oracledb#625 ·
Tất cả issue của oracle/python-oracledb
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
fritzprix/libr-agent#2612 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-triage presubmit-gate
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
gke-labs/kube-agents#5001 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
simonw/sqlite-utils#928 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
colorado
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
freelawproject/juriscraper#2405 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
cline/mcp-marketplace#3576 ·