fixed dedadlocks and buffer changes
This commit is contained in:
@@ -129,8 +129,6 @@ impl TcpConnection {
|
||||
}
|
||||
|
||||
fn poll_and_process(&mut self, socket: &mut tcp::Socket) {
|
||||
let max_pending = NetworkConfig::global().tcp_max_pending;
|
||||
|
||||
// 1. Вычитываем данные из smoltcp и шлем в Muxer
|
||||
while socket.can_recv() {
|
||||
let mut full = false;
|
||||
@@ -166,19 +164,17 @@ impl TcpConnection {
|
||||
// 2. Читаем данные из Muxer'а
|
||||
if !self.server_eof {
|
||||
loop {
|
||||
if self.pending_data.len() >= socket.send_capacity() {
|
||||
break;
|
||||
}
|
||||
|
||||
match self.core.rx.try_recv() {
|
||||
Ok(data) => {
|
||||
self.pending_data.extend_from_slice(&data);
|
||||
if self.pending_data.len() >= max_pending {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Err(mpsc::error::TryRecvError::Empty) => {
|
||||
break;
|
||||
}
|
||||
Err(mpsc::error::TryRecvError::Empty) => break,
|
||||
Err(mpsc::error::TryRecvError::Disconnected) => {
|
||||
// ВАЖНО: Удаленный сервер прислал EOF!
|
||||
debug!(%self.core.handle, "Server sent EOF (channel disconnected).");
|
||||
debug!(%self.core.handle, "Server sent EOF");
|
||||
self.server_eof = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ impl SocketFactory {
|
||||
443 | 80 | 8080 => max_buf,
|
||||
22 => 32 * 1024,
|
||||
53 => 16 * 1024,
|
||||
_ => max_buf / 4,
|
||||
_ => max_buf,
|
||||
};
|
||||
|
||||
let mut socket = tcp::Socket::new(
|
||||
@@ -240,9 +240,7 @@ impl ConnectionManager {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Если это происходит во время Connecting - значит сервер шлет ответы,
|
||||
// а клиент уже забыл про этот ID или еще не создал его.
|
||||
error!(
|
||||
trace!(
|
||||
"👻 [Stream {}] ORPHAN packet from tunnel. ID mismatch?",
|
||||
frame.socket_id
|
||||
);
|
||||
|
||||
@@ -99,19 +99,17 @@ impl Engine {
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Если затора нет, читаем новые кадры из VPN-туннеля
|
||||
if stuck_frame.is_none() {
|
||||
while let Ok(frame) = self.rx_from_tunnel.try_recv() {
|
||||
if let Err(returned_frame) = self.manager.try_inject_inbound(frame) {
|
||||
stuck_frame = Some(returned_frame);
|
||||
break; // СТОП! Локальный сокет переполнен, давим на тормоза!
|
||||
stuck_frame = Some(returned_frame); // Возвращаем пакет в "заначку"
|
||||
break; // ТОРМОЗИМ чтение туннеля, пока канал не освободится
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Двигаем стейт-машину smoltcp
|
||||
let result = self.poll();
|
||||
self.manager.process_sockets(&mut self.socket_set);
|
||||
let result = self.poll();
|
||||
|
||||
if last_log.elapsed() >= Duration::from_secs(5) {
|
||||
self.manager.log_status(&self.socket_set);
|
||||
|
||||
Reference in New Issue
Block a user