uv/crates
Charlie Marsh f1840c77b6
Guard against concurrent cache writes on Windows (#11007)
## Summary

On Windows, we have a lot of issues with atomic replacement and such.
There are a bunch of different failure modes, but they generally
involve: trying to persist a fail to a path at which the file already
exists, trying to replace or remove a file while someone else is reading
it, etc.

This PR adds locks to all of the relevant database paths. We already use
these advisory locks when building source distributions; now we use them
when unzipping wheels, storing metadata, etc.

Closes #11002.

## Test Plan

I ran the following script:

```shell
# Define the cache directory path
$cacheDir = "C:\Users\crmar\workspace\uv\cache"

# Clear the cache directory if it exists
if (Test-Path $cacheDir) {
    Remove-Item -Recurse -Force $cacheDir
}

# Create the cache directory again
New-Item -ItemType Directory -Force -Path $cacheDir

# Define the command to run with --cache-dir flag
$command = {
    param ($venvPath)

    # Create a virtual environment in the specified path with --python
    uv venv $venvPath

    # Run the pip install command with --cache-dir flag
    C:\Users\crmar\workspace\uv\target\profiling\uv.exe pip install flask==1.0.4 --no-binary flask --cache-dir C:\Users\crmar\workspace\uv\cache -v --python $venvPath
}

# Define the paths for the different virtual environments
$venv1 = "C:\Users\crmar\workspace\uv\venv1"
$venv2 = "C:\Users\crmar\workspace\uv\venv2"
$venv3 = "C:\Users\crmar\workspace\uv\venv3"
$venv4 = "C:\Users\crmar\workspace\uv\venv4"
$venv5 = "C:\Users\crmar\workspace\uv\venv5"

# Start the command in parallel five times using Start-Job, each with a different venv
$job1 = Start-Job -ScriptBlock $command -ArgumentList $venv1
$job2 = Start-Job -ScriptBlock $command -ArgumentList $venv2
$job3 = Start-Job -ScriptBlock $command -ArgumentList $venv3
$job4 = Start-Job -ScriptBlock $command -ArgumentList $venv4
$job5 = Start-Job -ScriptBlock $command -ArgumentList $venv5

# Wait for all jobs to complete
$jobs = @($job1, $job2, $job3, $job4, $job5)
$jobs | ForEach-Object { Wait-Job $_ }

# Retrieve the results (optional)
$jobs | ForEach-Object { Receive-Job -Job $_ }

# Clean up the jobs
$jobs | ForEach-Object { Remove-Job -Job $_ }
```

And ensured it succeeded in five straight invocations (whereas on
`main`, it consistently fails with a variety of different traces).
2025-01-28 15:33:49 -05:00
..
uv Guard against concurrent cache writes on Windows (#11007) 2025-01-28 15:33:49 -05:00
uv-auth Upgrade Rust toolchain to 1.84.0 (#10533) 2025-01-11 22:19:33 -05:00
uv-bench Use structured wheel tags everywhere (#10542) 2025-01-14 01:39:39 +00:00
uv-build-backend Reduce `WheelFilename` to 48 bytes (#10583) 2025-01-14 14:49:17 +00:00
uv-build-frontend Detect cyclic dependencies during builds (#10258) 2024-12-31 22:22:42 -05:00
uv-cache Guard against concurrent cache writes on Windows (#11007) 2025-01-28 15:33:49 -05:00
uv-cache-info Fix git-tag cache-key reader in case of slashes (#10467) (#10500) 2025-01-11 21:30:46 -05:00
uv-cache-key Remove separate test files in favor of same-file `mod tests` (#9199) 2024-11-18 20:11:46 +00:00
uv-cli Reference workspaces in `--no-sources` documentation (#10995) 2025-01-27 13:33:14 -05:00
uv-client Guard against concurrent cache writes on Windows (#11007) 2025-01-28 15:33:49 -05:00
uv-configuration Add dependency-group cli flags to `uv pip install` and `uv pip compile` (`--group`, `--no-group`, `--only-group`, `--all-groups`) (#10861) 2025-01-23 08:47:52 -05:00
uv-console Support interactive input in `uv publish` (#8158) 2024-10-15 10:00:43 +02:00
uv-dev Shrink `Dist` from 352 to 288 bytes (#10389) 2025-01-08 09:33:19 -05:00
uv-dirs Eliminate dependencies on `directores` and `dirs-sys` (#8048) 2024-11-07 14:29:54 -06:00
uv-dispatch Upgrade Rust toolchain to 1.84.0 (#10533) 2025-01-11 22:19:33 -05:00
uv-distribution Guard against concurrent cache writes on Windows (#11007) 2025-01-28 15:33:49 -05:00
uv-distribution-filename Store unsupported tags in wheel filename (#10665) 2025-01-17 04:41:53 +00:00
uv-distribution-types [uv-settings]: Correct behavior for relative find-links paths when run from a subdir (#10827) 2025-01-22 19:44:35 +00:00
uv-extract Upgrade Rust toolchain to 1.84.0 (#10533) 2025-01-11 22:19:33 -05:00
uv-fs Guard against concurrent cache writes on Windows (#11007) 2025-01-28 15:33:49 -05:00
uv-git Remove the `FullCommit` variant from `GitReference` (#10803) 2025-01-21 19:26:58 +00:00
uv-globfilter Build backend: Revamp include/exclude (#9525) 2024-12-01 11:32:35 +00:00
uv-install-wheel Remove `import re` from entrypoint wrapper scripts (#10627) 2025-01-15 19:45:32 +01:00
uv-installer Include `commit_id` and `requested_revision` in `direct_url.json` (#10862) 2025-01-22 12:16:49 -05:00
uv-macros Remove unnecessary prefixes (#10158) 2024-12-25 14:18:01 -05:00
uv-metadata chore: Move all integration tests to a single binary (#8093) 2024-10-11 16:41:35 +02:00
uv-normalize Add a shared `uv-small-str` crate (#10545) 2025-01-12 20:23:18 +00:00
uv-once-map Use shared resolver state between add and lock (#8146) 2024-10-12 14:58:07 +00:00
uv-options-metadata Upgrade minimum Rust version to 1.83 (#9815) 2024-12-11 10:06:19 -06:00
uv-pep440 Remove trailing commas before brackets (#10740) 2025-01-18 19:56:46 +00:00
uv-pep508 Avoid deserialization error for paths above the root (#10789) 2025-01-20 16:36:18 -05:00
uv-performance-flate2-backend Re-enable zlib-ng on all platforms (except s390x, PowerPC, and FreeBSD) (#10370) 2025-01-07 13:04:34 -05:00
uv-performance-memory-allocator Run `cargo update` (#10173) 2024-12-26 12:00:58 -05:00
uv-platform-tags Allow installation of manylinux wheels on loongarch64 (#10927) 2025-01-24 14:36:03 +01:00
uv-publish Remove trailing commas before brackets (#10740) 2025-01-18 19:56:46 +00:00
uv-pypi-types Invalidate lockfile when static versions change (#10858) 2025-01-22 17:58:15 +00:00
uv-python Fix best-interpreter lookups when there is an invalid interpreter in the PATH (#11030) 2025-01-28 13:44:32 -06:00
uv-requirements fix `--only-group` in `uv pip` interface (#10902) 2025-01-23 11:35:47 -05:00
uv-requirements-txt Allow optional `=` for editables in `requirements.txt` (#10954) 2025-01-24 21:55:51 -05:00
uv-resolver Prefer preferences with greater package versions (#10963) 2025-01-25 16:37:25 -05:00
uv-scripts Upgrade Rust toolchain to 1.84.0 (#10533) 2025-01-11 22:19:33 -05:00
uv-settings temporarily disable new uv pip dependency-group flags (#10909) 2025-01-23 14:43:07 -06:00
uv-shell Refactor shell quoting (#9055) 2024-11-15 09:06:54 +00:00
uv-small-str Add a shared `uv-small-str` crate (#10545) 2025-01-12 20:23:18 +00:00
uv-state Add `uv-dirs` to consolidate directory lookup methods (#8453) 2024-10-22 11:33:25 -05:00
uv-static Improve some env var document (#10887) 2025-01-23 09:10:19 -05:00
uv-tool Guard against self-deletion in `uv venv` and `uv tool` (#10206) 2024-12-29 10:46:45 -05:00
uv-trampoline chore: update trampoline windows crate to 0.59.0 (#10524) 2025-01-14 08:54:19 -06:00
uv-trampoline-builder Upgrade Rust toolchain to 1.84.0 (#10533) 2025-01-11 22:19:33 -05:00
uv-types Avoid generating unused hashes during `uv lock` (#10307) 2025-01-06 00:58:07 +00:00
uv-version Bump version to 0.5.24 (#10922) 2025-01-23 17:26:59 -06:00
uv-virtualenv Revert "improve shell compatibility of venv activate scripts (#10397)" (#10497) 2025-01-11 09:23:07 -05:00
uv-warnings chore: Move all integration tests to a single binary (#8093) 2024-10-11 16:41:35 +02:00
uv-workspace Fix incorrect error message when specifying `tool.uv.sources.(package).workspace` with other options (#11013) 2025-01-28 09:25:33 -05:00
README.md Link to Dependency specifiers instead of PEP 508 (#8411) 2024-10-21 14:43:38 -04:00

README.md

Crates

uv-bench

Functionality for benchmarking uv.

uv-cache-key

Generic functionality for caching paths, URLs, and other resources across platforms.

uv-distribution-filename

Parse built distribution (wheel) and source distribution (sdist) filenames to extract structured metadata.

uv-distribution-types

Abstractions for representing built distributions (wheels) and source distributions (sdists), and the sources from which they can be downloaded.

uv-install-wheel-rs

Install built distributions (wheels) into a virtual environment.

uv-once-map

A waitmap-like concurrent hash map for executing tasks exactly once.

uv-pep440-rs

Utilities for interacting with Python version numbers and specifiers.

uv-pep508-rs

Utilities for parsing and evaluating dependency specifiers, previously known as PEP 508.

uv-platform-tags

Functionality for parsing and inferring Python platform tags as per PEP 425.

uv-cli

Command-line interface for the uv package manager.

uv-build-frontend

A PEP 517-compatible build frontend for uv.

uv-cache

Functionality for caching Python packages and associated metadata.

uv-client

Client for interacting with PyPI-compatible HTTP APIs.

uv-dev

Development utilities for uv.

uv-dispatch

A centralized struct for resolving and building source distributions in isolated environments. Implements the traits defined in uv-types.

uv-distribution

Client for interacting with built distributions (wheels) and source distributions (sdists). Capable of fetching metadata, distribution contents, etc.

uv-extract

Utilities for extracting files from archives.

uv-fs

Utilities for interacting with the filesystem.

uv-git

Functionality for interacting with Git repositories.

uv-installer

Functionality for installing Python packages into a virtual environment.

uv-python

Functionality for detecting and leveraging the current Python interpreter.

uv-normalize

Normalize package and extra names as per Python specifications.

uv-requirements

Utilities for reading package requirements from pyproject.toml and requirements.txt files.

uv-resolver

Functionality for resolving Python packages and their dependencies.

uv-shell

Utilities for detecting and manipulating shell environments.

uv-types

Shared traits for uv, to avoid circular dependencies.

uv-pypi-types

General-purpose type definitions for types used in PyPI-compatible APIs.

uv-virtualenv

A venv replacement to create virtual environments in Rust.

uv-warnings

User-facing warnings for uv.

uv-workspace

Workspace abstractions for uv.

uv-requirements-txt

Functionality for parsing requirements.txt files.