From f1c139624f0fe85fdf34e43919e3c9d506bca3f7 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Tue, 26 Mar 2024 16:53:45 -0400 Subject: [PATCH] fix(generate-lockfile): hold lock before querying index --- src/cargo/ops/cargo_generate_lockfile.rs | 5 +++++ src/cargo/ops/resolve.rs | 5 ----- tests/testsuite/generate_lockfile.rs | 4 +--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index d6fdc3d94..e303d868d 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -166,12 +166,17 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes Ok(()) } +/// Prints lockfile change statuses. +/// +/// This would acquire the package-cache lock, as it may update the index to +/// show users latest available versions. pub fn print_lockfile_changes( gctx: &GlobalContext, previous_resolve: Option<&Resolve>, resolve: &Resolve, registry: &mut PackageRegistry<'_>, ) -> CargoResult<()> { + let _lock = gctx.acquire_package_cache_lock(CacheLockMode::DownloadExclusive)?; if let Some(previous_resolve) = previous_resolve { print_lockfile_sync(gctx, previous_resolve, resolve, registry) } else { diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 1042c897b..31a375514 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -256,11 +256,6 @@ fn resolve_with_registry<'gctx>( false }; if print { - // We only want one Cargo at a time resolving a crate graph since this can - // involve a lot of frobbing of the global caches. - let _lock = ws - .gctx() - .acquire_package_cache_lock(CacheLockMode::DownloadExclusive)?; ops::print_lockfile_changes(ws.gctx(), prev.as_ref(), &resolve, registry)?; } Ok(resolve) diff --git a/tests/testsuite/generate_lockfile.rs b/tests/testsuite/generate_lockfile.rs index aa4aed198..2c0b65a0d 100644 --- a/tests/testsuite/generate_lockfile.rs +++ b/tests/testsuite/generate_lockfile.rs @@ -266,11 +266,9 @@ fn generate_lockfile_holds_lock_and_offline() { .run(); p.cargo("generate-lockfile --offline") - .with_status(101) .with_stderr_contains( "\ -[..]thread 'main' panicked[..] -[..]package cache lock is not currently held[..] +[LOCKING] 2 packages ", ) .run();