fix: websocket race-condition and firmware upload
This commit is contained in:
@@ -26,6 +26,7 @@ type WebSocketServer struct {
|
||||
sporeClients map[string]*client.SporeClient
|
||||
clients map[*websocket.Conn]bool
|
||||
mutex sync.RWMutex
|
||||
writeMutex sync.Mutex // Mutex to serialize writes to WebSocket connections
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
@@ -214,8 +215,11 @@ func (wss *WebSocketServer) broadcastClusterUpdate() {
|
||||
"prep_time": broadcastTime.Sub(startTime),
|
||||
}).Debug("Broadcasting cluster update to WebSocket clients")
|
||||
|
||||
// Send to all clients
|
||||
// Send to all clients with write synchronization
|
||||
var failedClients int
|
||||
wss.writeMutex.Lock()
|
||||
defer wss.writeMutex.Unlock()
|
||||
|
||||
for _, client := range clients {
|
||||
client.SetWriteDeadline(time.Now().Add(5 * time.Second))
|
||||
if err := client.WriteMessage(websocket.TextMessage, data); err != nil {
|
||||
@@ -224,7 +228,7 @@ func (wss *WebSocketServer) broadcastClusterUpdate() {
|
||||
}
|
||||
}
|
||||
|
||||
totalTime := time.Now().Sub(startTime)
|
||||
totalTime := time.Since(startTime)
|
||||
wss.logger.WithFields(log.Fields{
|
||||
"clients": len(clients),
|
||||
"failed_clients": failedClients,
|
||||
@@ -263,6 +267,10 @@ func (wss *WebSocketServer) broadcastNodeDiscovery(nodeIP, action string) {
|
||||
return
|
||||
}
|
||||
|
||||
// Send to all clients with write synchronization
|
||||
wss.writeMutex.Lock()
|
||||
defer wss.writeMutex.Unlock()
|
||||
|
||||
for _, client := range clients {
|
||||
client.SetWriteDeadline(time.Now().Add(5 * time.Second))
|
||||
if err := client.WriteMessage(websocket.TextMessage, data); err != nil {
|
||||
@@ -302,7 +310,7 @@ func (wss *WebSocketServer) updateLocalNodesWithAPI(apiMembers []client.ClusterM
|
||||
wss.logger.WithField("members", len(apiMembers)).Debug("Updating local nodes with API data")
|
||||
|
||||
for _, member := range apiMembers {
|
||||
if member.Labels != nil && len(member.Labels) > 0 {
|
||||
if len(member.Labels) > 0 {
|
||||
wss.logger.WithFields(log.Fields{
|
||||
"ip": member.IP,
|
||||
"labels": member.Labels,
|
||||
|
||||
Reference in New Issue
Block a user