sqlite3 Blob objects leave behind weakrefs which are never cleaned up
未关闭
还没有人认领这个 Issue。
extension-modules
topic-sqlite3
type-bug
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
The sqlite3 Blob class registers a weakref to itself on the Connection it came from. These are added to a list and never cleaned up, so if you have a long-lived connection and call .blobopen() repeatedly, you gradually accumulate ever more dead weakrefs.
It looks like the blob weakrefs were added to match a similar system for weakrefs (removed in #144378), but the code to periodically clear out dead weakrefs was missed.
import gc
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE foo(a INTEGER PRIMARY KEY, b BLOB)")
conn.execute("INSERT INTO foo VALUES(NULL, ?)", (b'abcdefpokpokpko',))
conn.commit()
# Create & destroy many Blob objects
for _ in range(10_000):
conn.blobopen("foo", "b", 1)
# Get a reference to the internal list of blob weakrefs - you may need to play with the index here
blob_list = gc.get_referents(conn)[-3]
print(len(blob_list))
CPython versions tested on:
3.14
Operating systems tested on:
Linux
Linked PRs
- gh-144435
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
报告指出,长期存在的连接上的 sqlite3 Blob 对象注册了 weakrefs,并链接到 PR gh-144435。首先检查 Blob 的 weakref 注册以及报告中提到的相关 weakref-cleanup 模式,然后运行提供的复现程序,以确认已失效的引用是否会停止累积;请与链接的 PR 协作,而不要重复工作。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python, sqlite
- 领域
- databases
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 20/100