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,
) {
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 {
unreachable!()
};
@@ -188,7 +187,12 @@ impl ServerTurnManager {
|| reg.prefix_len != initial_response.prefix_len
|| reg.gateway != initial_response.gateway
{
log::error!("虚拟网络发生变化");
// 该服务器分配的虚拟网络与当前不一致,无法重连,
// 只结束本服务器的任务,不影响其他服务器
log::error!(
"服务器{}虚拟网络发生变化,放弃重连",
self.config.server_addr
);
break;
}
// 保存服务器版本
@@ -197,12 +201,16 @@ impl ServerTurnManager {
}
}
ResponseMessage::Error(e) => {
log::error!("注册失败 {e:?}");
break;
// 单台服务器注册失败只影响本服务器的重连,
// 退避后重试,不能拖垮整个任务组
log::error!("注册失败 {e:?}5秒后重试");
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
continue;
}
_ => {
log::error!("错误的注册消息");
break;
log::error!("错误的注册消息5秒后重试");
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
continue;
}
}
}
@@ -217,7 +225,6 @@ impl ServerTurnManager {
}
self.disconnect();
data_handler.handle_disconnected();
task_group_.stop();
});
}