fix: tx-debug-udp 日志的写入以及发送日志调试

This commit is contained in:
2026-03-24 18:02:38 +08:00
parent 9503862eda
commit 97eb3163db
6 changed files with 570 additions and 98 deletions

View File

@@ -21,16 +21,22 @@ func WithUDPLogger(logger latencylog.Logger) UDPOption {
}
}
// WithUDPTXTimestampDebugLogger 为 UDP hub 注入 TX errqueue 调试日志器。
func WithUDPTXTimestampDebugLogger(logger transport.TXTimestampDebugLogger) UDPOption {
return func(hub *UDPHub) {
hub.txTimestampDebugLogger = logger
}
}
// UDPHub 管理通过 UDP 注册的 peer并负责在它们之间转发消息。
// 与 TCP Hub 不同UDPHub 使用单个 net.UDPConn 与所有 peer 通信,
// 通过维护 peerID -> UDPAddr 映射表来寻址。
type UDPHub struct {
mu sync.RWMutex
peers map[string]*net.UDPAddr // peerID -> 对端 UDP 地址
addrs map[string]string // addr.String() -> peerID用于反查
peers map[string]*net.UDPAddr
addrs map[string]string
conn *transport.UDPConn
logger latencylog.Logger
conn *transport.UDPConn
logger latencylog.Logger
txTimestampDebugLogger transport.TXTimestampDebugLogger
}
// NewUDPHub 创建一个新的 UDP 连接中心。
@@ -53,28 +59,27 @@ func NewUDPHub(conn *net.UDPConn, opts ...UDPOption) (*UDPHub, error) {
conn,
nil,
transport.WithUDPLogger(hub.logger, latencylog.NodeRoleServer, "hub"),
transport.WithUDPTXTimestampDebugLogger(hub.txTimestampDebugLogger),
)
if err != nil {
return nil, fmt.Errorf("server: create udp transport conn: %w", err)
}
hub.conn = udpConn
return hub, nil
}
// Serve 启动 UDP 接收主循环,持续读取消息并处理注册/转发。
// 此方法会阻塞,直到底层连接关闭或发生不可恢复的错误。
func (h *UDPHub) Serve() error {
return h.conn.ReceiveLoop(func(msg protocol.Message, addr *net.UDPAddr) error {
if err := h.handleMessage(msg, addr); err != nil {
log.Printf("udp hub: handle message from %s: %v", addr, err)
}
return nil // 不因为单条消息处理失败而退出主循环
return nil
})
}
// HasPeer 返回给定 ID 是否已注册到 hub。
// HasPeer 返回给定 ID 是否已注册到 hub。
func (h *UDPHub) HasPeer(peerID string) bool {
h.mu.RLock()
defer h.mu.RUnlock()
@@ -83,7 +88,6 @@ func (h *UDPHub) HasPeer(peerID string) bool {
return ok
}
// handleMessage 处理从指定地址收到的消息。
func (h *UDPHub) handleMessage(msg protocol.Message, addr *net.UDPAddr) error {
switch msg.Type {
case protocol.MessageTypeRegister:
@@ -101,7 +105,6 @@ func (h *UDPHub) handleMessage(msg protocol.Message, addr *net.UDPAddr) error {
}
}
// registerPeer 处理 peer 的注册请求。
func (h *UDPHub) registerPeer(msg protocol.Message, addr *net.UDPAddr) error {
peerID := msg.From
if peerID == "" {
@@ -111,9 +114,7 @@ func (h *UDPHub) registerPeer(msg protocol.Message, addr *net.UDPAddr) error {
h.mu.Lock()
defer h.mu.Unlock()
// 如果同一个 peerID 从新地址注册,更新地址映射(支持 peer 重启换端口)。
if existingAddr, exists := h.peers[peerID]; exists {
// 清理旧地址的反查映射
delete(h.addrs, existingAddr.String())
}
@@ -123,26 +124,20 @@ func (h *UDPHub) registerPeer(msg protocol.Message, addr *net.UDPAddr) error {
return nil
}
// forwardMessage 转发业务消息到目标 peer。
func (h *UDPHub) forwardMessage(msg protocol.Message, senderAddr *net.UDPAddr) error {
// 通过来源地址反查发送者 peerID
senderID := h.lookupPeerID(senderAddr)
if senderID == "" {
return h.sendErrorTo(senderAddr, msg.From, "not registered; send register first")
}
// server 覆盖 From不信任客户端自报身份
msg.From = senderID
// 查找目标 peer 地址
targetAddr := h.lookupAddr(msg.To)
if targetAddr == nil {
return h.sendErrorTo(senderAddr, senderID, fmt.Sprintf("unknown target: %s", msg.To))
}
// 转发消息
if err := h.conn.SendTo(msg, targetAddr); err != nil {
// 转发失败,通知发送方
_ = h.sendErrorTo(senderAddr, senderID, fmt.Sprintf("failed to forward to %s", msg.To))
return fmt.Errorf("forward to %s at %s: %w", msg.To, targetAddr, err)
}
@@ -166,7 +161,6 @@ func (h *UDPHub) lookupAddr(peerID string) *net.UDPAddr {
return h.peers[peerID]
}
// sendErrorTo 向指定地址发送错误消息。
func (h *UDPHub) sendErrorTo(addr *net.UDPAddr, to, message string) error {
if to == "" {
to = "unknown"