Avatar for the Eventual-Inc user
Eventual-Inc
Daft
BlogDocsChangelog

Performance History

Latest Results

feat(sql): resolve read_iceberg io_config from table properties and default config The SQL `read_iceberg` table function ignored both the Iceberg table's embedded FileIO credentials and the context `default_io_config`: the Rust scan path used `io_config.unwrap_or_default()`, and `parse_io_config` forced an empty default that pre-empted any fallback. As a result SQL reads could not reach object storage that the equivalent Python `daft.read_iceberg(...)` call handled fine. Introduce a shared `resolve_iceberg_io_config` helper in `daft/io/iceberg/_iceberg.py` implementing the standard precedence (explicit arg > table FileIO properties > context `default_io_config`) and call it from both the Python `read_iceberg` API and the Rust SQL scan path, so the two cannot diverge again. The Rust path resolves the config inside `Python::attach`, mirroring how it already reuses `resolve_snapshot_id`. Also drop the now-unused `functions::args::parse_io_config` helper and keep the SQL arg `None` when unset so the fallback can run. Co-Authored-By: Claude <noreply@anthropic.com>
jackylee-ch:sql-read-iceberg-io-config
7 minutes ago
docs: simplify writer-thread comment per review feedback
yk/fix-progress-bar-fd-leak
9 hours ago
fix(daft-file): release GIL in PyDaftFile methods to prevent deadlock (#7257) PyDaftFile's #[pymethods] (_from_file_reference, read, seek, _supports_range_requests) and PyFileReference::__enter__ hold the Python GIL while calling block_within_async_context, which blocks via rx.recv() waiting for async S3 I/O on DAFTIO tokio threads. When concurrent scan tasks need the GIL on the same DAFTIO threads (via Python::attach), all threads deadlock — the GIL holder waits for a DAFTIO thread to execute the S3 request, while all DAFTIO threads wait for the GIL. The fix wraps the blocking I/O calls in py.detach() to release the GIL before blocking, following the existing pattern used by the exists() method in the same file. For read() and seek(), cursor ownership is temporarily moved into the detach closure via take() and restored after completion. Deadlock conditions: Ray distributed mode + multiple concurrent scan tasks per worker + S3 latency >= ~50ms + DAFTIO threads >= 8 (os.cpu_count() >= 8). The official AWS benchmark (4 vCPU, S3 <1ms) does not trigger this due to low thread count and latency. ## Changes Made Modified `src/daft-file/src/python.rs` — added `py.detach()` to 5 methods that hold the GIL while calling `block_within_async_context`: - `PyFileReference::__enter__`: added `py: Python<'_>`, wrapped `load_blocking()` in `py.detach()` with cloned `FileReference`. - `PyDaftFile::_from_file_reference`: same pattern — clone data, `py.detach()`, call `load_blocking()` inside. - `PyDaftFile::read`: added `py: Python<'_>`, used `cursor.take()` to move cursor into `py.detach()` closure (Rust ownership requirement), performed read without GIL, restored cursor after completion. - `PyDaftFile::seek`: same take/restore pattern as `read()`. - `PyDaftFile::_supports_range_requests`: added `py: Python<'_>`, wrapped `block_within_async_context` call in `py.detach()` with cloned `uri` and `source`. All changes follow the existing `py.detach()` pattern used by `exists()` at line 102 in the same file. No behavioral changes — same inputs, same outputs, only the GIL hold timing differs. ## Related Issues Closes #7256 --------- Co-authored-by: zhouwenjia.zwj <zhouwenjia.zwj@alibaba-inc.com>
main
9 hours ago

Latest Branches

CodSpeed Performance Gauge
0%
feat(sql): resolve read_iceberg io_config from table properties and default config#7273
21 minutes ago
d822f54
jackylee-ch:sql-read-iceberg-io-config
CodSpeed Performance Gauge
0%
fix: fd and thread leak from tqdm progress bar in Jupyter#7262
9 hours ago
666740b
yk/fix-progress-bar-fd-leak
CodSpeed Performance Gauge
0%
© 2026 CodSpeed Technology
Home Terms Privacy Docs