Эх сурвалжийг харах

ethstats: fix reconnection issue, implement primus pings

Péter Szilágyi 5 жил өмнө
parent
commit
0fef66c739
1 өөрчлөгдсөн 19 нэмэгдсэн , 2 устгасан
  1. 19 2
      ethstats/ethstats.go

+ 19 - 2
ethstats/ethstats.go

@@ -280,8 +280,10 @@ func (s *Service) loop() {
 				}
 			}
 			fullReport.Stop()
-			// Make sure the connection is closed
+
+			// Close the current connection and establish a new one
 			conn.Close()
+			errTimer.Reset(0)
 		}
 	}
 }
@@ -296,8 +298,23 @@ func (s *Service) readLoop(conn *websocket.Conn) {
 
 	for {
 		// Retrieve the next generic network packet and bail out on error
+		var blob json.RawMessage
+		if err := conn.ReadJSON(&blob); err != nil {
+			log.Warn("Failed to retrieve stats server message", "err", err)
+			return
+		}
+		// If the network packet is a system ping, respond to it directly
+		var ping string
+		if err := json.Unmarshal(blob, &ping); err == nil && strings.HasPrefix(ping, "primus::ping::") {
+			if err := conn.WriteJSON(strings.Replace(ping, "ping", "pong", -1)); err != nil {
+				log.Warn("Failed to respond to system ping message", "err", err)
+				return
+			}
+			continue
+		}
+		// Not a system ping, try to decode an actual state message
 		var msg map[string][]interface{}
-		if err := conn.ReadJSON(&msg); err != nil {
+		if err := json.Unmarshal(blob, &msg); err != nil {
 			log.Warn("Failed to decode stats server message", "err", err)
 			return
 		}