diff --git a/Cargo.lock b/Cargo.lock index 919e9a240..ddf5052cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -752,6 +752,19 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if 1.0.0", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core 0.9.9", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -2648,6 +2661,7 @@ dependencies = [ "cache-key", "chrono", "clap", + "dashmap 5.5.3", "derivative", "distribution-filename", "distribution-types", @@ -4110,7 +4124,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28491611b6b9a0b9f027be139a4be792b13a20780100dd8b054d44dbf596d52b" dependencies = [ - "dashmap", + "dashmap 3.11.10", "smallvec", ] diff --git a/Cargo.toml b/Cargo.toml index 25fa6038a..2492f1300 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ chrono = { version = "0.4.31" } clap = { version = "4.4.13" } configparser = { version = "3.0.4" } csv = { version = "1.3.0" } +dashmap = { version = "5.5.3" } data-encoding = { version = "2.5.0" } derivative = { version = "2.2.0" } directories = { version = "5.0.1" } diff --git a/crates/puffin-resolver/Cargo.toml b/crates/puffin-resolver/Cargo.toml index 7f0705503..97e6726de 100644 --- a/crates/puffin-resolver/Cargo.toml +++ b/crates/puffin-resolver/Cargo.toml @@ -37,6 +37,7 @@ anyhow = { workspace = true } bitflags = { workspace = true } chrono = { workspace = true } clap = { workspace = true, features = ["derive"], optional = true } +dashmap = { workspace = true } derivative = { workspace = true } fs-err = { workspace = true, features = ["tokio"] } futures = { workspace = true } diff --git a/crates/puffin-resolver/src/resolver/index.rs b/crates/puffin-resolver/src/resolver/index.rs index 84c49bd74..6976f6c99 100644 --- a/crates/puffin-resolver/src/resolver/index.rs +++ b/crates/puffin-resolver/src/resolver/index.rs @@ -1,7 +1,6 @@ use url::Url; use distribution_types::PackageId; -use pep440_rs::VersionSpecifiers; use puffin_normalize::PackageName; use puffin_traits::OnceMap; use pypi_types::Metadata21; @@ -18,9 +17,6 @@ pub(crate) struct Index { /// A map from package ID to metadata for that distribution. pub(crate) distributions: OnceMap, - /// A map from package ID to required Python version. - pub(crate) incompatibilities: OnceMap, - /// A map from source URL to precise URL. pub(crate) redirects: OnceMap, } @@ -32,7 +28,6 @@ impl Index { pub(crate) fn cancel_all(&self) { self.packages.cancel_all(); self.distributions.cancel_all(); - self.incompatibilities.cancel_all(); self.redirects.cancel_all(); } } diff --git a/crates/puffin-resolver/src/resolver/mod.rs b/crates/puffin-resolver/src/resolver/mod.rs index 2df666073..3b25e702f 100644 --- a/crates/puffin-resolver/src/resolver/mod.rs +++ b/crates/puffin-resolver/src/resolver/mod.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use anyhow::Result; +use dashmap::DashMap; use futures::channel::mpsc::UnboundedReceiver; use futures::{pin_mut, FutureExt, StreamExt}; use itertools::Itertools; @@ -17,9 +18,10 @@ use url::Url; use distribution_filename::WheelFilename; use distribution_types::{ - BuiltDist, Dist, DistributionMetadata, LocalEditable, Name, RemoteSource, SourceDist, - VersionOrUrl, + BuiltDist, Dist, DistributionMetadata, LocalEditable, Name, PackageId, RemoteSource, + SourceDist, VersionOrUrl, }; +use pep440_rs::VersionSpecifiers; use pep508_rs::{MarkerEnvironment, Requirement}; use platform_tags::Tags; use puffin_client::RegistryClient; @@ -64,6 +66,7 @@ pub struct Resolver<'a, Provider: ResolverProvider> { python_requirement: PythonRequirement<'a>, selector: CandidateSelector, index: Arc, + incompatibilities: DashMap, editables: FxHashMap, reporter: Option>, provider: Provider, @@ -155,6 +158,7 @@ impl<'a, Provider: ResolverProvider> Resolver<'a, Provider> { Self { index: Arc::new(index), + incompatibilities: DashMap::default(), selector, allowed_urls, project: manifest.project, @@ -492,9 +496,8 @@ impl<'a, Provider: ResolverProvider> Resolver<'a, Provider> { // If the version is incompatible, short-circuit. if let Some(requires_python) = candidate.validate(&self.python_requirement) { - self.index - .incompatibilities - .done(candidate.package_id(), requires_python.clone()); + self.incompatibilities + .insert(candidate.package_id(), requires_python.clone()); return Ok(Some(candidate.version().clone())); } @@ -606,7 +609,7 @@ impl<'a, Provider: ResolverProvider> Resolver<'a, Provider> { // If the package is known to be incompatible, return the Python version as an // incompatibility, and skip fetching the metadata. - if let Some(entry) = self.index.incompatibilities.get(&package_id) { + if let Some(entry) = self.incompatibilities.get(&package_id) { let requires_python = entry.value(); let version = requires_python .iter() @@ -765,9 +768,8 @@ impl<'a, Provider: ResolverProvider> Resolver<'a, Provider> { // If the version is incompatible, short-circuit. if let Some(requires_python) = candidate.validate(&self.python_requirement) { - self.index - .incompatibilities - .done(candidate.package_id(), requires_python.clone()); + self.incompatibilities + .insert(candidate.package_id(), requires_python.clone()); return Ok(None); }