fix(server): 单台服务器注册失败不再拖垮整个 P2P 栈
问题:data_handle_task_connected 的重连循环中,注册被拒绝 (ResponseMessage::Error)、返回非注册消息、或虚拟网络发生变化时 break 后会调用 task_group.stop(),把包括其他健康服务器连接在内的 整个任务组全部停掉。 修复: - 注册被拒绝/返回错误消息:与连接失败一致,退避 5 秒后重试, 仅影响本服务器的重连。 - 虚拟网络发生变化:只结束本服务器的数据任务,不再 stop 整个任务组。 注:重连循环依赖真实服务器连接,未做端到端测试;全部既有单测通过。
This commit is contained in:
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user