1
0
mirror of https://github.com/Bluemangoo/sekai-unpacker.git synced 2026-05-06 20:44:47 +08:00
This commit is contained in:
Bluemangoo 2026-04-24 12:00:03 +08:00
parent de7b63d366
commit adc3afc7d5
Signed by: Bluemangoo
GPG Key ID: F2F7E46880A1C4CF
3 changed files with 56 additions and 15 deletions

View File

@ -183,7 +183,6 @@ async fn main() -> anyhow::Result<()> {
let liveness_tx = liveness_tx.clone(); let liveness_tx = liveness_tx.clone();
join_set.spawn(async move { join_set.spawn(async move {
let _guard = liveness_tx; let _guard = liveness_tx;
let mut inner_set = JoinSet::new();
loop { loop {
if cancel_token.is_cancelled() { if cancel_token.is_cancelled() {
return; return;
@ -205,7 +204,7 @@ async fn main() -> anyhow::Result<()> {
let local_manifest = local_manifest.clone(); let local_manifest = local_manifest.clone();
let signal = signal.clone(); let signal = signal.clone();
inner_set.spawn(async move { tokio::spawn(async move {
loop { loop {
if client.get_client().await.is_err() { if client.get_client().await.is_err() {
return; return;

View File

@ -121,11 +121,6 @@ pub async fn run_main(
match r { match r {
Ok(Ok(())) => cnt.inc_success(), Ok(Ok(())) => cnt.inc_success(),
Ok(Err(e)) => { Ok(Err(e)) => {
if e.to_string()
.contains("Session did not reconnect within 15s")
{
return Err(anyhow!(e));
}
error!("{}", e); error!("{}", e);
cnt.inc_failure() cnt.inc_failure()
} }
@ -163,12 +158,21 @@ pub async fn run_side(
let n = p1.concurrent.unwrap_or(5); let n = p1.concurrent.unwrap_or(5);
let semaphore = Arc::new(Semaphore::new(n)); let semaphore = Arc::new(Semaphore::new(n));
let mut join_set = JoinSet::new(); let mut join_set = JoinSet::new();
let cancel_token = CancellationToken::new();
while let Some(task) = queue.try_pop() { while let Some(task) = queue.try_pop() {
if cancel_token.is_cancelled() {
break;
}
let permit = semaphore.clone().acquire_owned().await?; let permit = semaphore.clone().acquire_owned().await?;
if cancel_token.is_cancelled() {
break;
}
let client = client.clone(); let client = client.clone();
let id = id.clone(); let id = id.clone();
let local_manifest = manifest.clone(); let local_manifest = manifest.clone();
let p1 = p1.clone(); let p1 = p1.clone();
let cancel_token = cancel_token.clone();
join_set.spawn(async move { join_set.spawn(async move {
let guard = task; let guard = task;
@ -185,6 +189,11 @@ pub async fn run_side(
let mut retry_conn = client.get_client().await?; let mut retry_conn = client.get_client().await?;
result = download(&mut retry_conn, &req, &p1).await; result = download(&mut retry_conn, &req, &p1).await;
} }
if let Err(e) = &result
&& e.downcast_ref::<h2::Error>().is_some()
{
cancel_token.cancel();
}
result?; result?;
local_manifest local_manifest

View File

@ -95,6 +95,30 @@ pub enum TunnelEndpoint {
Server(Arc<ServerManager>), Server(Arc<ServerManager>),
} }
#[derive(Clone)]
pub enum WeakTunnelEndpoint {
Client(std::sync::Weak<ClientManager>),
Server(std::sync::Weak<ServerManager>),
}
impl TunnelEndpoint {
pub fn downgrade(&self) -> WeakTunnelEndpoint {
match self {
Self::Client(c) => WeakTunnelEndpoint::Client(Arc::downgrade(c)),
Self::Server(s) => WeakTunnelEndpoint::Server(Arc::downgrade(s)),
}
}
}
impl WeakTunnelEndpoint {
pub fn upgrade(&self) -> Option<TunnelEndpoint> {
match self {
Self::Client(c) => c.upgrade().map(TunnelEndpoint::Client),
Self::Server(s) => s.upgrade().map(TunnelEndpoint::Server),
}
}
}
pub struct ClientManager { pub struct ClientManager {
pub session_id: AtomicU64, pub session_id: AtomicU64,
pub current_client: Mutex<Option<client::SendRequest<Bytes>>>, pub current_client: Mutex<Option<client::SendRequest<Bytes>>>,
@ -231,9 +255,9 @@ enum ResumeResult {
pub struct TunnelListener { pub struct TunnelListener {
listener: TcpListener, listener: TcpListener,
config: ServerTunnelConfig, config: ServerTunnelConfig,
pending_plain_sessions: Mutex<HashSet<u64>>, pending_plain_sessions: Mutex<HashMap<u64, std::time::Instant>>,
next_session_id: AtomicU64, next_session_id: AtomicU64,
active_sessions: Mutex<HashMap<u64, TunnelEndpoint>>, active_sessions: Mutex<HashMap<u64, WeakTunnelEndpoint>>,
} }
impl TunnelListener { impl TunnelListener {
@ -243,7 +267,7 @@ impl TunnelListener {
Ok(Self { Ok(Self {
listener, listener,
config, config,
pending_plain_sessions: Mutex::new(HashSet::new()), pending_plain_sessions: Mutex::new(HashMap::new()),
next_session_id: AtomicU64::new(1), next_session_id: AtomicU64::new(1),
active_sessions: Mutex::new(HashMap::new()), active_sessions: Mutex::new(HashMap::new()),
}) })
@ -264,7 +288,9 @@ impl TunnelListener {
let mut stream = match self.try_resume_plain_session(stream, peer_addr).await? { let mut stream = match self.try_resume_plain_session(stream, peer_addr).await? {
ResumeResult::NewSession(ep_raw, sid) => { ResumeResult::NewSession(ep_raw, sid) => {
let ep = wrap_raw_endpoint(sid, ep_raw, None); let ep = wrap_raw_endpoint(sid, ep_raw, None);
self.active_sessions.lock().await.insert(sid, ep.clone()); let mut sessions = self.active_sessions.lock().await;
sessions.retain(|_, weak_ep| weak_ep.upgrade().is_some());
sessions.insert(sid, ep.downgrade());
return Ok(ep); return Ok(ep);
} }
ResumeResult::ResumedExisting => continue, ResumeResult::ResumedExisting => continue,
@ -290,7 +316,9 @@ impl TunnelListener {
let sid = self.next_session_id.fetch_add(1, Ordering::Relaxed); let sid = self.next_session_id.fetch_add(1, Ordering::Relaxed);
let ep = wrap_raw_endpoint(sid, ep_raw, None); let ep = wrap_raw_endpoint(sid, ep_raw, None);
self.active_sessions.lock().await.insert(sid, ep.clone()); let mut sessions = self.active_sessions.lock().await;
sessions.retain(|_, weak_ep| weak_ep.upgrade().is_some());
sessions.insert(sid, ep.downgrade());
return Ok(ep); return Ok(ep);
} }
} }
@ -320,7 +348,8 @@ impl TunnelListener {
let session_id = self.next_session_id.fetch_add(1, Ordering::Relaxed); let session_id = self.next_session_id.fetch_add(1, Ordering::Relaxed);
{ {
let mut pending = self.pending_plain_sessions.lock().await; let mut pending = self.pending_plain_sessions.lock().await;
pending.insert(session_id); pending.retain(|_, time| time.elapsed() < Duration::from_secs(30));
pending.insert(session_id, std::time::Instant::now());
} }
tls_stream.write_all(TLS_BOOTSTRAP_MAGIC).await?; tls_stream.write_all(TLS_BOOTSTRAP_MAGIC).await?;
@ -351,7 +380,7 @@ impl TunnelListener {
let is_pending = { let is_pending = {
let mut pending = self.pending_plain_sessions.lock().await; let mut pending = self.pending_plain_sessions.lock().await;
pending.remove(&session_id) pending.remove(&session_id).is_some()
}; };
if is_pending { if is_pending {
@ -366,7 +395,11 @@ impl TunnelListener {
let ep_raw = upgrade_to_h2_raw(stream, self.config.identity) let ep_raw = upgrade_to_h2_raw(stream, self.config.identity)
.await .await
.map_err(|e| anyhow::anyhow!("{}", e))?; .map_err(|e| anyhow::anyhow!("{}", e))?;
update_endpoint(&ep, ep_raw).await; update_endpoint(
&ep.upgrade().ok_or(anyhow!("Connection is cleared"))?,
ep_raw,
)
.await;
info!( info!(
"[{}] Successfully resumed existing session {}", "[{}] Successfully resumed existing session {}",
peer_addr, session_id peer_addr, session_id