fn connect_or_start_server()

in src/commands.rs [303:337]


fn connect_or_start_server(
    addr: &crate::net::SocketAddr,
    startup_timeout: Option<Duration>,
) -> Result<ServerConnection> {
    trace!("connect_or_start_server({addr})");
    match connect_to_server(addr) {
        Ok(server) => Ok(server),
        Err(ref e)
            if (e.kind() == io::ErrorKind::ConnectionRefused
                || e.kind() == io::ErrorKind::TimedOut)
                || (e.kind() == io::ErrorKind::NotFound && addr.is_unix_path()) =>
        {
            // If the connection was refused we probably need to start
            // the server.
            match run_server_process(startup_timeout)? {
                ServerStartup::Ok { addr: actual_addr } => {
                    if addr.to_string() != actual_addr {
                        // bail as the next connect_with_retry will fail
                        bail!(
                            "sccache: Listening on address {actual_addr} instead of {addr}"
                        );
                    }
                }
                ServerStartup::AddrInUse => {
                    debug!("AddrInUse: possible parallel server bootstraps, retrying..")
                }
                ServerStartup::TimedOut => bail!("Timed out waiting for server startup. Maybe the remote service is unreachable?\nRun with SCCACHE_LOG=debug SCCACHE_NO_DAEMON=1 to get more information"),
                ServerStartup::Err { reason } => bail!("Server startup failed: {}\nRun with SCCACHE_LOG=debug SCCACHE_NO_DAEMON=1 to get more information", reason),
            }
            let server = connect_with_retry(addr)?;
            Ok(server)
        }
        Err(e) => Err(e.into()),
    }
}