feat: update to new cluster protocol
This commit is contained in:
@@ -49,6 +49,9 @@ func (nd *NodeDiscovery) Shutdown(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// MessageHandler processes a specific UDP message type
|
||||
type MessageHandler func(payload string, remoteAddr *net.UDPAddr)
|
||||
|
||||
// handleUDPMessage processes incoming UDP messages
|
||||
func (nd *NodeDiscovery) handleUDPMessage(message string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithFields(log.Fields{
|
||||
@@ -58,13 +61,39 @@ func (nd *NodeDiscovery) handleUDPMessage(message string, remoteAddr *net.UDPAdd
|
||||
|
||||
message = strings.TrimSpace(message)
|
||||
|
||||
if strings.HasPrefix(message, "CLUSTER_HEARTBEAT:") {
|
||||
hostname := strings.TrimPrefix(message, "CLUSTER_HEARTBEAT:")
|
||||
nd.updateNodeFromHeartbeat(remoteAddr.IP.String(), remoteAddr.Port, hostname)
|
||||
} else if strings.HasPrefix(message, "NODE_UPDATE:") {
|
||||
nd.handleNodeUpdate(remoteAddr.IP.String(), message)
|
||||
} else if !strings.HasPrefix(message, "RAW:") {
|
||||
nd.logger.WithField("message", message).Debug("Received unknown UDP message")
|
||||
// Extract topic by splitting on first ":"
|
||||
parts := strings.SplitN(message, ":", 2)
|
||||
if len(parts) < 2 {
|
||||
nd.logger.WithField("message", message).Debug("Invalid message format - missing ':' separator")
|
||||
return
|
||||
}
|
||||
|
||||
topic := parts[0]
|
||||
payload := parts[1]
|
||||
|
||||
// Handler map for different message types
|
||||
handlers := map[string]MessageHandler{
|
||||
"cluster/heartbeat": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.updateNodeFromHeartbeat(remoteAddr.IP.String(), remoteAddr.Port, payload)
|
||||
},
|
||||
"node/update": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
// Reconstruct full message for handleNodeUpdate which expects "node/update:hostname:{json}"
|
||||
fullMessage := "node/update:" + payload
|
||||
nd.handleNodeUpdate(remoteAddr.IP.String(), fullMessage)
|
||||
},
|
||||
"raw": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithField("message", "raw:"+payload).Debug("Received raw message")
|
||||
},
|
||||
"cluster/event": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithField("message", "cluster/event:"+payload).Debug("Received cluster/event message")
|
||||
},
|
||||
}
|
||||
|
||||
// Look up and execute handler
|
||||
if handler, exists := handlers[topic]; exists {
|
||||
handler(payload, remoteAddr)
|
||||
} else {
|
||||
nd.logger.WithField("topic", topic).Debug("Received unknown UDP message type")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,9 +167,9 @@ func (nd *NodeDiscovery) updateNodeFromHeartbeat(sourceIP string, sourcePort int
|
||||
}
|
||||
}
|
||||
|
||||
// handleNodeUpdate processes NODE_UPDATE messages
|
||||
// handleNodeUpdate processes NODE_UPDATE and node/update messages
|
||||
func (nd *NodeDiscovery) handleNodeUpdate(sourceIP, message string) {
|
||||
// Message format: "NODE_UPDATE:hostname:{json}"
|
||||
// Message format: "NODE_UPDATE:hostname:{json}" or "node/update:hostname:{json}"
|
||||
parts := strings.SplitN(message, ":", 3)
|
||||
if len(parts) < 3 {
|
||||
nd.logger.WithField("message", message).Warn("Invalid NODE_UPDATE message format")
|
||||
|
||||
Reference in New Issue
Block a user