nanobind: leaked ... when a DuckDB type is referenced in overload signature and numpy is imported
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 25/100
Línea de trabajo
Start with the reproduction script in the issue: it needs only typing.overload referencing duckdb.DuckDBPyConnection plus import numpy, and the leak appears at interpreter exit. Run it with uv run --script to confirm the nanobind warnings. The cause is a reference-counting problem in the nanobind binding code, so the work is tracing which type or function objects are not released, which needs familiarity with nanobind. Done means the script exits without the leak warnings.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens?
When the interpreter exits, duckdb 2.0.0 prints nanobind leak warnings if both of these are true:
- a DuckDB type (e.g. DuckDBPyConnection) is referenced from a typing.overload signature, which typing keeps in its module-level overload registry until shutdown
- numpy is imported (torch 2.6.0 triggers it the same way)
nanobind: leaked 27 instances!
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 "fetchone"
- leaked function "fetch_df"
- leaked function "__exit__"
- leaked function "_result_as_arrow"
- leaked function ""
- leaked function "abort"
- leaked function "append"
- leaked function "interrupt"
- leaked function "dtype"
- leaked function "_register_values"
- ... 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
with duckdb_nanobind_leak.py as follows
# /// script
# requires-python = ">=3.13"
# dependencies = ["duckdb==2.0.0", "numpy==2.5.2"]
# ///
"""duckdb 2.0.0 prints "nanobind: leaked ..." at interpreter exit.
Run: uv run --script duckdb_nanobind_leak.py
Triggered when a DuckDB type is referenced from a `typing.overload` signature (typing keeps overloads in a
module-level registry until shutdown) and numpy is imported. Without the overload, or without numpy, exit is clean.
torch (2.6.0) triggers it the same way as numpy.
"""
from typing import overload
import duckdb
import numpy
@overload
def connect(database: str) -> duckdb.DuckDBPyConnection: ...
@overload
def connect(database: None) -> None: ...
def connect(database):
return None if database is None else duckdb.connect(database)
run uv run --script duckdb_nanobind_leak.py
OS:
x86_64
DuckDB Version:
2.0.0
DuckDB Client:
Python
Hardware:
No response
Full Name:
Bartosz Marcinkowski
Affiliation:
MIM Fertility
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
- Lenguaje dominante
- Python
- Estrellas
- 203
- Forks
- 124
- Merge medio
- 13 h 36 min
- PR fusionados (30 d)
- 61
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de duckdb/duckdb-python
-
`read_json` accepts a list of paths at runtime but the type stub only allows a single path.Posiblemente ocupada @aleks-drozy la tomó hace 95 días. Abiertoneeds triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
duckdb/duckdb-python#576 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Missing ROW_GROUPS_PER_FILE argument in write_parquet functionPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertoneeds triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
duckdb/duckdb-python#386 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 66/100
duckdb/duckdb-python#737 ·
Los mantenedores suelen responder en 1 día
-
needs triage
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
duckdb/duckdb-python#736 ·
Los mantenedores suelen responder en 1 día
-
needs triage
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
duckdb/duckdb-python#733 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de duckdb/duckdb-python
Issues similares
-
area/test type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Clodmony/starship-coop#70 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
punitarani/fli#270 ·
-
🐛 Bug 🔔 Pending processing
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
jumpserver/jumpserver#17980 ·
Los mantenedores suelen responder en 1 día
-
community enhancement good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día
-
Claiming namespace `prodmetrics`Abiertonamespace
Dificultad 2/5 1-3 horas Aptitud para principiantes 60/100
EclipseFdn/open-vsx.org#15341 ·
Los mantenedores suelen responder en 1 día