Async Thin: call_timeout returns DPY-4024 before RESET completes
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 1-2 天
- 新手友好度
- 45/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- python
调研方向
Start by reading BaseAsyncProtocol._process_timeout_helper() and trace how _break_external() and _receive_packet(message) handle DATA and RESET marker packets. Compare that flow with the packet sequence described in the issue and inspect related async protocol tests for timeout recovery. Done means a timed out call completes BREAK/RESET recovery before raising DPY-4024, and a subsequent statement does not fail with DPY-4011.
由索引模型根据 Issue 内容生成。
描述
- What versions are you using?
- Oracle Database Free 23.5.0.24.7 (local testing); Observed in production against Oracle Database 19c.
- python-oracledb 4.0.2 and 26.0.1, Thin mode. The same timeout-helper code is present on main (
c92c8420). - Python 3.13, asyncio, on macOS arm64 and Linux arm64.
- Production also uses uvloop and SQLAlchemy 2.0 (
oracle+oracledb_async), but the reproduction below uses native python-oracledb only. - Oracle Client: not applicable (Thin mode).
- Is it an error or a hang or a crash?
An error after a timeout, followed by a delayed failure when reusing a connection that still reports healthy.
- What error(s) or behavior you are seeing?
With call_timeout = 500, a statement that completes between approximately 500 and 1000 ms can raise DPY-4024 while connection.is_healthy() returns True. The next statement on that connection waits approximately 1 second and fails with:
DPY-4011: the database or network closed the connection
socket timed out while recovering from previous socket timeout
Representative output from the original reproduction on 26.0.1, Linux arm64:
sleep=0.6: call 1 DPY-4024, is_healthy=True
call 2 DPY-4011 after 1.01s
sleep=0.7: call 1 DPY-4024, is_healthy=True
call 2 DPY-4011 after 1.01s
sleep=0.8: call 1 DPY-4024, is_healthy=True
call 2 DPY-4011 after 1.00s
This is timing-dependent: some runs recover successfully or return ORA-01013 on the next call. The same behavior was reproduced on 4.0.2.
Source inspection and packet traces point to incomplete BREAK/RESET recovery in BaseAsyncProtocol._process_timeout_helper():
self._break_external()
await self._receive_packet(message)
self._break_in_progress = False
errors._raise_err(errors.ERR_CALL_TIMEOUT_EXCEEDED, timeout=timeout)
If the first packet received is the completed statement's DATA response rather than a MARKER, the helper raises DPY-4024 without completing RESET. The trace shows the server's RESET marker arriving without a client RESET response. The next call clears buffered packets and sends a request while the server is still waiting for RESET.
- Does your application call init_oracle_client()?
No. Thin mode.
- Include a runnable Python script that shows the problem.
import asyncio
import os
import platform
import sys
import time
import oracledb
PARAMS = dict(
user=os.environ["ORACLE_USER"],
password=os.environ["ORACLE_PASSWORD"],
dsn=os.environ["ORACLE_DSN"],
)
async def main():
for sleep_s in (0.55, 0.6, 0.7, 0.8, 0.9):
async with oracledb.connect_async(**PARAMS) as conn:
print("connection.version:", conn.version)
conn.call_timeout = 500
with conn.cursor() as cur:
try:
await cur.execute(
"begin dbms_session.sleep(:s); end;", [sleep_s]
)
except oracledb.DatabaseError as exc:
print(
f" sleep={sleep_s}: call 1 {exc.args[0].full_code}, "
f"is_healthy={conn.is_healthy()}"
)
start = time.monotonic()
try:
await cur.execute("select 1 from dual")
print(" call 2 ok")
except oracledb.DatabaseError as exc:
print(
f" call 2 {exc.args[0].full_code} "
f"after {time.monotonic() - start:.2f}s"
)
asyncio.run(main())
- 主要语言
- Python
- 星标
- 455
- 派生
- 119
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
oracle/python-oracledb 的其他 Issue
-
难度 3/5 1-2 天 新手友好度 75/100
oracle/python-oracledb#626 ·
-
bug
难度 4/5 3-5 天 新手友好度 48/100
oracle/python-oracledb#625 ·
-
难度 4/5 3-5 天 新手友好度 48/100
oracle/python-oracledb#623 ·
-
难度 4/5 3-5 天 新手友好度 55/100
oracle/python-oracledb#622 ·
-
bug
难度 4/5 3-5 天 新手友好度 32/100
oracle/python-oracledb#621 · 3 条评论 ·
查看 oracle/python-oracledb 的全部 Issue
相似的 Issue
-
component:benchmark
难度 2/5 1-3 小时 新手友好度 76/100
agentic-os-org/ANOLISA#9177 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 88/100
distrochooser/distrochooser#520 ·
维护者通常 2 天内回复
-
Status: Needs confirmation Status: Needs triage
难度 2/5 1-3 小时 新手友好度 64/100
维护者通常 1 天内回复
-
[BUG] Published Docker images lack the redis extra: HEADROOM_COMPRESS_SESSION_STORE stops startup可能已有人在做 @AlessandroSpallina 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 76/100
headroomlabs-ai/headroom#4513 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 65/100
codespell-project/codespell#4060 ·
维护者通常 1 天内回复