Skip to content

fix: prevent SQLite connection leaks during setup - #517

Merged
liujuanjuan1984 merged 3 commits into
mainfrom
investigate/516-aiosqlite-thread-warning
Aug 24, 2026
Merged

fix: prevent SQLite connection leaks during setup#517
liujuanjuan1984 merged 3 commits into
mainfrom
investigate/516-aiosqlite-thread-warning

Conversation

@liujuanjuan1984

@liujuanjuan1984 liujuanjuan1984 commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

背景

Python 3.14 测试中偶发出现 aiosqlite worker thread 在 event loop 关闭后回调的警告。调查确认它并非无害时序噪声,而是连接初始化失败或测试清理不完整留下的真实连接资源。

Closes #516

变更

  • 在 SQLAlchemy do_connect 阶段执行 SQLite 文件安全预检,在物理连接建立前拒绝 symlink 等不安全路径。
  • 保留连接建立后的安全复检,避免迁移检查时机削弱原有纵深防御;复检或 PRAGMA 配置失败时显式关闭 DBAPI 连接,并保留原始异常。
  • 修正三个共享 engine ownership 测试:继续验证 runtime 不释放外部 engine,同时由测试在 finally 中调用真实 dispose() 完成清理。
  • 增加回归测试,验证安全预检失败不会额外创建 aiosqlite 连接,并覆盖 PRAGMA 失败、连接后安全复检失败及关闭异常不覆盖原始异常等路径。
  • 将 pytest 未处理线程异常和析构异常升级为测试错误;对 aiosqlite 未关闭连接的 ResourceWarning 强制展示,但不直接升级为异常,以免中断其析构器中的 worker stop()

独立审查与查改

已完成两轮独立 PR diff 审查:

  1. 修正 do_connect 参数类型注解及 SQLAlchemy 生命周期注释,并补充异步资源泄漏 warning gate。
  2. 发现 ResourceWarning=error 会中断 aiosqlite 析构清理,调整为安全且可见的告警策略;同时恢复连接后的安全复检,保留纵深防御。

两轮发现均已查改、重新验证并推送,当前没有遗留的已知问题。

验证

  • 数据库及共享 engine 生命周期定向测试:60 passed
  • bash ./scripts/doctor.sh:821 passed,覆盖率 93.35%,依赖兼容、pre-commit、mypy、构建及 wheel smoke test 全部通过
  • 全量测试剩余 4 条为既有 EventQueue deprecation warning,与本 PR 无关

相关提交

  • 1867994 fix: prevent SQLite connection leaks during setup
  • 3f1c591 test: fail on async resource leak warnings
  • 877a4c1 fix: preserve SQLite hardening during connection setup

风险

  • 正常 SQLite 连接路径仅增加一次物理连接前的文件安全预检;PRAGMA 与连接成功语义不变。
  • 显式关闭仅在连接初始化异常路径触发。
  • 没有添加 warning ignore,也没有修改用户可见配置或协议,因此无需新增用户文档。

@liujuanjuan1984
liujuanjuan1984 marked this pull request as ready for review August 24, 2026 03:54
@liujuanjuan1984
liujuanjuan1984 merged commit f9647d1 into main Aug 24, 2026
3 checks passed
@liujuanjuan1984
liujuanjuan1984 deleted the investigate/516-aiosqlite-thread-warning branch August 24, 2026 03:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

跟踪 Python 3.14 测试中偶发的 aiosqlite event-loop 关闭警告

1 participant