Leaked instances of DuckDBPyType since 2.0
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
Start by running the pure Python reproducer with DuckDB 2.0, then compare it with the torch and typing.overload scenario. The issue points to DuckDBPyConnection annotations being retained during shutdown and reports leaks in nanobind bindings, but names no source file or test. Done means the reproducer exits without nanobind leak reports.
索引モデルが issue の本文から書いたものです。
説明
What happens?
Since 2.0, our runtimes end with what looks like leaked instances of DuckDBPyType.
nanobind: leaked 27 instances!
- leaked instance 0x64c7922f1c50 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922f1c10 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e85b0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e86d0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e85d0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8630 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8610 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8730 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922f1c70 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e87d0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8670 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8690 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8810 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922f1c30 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8590 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8770 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e87b0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e85f0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e86f0 of type "_duckdb._sqltypes.DuckDBPyType"
- leaked instance 0x64c7922e8710 of type "_duckdb._sqltypes.DuckDBPyType"
- ... skipped remainder
nanobind: leaked 6 types!
- leaked type "_duckdb._sqltypes.DuckDBPyType"
- leaked type "_duckdb.DuckDBPyConnection"
- leaked type "FunctionNullHandling"
- leaked type "PythonUDFType"
- leaked type "ExplainType"
- leaked type "PythonExceptionHandling"
nanobind: leaked 84 functions!
- leaked function "extract_statements"
- leaked function "__exit__"
- leaked function "fetchdf"
- leaked function "_statement_count"
- leaked function "install_extension"
- leaked function "array_type"
- leaked function ""
- leaked function "interrupt"
- leaked function "_own_sources"
- leaked function "torch"
- ... skipped remainder
nanobind: this is likely caused by a reference counting issue in the binding code.
See https://nanobind.readthedocs.io/en/latest/refleaks.html
To Reproduce
It seems this is due to interaction with other libs, torch in particular, and typing.overload.
This is a pure Python reproducer
import ctypes
import duckdb
ctypes.pythonapi.Py_IncRef(ctypes.py_object(duckdb.DuckDBPyConnection))
Here is a more realistic scenario.
$ cat lib.py
import typing
import duckdb
class Wrapper:
def __init__(self, con: duckdb.DuckDBPyConnection): ...
# typing.overload stores the function in typing._overload_registry, which is not
# released at shutdown once torch has been imported.
@typing.overload
def f(x: int) -> None: ...
$ cat repro_torch.py
"""duckdb + torch + a module with a typing.overload and a DuckDBPyConnection annotation."""
import torch # noqa: F401
import lib # noqa: F401
Running python repro_torch.py provides the same error message.
OS:
Ubuntu 26
DuckDB Version:
2.0
DuckDB Client:
Python
Hardware:
No response
Full Name:
Jakob Stigenberg
Affiliation:
Qubos Systematic
Did you include all relevant configuration (e.g., CPU architecture, Linux distribution) to reproduce the issue?
- Yes, I have
Did you include all code required to reproduce the issue?
- Yes, I have
Did you include all relevant data sets for reproducing the issue?
Not applicable - the reproduction does not require a data set
- 主要言語
- Python
- スター
- 203
- フォーク
- 124
- 平均マージ
- 13時間 36分
- マージ済み PR(30日)
- 61
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
duckdb/duckdb-python のほかの issue
-
`read_json` accepts a list of paths at runtime but the type stub only allows a single path.対応中かも @aleks-drozy が 95 日前に担当しました。 オープンneeds triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
duckdb/duckdb-python#576 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Missing ROW_GROUPS_PER_FILE argument in write_parquet function対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンneeds triage
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
duckdb/duckdb-python#386 ·
メンテナーはふだん 1 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 66/100
duckdb/duckdb-python#737 ·
メンテナーはふだん 1 日以内に返信
-
needs triage
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
duckdb/duckdb-python#733 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
nanobind: leaked ... when a DuckDB type is referenced in overload signature and numpy is importedオープンneeds triage
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
duckdb/duckdb-python#732 · コメント 5 件 · リアクション 3 件 ·
メンテナーはふだん 1 日以内に返信
duckdb/duckdb-python の issue をすべて見る
似ている issue
-
community enhancement good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
Hochfrequenz/sapgui.mcp#1039 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
didi/helixharness#18 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
dataforgoodfr/democracy-watch#46 · リアクション 1 件 ·