File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1683,6 +1683,11 @@ where
16831683 }
16841684
16851685 let Some ( done) = fetches. next ( ) . await else {
1686+ tracing:: warn!(
1687+ full_waiters = state. full_waiters. values( ) . map( Vec :: len) . sum:: <usize >( ) ,
1688+ version_waiters = state. version_waiters. values( ) . map( Vec :: len) . sum:: <usize >( ) ,
1689+ "manifest fetch stream ended with pending resolver waiters; falling back to sequential resolution"
1690+ ) ;
16861691 let mut fallback = Vec :: new ( ) ;
16871692 for ( _, waiters) in state. full_waiters . drain ( ) {
16881693 fallback. extend ( waiters) ;
Original file line number Diff line number Diff line change @@ -68,11 +68,32 @@ fn parse_full_manifest_with_core_sync(
6868 . map_err ( |e| anyhow ! ( "JSON parse error: {e}" ) ) ?;
6969 manifest. raw = raw_bytes;
7070
71- let speculative = spec. and_then ( |spec| {
72- resolve_target_version ( ( & manifest) . into ( ) , & spec)
73- . ok ( )
74- . and_then ( |version| manifest. get_core_version ( & version) . map ( |core| ( spec, core) ) )
75- } ) ;
71+ let speculative = match spec {
72+ Some ( spec) => match resolve_target_version ( ( & manifest) . into ( ) , & spec) {
73+ Ok ( version) => match manifest. get_core_version ( & version) {
74+ Some ( core) => Some ( ( spec, core) ) ,
75+ None => {
76+ tracing:: trace!(
77+ package = %manifest. name,
78+ spec = %spec,
79+ version = %version,
80+ "speculative manifest extract missed resolved version"
81+ ) ;
82+ None
83+ }
84+ } ,
85+ Err ( error) => {
86+ tracing:: trace!(
87+ package = %manifest. name,
88+ spec = %spec,
89+ error = %error,
90+ "speculative manifest version resolution failed"
91+ ) ;
92+ None
93+ }
94+ } ,
95+ None => None ,
96+ } ;
7697
7798 Ok ( ( manifest, speculative) )
7899}
Original file line number Diff line number Diff line change @@ -73,6 +73,9 @@ pub enum ManifestJobDone {
7373}
7474
7575/// Lower-level manifest provider used by the demand BFS loop.
76+ ///
77+ /// Resolver workers clone the provider before spawning jobs, so implementors
78+ /// should keep `Clone` cheap (for example by storing shared state behind `Arc`).
7679#[ cfg_attr( target_arch = "wasm32" , async_trait( ?Send ) ) ]
7780#[ cfg_attr( not( target_arch = "wasm32" ) , async_trait) ]
7881pub trait ManifestProvider : RegistryClient + Clone + Send + Sync + ' static {
You can’t perform that action at this time.
0 commit comments