fix: rendezvous server timeout (#12443)

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou
2025-07-28 12:14:07 +08:00
committed by GitHub
parent 9db7217cab
commit af53b1e8c9

View File

@@ -2,7 +2,7 @@ use std::{
net::SocketAddr, net::SocketAddr,
sync::{ sync::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
Arc, Arc, RwLock,
}, },
time::{Duration, Instant}, time::{Duration, Instant},
}; };
@@ -93,7 +93,7 @@ impl RendezvousMediator {
} }
scrap::codec::test_av1(); scrap::codec::test_av1();
loop { loop {
let mut timeout = CONNECT_TIMEOUT; let timeout = Arc::new(RwLock::new(CONNECT_TIMEOUT));
let conn_start_time = Instant::now(); let conn_start_time = Instant::now();
*SOLVING_PK_MISMATCH.lock().await = "".to_owned(); *SOLVING_PK_MISMATCH.lock().await = "".to_owned();
if !config::option2bool("stop-service", &Config::get_option("stop-service")) if !config::option2bool("stop-service", &Config::get_option("stop-service"))
@@ -105,6 +105,7 @@ impl RendezvousMediator {
MANUAL_RESTARTED.store(false, Ordering::SeqCst); MANUAL_RESTARTED.store(false, Ordering::SeqCst);
for host in servers.clone() { for host in servers.clone() {
let server = server.clone(); let server = server.clone();
let timeout = timeout.clone();
futs.push(tokio::spawn(async move { futs.push(tokio::spawn(async move {
if let Err(err) = Self::start(server, host).await { if let Err(err) = Self::start(server, host).await {
let err = format!("rendezvous mediator error: {err}"); let err = format!("rendezvous mediator error: {err}");
@@ -113,7 +114,7 @@ impl RendezvousMediator {
if err.contains("10054") || err.contains("11001") { if err.contains("10054") || err.contains("11001") {
// No such host is known. (os error 11001) // No such host is known. (os error 11001)
// An existing connection was forcibly closed by the remote host. (os error 10054): also happens for UDP // An existing connection was forcibly closed by the remote host. (os error 10054): also happens for UDP
timeout = 3000; *timeout.write().unwrap() = 3000;
} }
log::error!("{err}"); log::error!("{err}");
} }
@@ -126,9 +127,10 @@ impl RendezvousMediator {
server.write().unwrap().close_connections(); server.write().unwrap().close_connections();
} }
Config::reset_online(); Config::reset_online();
let timeout = *timeout.read().unwrap();
if !MANUAL_RESTARTED.load(Ordering::SeqCst) { if !MANUAL_RESTARTED.load(Ordering::SeqCst) {
let elapsed = conn_start_time.elapsed().as_millis() as u64; let elapsed = conn_start_time.elapsed().as_millis() as u64;
if elapsed < timeout{ if elapsed < timeout {
sleep(((timeout - elapsed) / 1000) as _).await; sleep(((timeout - elapsed) / 1000) as _).await;
} }
} else { } else {