fix(server): 单台服务器注册失败不再拖垮整个 P2P 栈

问题:data_handle_task_connected 的重连循环中,注册被拒绝
(ResponseMessage::Error)、返回非注册消息、或虚拟网络发生变化时
break 后会调用 task_group.stop(),把包括其他健康服务器连接在内的
整个任务组全部停掉。

修复:
- 注册被拒绝/返回错误消息:与连接失败一致,退避 5 秒后重试,
  仅影响本服务器的重连。
- 虚拟网络发生变化:只结束本服务器的数据任务,不再 stop 整个任务组。

注:重连循环依赖真实服务器连接,未做端到端测试;全部既有单测通过。
This commit is contained in:
lbl
2026-08-20 23:08:16 +08:00
parent 0a73bc3356
commit 2e77801adc
@@ -163,7 +163,6 @@ impl ServerTurnManager {
initial_response: NetworkAddr, initial_response: NetworkAddr,
) { ) {
let data_handler = ServerTurnInboundHandler::new(self.server_id, initial_response, config); let data_handler = ServerTurnInboundHandler::new(self.server_id, initial_response, config);
let task_group_ = task_group.clone();
let Some(mut receiver) = self.receiver.take() else { let Some(mut receiver) = self.receiver.take() else {
unreachable!() unreachable!()
}; };
@@ -188,7 +187,12 @@ impl ServerTurnManager {
|| reg.prefix_len != initial_response.prefix_len || reg.prefix_len != initial_response.prefix_len
|| reg.gateway != initial_response.gateway || reg.gateway != initial_response.gateway
{ {
log::error!("虚拟网络发生变化"); // 该服务器分配的虚拟网络与当前不一致,无法重连,
// 只结束本服务器的任务,不影响其他服务器
log::error!(
"服务器{}虚拟网络发生变化,放弃重连",
self.config.server_addr
);
break; break;
} }
// 保存服务器版本 // 保存服务器版本
@@ -197,12 +201,16 @@ impl ServerTurnManager {
} }
} }
ResponseMessage::Error(e) => { ResponseMessage::Error(e) => {
log::error!("注册失败 {e:?}"); // 单台服务器注册失败只影响本服务器的重连,
break; // 退避后重试,不能拖垮整个任务组
log::error!("注册失败 {e:?}5秒后重试");
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
continue;
} }
_ => { _ => {
log::error!("错误的注册消息"); log::error!("错误的注册消息5秒后重试");
break; tokio::time::sleep(std::time::Duration::from_secs(5)).await;
continue;
} }
} }
} }
@@ -217,7 +225,6 @@ impl ServerTurnManager {
} }
self.disconnect(); self.disconnect();
data_handler.handle_disconnected(); data_handler.handle_disconnected();
task_group_.stop();
}); });
} }