@@ -2,30 +2,34 @@ use foundry_compilers::{error::SolcError, solc::Solc};
22use semver:: Version ;
33use std:: { thread, time:: Duration } ;
44
5- const SOLC_INSTALL_RETRY_ATTEMPTS : usize = 5 ;
5+ const SOLC_INSTALL_RETRY_ATTEMPTS : u64 = 5 ;
6+ const SOLC_INSTALL_RETRY_BASE_BACKOFF_MS : u64 = 200 ;
67
78fn is_etxtbsy ( err : & SolcError ) -> bool {
89 matches ! ( err, SolcError :: Io ( io_err) if io_err. source( ) . kind( ) == std:: io:: ErrorKind :: ExecutableFileBusy || io_err. source( ) . raw_os_error( ) == Some ( 26 ) )
910}
1011
12+ fn backoff_ms ( attempt : u64 ) -> u64 {
13+ attempt * SOLC_INSTALL_RETRY_BASE_BACKOFF_MS
14+ }
15+
1116pub ( crate ) fn find_or_install_solc ( version : & Version ) -> Solc {
12- for attempt in 1 ..=SOLC_INSTALL_RETRY_ATTEMPTS {
17+ let mut attempt = 1_u64 ;
18+ loop {
1319 match Solc :: find_or_install ( version) {
1420 Ok ( solc) => return solc,
1521 Err ( err) => {
1622 if is_etxtbsy ( & err) && attempt < SOLC_INSTALL_RETRY_ATTEMPTS {
17- let backoff = Duration :: from_millis ( ( attempt as u64 ) * 200 ) ;
23+ let backoff_ms = backoff_ms ( attempt) ;
1824 println ! (
19- "cargo:warning=solc install race (ETXTBSY), retrying attempt {attempt}/{SOLC_INSTALL_RETRY_ATTEMPTS} after {:?}" ,
20- backoff
25+ "cargo:warning=solc install race (ETXTBSY), retrying attempt {attempt}/{SOLC_INSTALL_RETRY_ATTEMPTS} after {backoff_ms}ms"
2126 ) ;
22- thread:: sleep ( backoff) ;
27+ thread:: sleep ( Duration :: from_millis ( backoff_ms) ) ;
28+ attempt += 1 ;
2329 } else {
2430 panic ! ( "Failed to find or install solc {version}: {err:?}" ) ;
2531 }
2632 }
2733 }
2834 }
29-
30- unreachable ! ( "solc install retry loop exited unexpectedly" )
3135}
0 commit comments