Visitar URL original
DuckDB delta extension install races across parallel tests · Issue #6743 · feast-dev/feast · GitHub
Skip to content

DuckDB delta extension install races across parallel tests #6743

Description

@larrysingleton007

Expected Behavior

The DuckDB offline integration suite should run reliably with 8 pytest-xdist workers on a fresh runner.

Current Behavior

DuckDBDelta tests intermittently fail while several workers auto-install the delta extension into the shared ~/.duckdb/extensions directory. The losing worker reports:

_duckdb.IOException: IO Error: Could not set lock on file ".../delta.duckdb_extension.tmp-...duckdb_extension.info": Conflicting lock is held in .../python3.10 (PID ...)

I found the same failure in 3 unrelated Linux CI runs:

The failures affected 2 different DuckDBDelta tests, so this is not tied to one test's behavior.

Steps to reproduce

  1. Start with an empty DuckDB extension cache on Linux.
  2. Install the locked duckdb-tests Pixi environment.
  3. Run pixi run -e duckdb-tests test, which executes the offline integration suite with pytest -n 8.
  4. Several workers may observe that delta is not installed and attempt to install it into the same extension directory.

The race is intermittent. I could not reproduce the lock failure on Apple Silicon macOS, including 80 synchronized cold-cache extension loads, but the 3 GitHub-hosted Linux runs above provide independent positive reproductions.

Specifications

  • Version: current master at f771ea4
  • Platform: GitHub-hosted Linux, linux_amd64
  • Subsystem: DuckDB offline integration tests
  • Locked dependencies: Python 3.10.20, DuckDB 1.5.4, Ibis 12.0.0, pytest-xdist 3.8.0

Possible Solution

Install delta once before starting the parallel test workers. For example, add a serial Pixi task dependency that runs:

python -c "import duckdb; duckdb.connect().install_extension('delta')"

I validated this against a separate cold cache. A fresh Ibis connection reported delta as installed but not loaded, then load_extension("delta") changed only the loaded state. This avoids Ibis's per-worker INSTALL path. The full 8-worker Feast suite then passed with 84 tests passed and 5 skipped.

Worker-specific extension directories would also avoid contention, but would download and install the same extension once per worker.

Activity

  1. larrysingleton007 commented on Aug 16, 2026

    @larrysingleton007
    ContributorAuthor

    Implementation plan

    The 8 pytest workers can all decide the DuckDB delta extension is missing and race to install it into the same cache directory.

    I'll add a small Pixi task that installs delta, then make the existing DuckDB integration test task depend on it. Pixi will complete that task before starting pytest, so workers only need to load the installed extension.

    The only source change should be pyproject.toml. I'll verify the task graph, use a separate empty home directory to prove the extension is installed before pytest starts, and run the complete locked DuckDB integration task.

  2. larrysingleton007 commented on Aug 16, 2026

    @larrysingleton007
    ContributorAuthor

    Implementation is in #6744.

    The DuckDB test task now depends on a serial delta extension install, so pytest workers start after the shared extension cache is populated.

    Validation used an empty DuckDB cache. Pixi completed the install task before pytest, a fresh connection saw delta as installed and not loaded, and the complete 8-worker suite passed with 84 tests passed and 5 skipped.

  3. added a commit that references this issue on Aug 18, 2026
    4805ed6
  4. added a commit that references this issue on Aug 18, 2026
    fd4d49d
  5. added 2 commits that reference this issue on Aug 31, 2026
    018ae42
    a29c923
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions