Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(resolver): share conflict cache between activation retries #14692

Merged
merged 1 commit into from
Oct 15, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions src/cargo/core/resolver/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,20 @@ pub fn resolve(
_ => None,
};
let mut registry = RegistryQueryer::new(registry, replacements, version_prefs);

// Global cache of the reasons for each time we backtrack.
let mut past_conflicting_activations = conflict_cache::ConflictCache::new();

let resolver_ctx = loop {
let resolver_ctx = ResolverContext::new();
let resolver_ctx =
activate_deps_loop(resolver_ctx, &mut registry, summaries, first_version, gctx)?;
let resolver_ctx = activate_deps_loop(
resolver_ctx,
&mut registry,
summaries,
first_version,
gctx,
&mut past_conflicting_activations,
)?;
if registry.reset_pending() {
break resolver_ctx;
} else {
Expand Down Expand Up @@ -194,14 +204,11 @@ fn activate_deps_loop(
summaries: &[(Summary, ResolveOpts)],
first_version: Option<VersionOrdering>,
gctx: Option<&GlobalContext>,
past_conflicting_activations: &mut conflict_cache::ConflictCache,
) -> CargoResult<ResolverContext> {
let mut backtrack_stack = Vec::new();
let mut remaining_deps = RemainingDeps::new();

// `past_conflicting_activations` is a cache of the reasons for each time we
// backtrack.
let mut past_conflicting_activations = conflict_cache::ConflictCache::new();

// Activate all the initial summaries to kick off some work.
for (summary, opts) in summaries {
debug!("initial activation: {}", summary.package_id());
Expand Down Expand Up @@ -313,7 +320,7 @@ fn activate_deps_loop(
if let Some(c) = generalize_conflicting(
&resolver_ctx,
registry,
&mut past_conflicting_activations,
past_conflicting_activations,
&parent,
&dep,
&conflicting_activations,
Expand Down