|
|
@@ -203,77 +203,86 @@ func (s *Service) loop() {
|
|
|
if !strings.Contains(path, "://") {
|
|
|
urls = []string{"wss://" + path, "ws://" + path}
|
|
|
}
|
|
|
+
|
|
|
+ errTimer := time.NewTimer(0)
|
|
|
+ defer errTimer.Stop()
|
|
|
// Loop reporting until termination
|
|
|
for {
|
|
|
- // Establish a websocket connection to the server on any supported URL
|
|
|
- var (
|
|
|
- conn *websocket.Conn
|
|
|
- err error
|
|
|
- )
|
|
|
- dialer := websocket.Dialer{HandshakeTimeout: 5 * time.Second}
|
|
|
- header := make(http.Header)
|
|
|
- header.Set("origin", "http://localhost")
|
|
|
- for _, url := range urls {
|
|
|
- conn, _, err = dialer.Dial(url, header)
|
|
|
- if err == nil {
|
|
|
- break
|
|
|
+ select {
|
|
|
+ case <-quitCh:
|
|
|
+ return
|
|
|
+ case <-errTimer.C:
|
|
|
+ // Establish a websocket connection to the server on any supported URL
|
|
|
+ var (
|
|
|
+ conn *websocket.Conn
|
|
|
+ err error
|
|
|
+ )
|
|
|
+ dialer := websocket.Dialer{HandshakeTimeout: 5 * time.Second}
|
|
|
+ header := make(http.Header)
|
|
|
+ header.Set("origin", "http://localhost")
|
|
|
+ for _, url := range urls {
|
|
|
+ conn, _, err = dialer.Dial(url, header)
|
|
|
+ if err == nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
- log.Warn("Stats server unreachable", "err", err)
|
|
|
- time.Sleep(10 * time.Second)
|
|
|
- continue
|
|
|
- }
|
|
|
- // Authenticate the client with the server
|
|
|
- if err = s.login(conn); err != nil {
|
|
|
- log.Warn("Stats login failed", "err", err)
|
|
|
- conn.Close()
|
|
|
- time.Sleep(10 * time.Second)
|
|
|
- continue
|
|
|
- }
|
|
|
- go s.readLoop(conn)
|
|
|
-
|
|
|
- // Send the initial stats so our node looks decent from the get go
|
|
|
- if err = s.report(conn); err != nil {
|
|
|
- log.Warn("Initial stats report failed", "err", err)
|
|
|
- conn.Close()
|
|
|
- continue
|
|
|
- }
|
|
|
- // Keep sending status updates until the connection breaks
|
|
|
- fullReport := time.NewTicker(15 * time.Second)
|
|
|
+ if err != nil {
|
|
|
+ log.Warn("Stats server unreachable", "err", err)
|
|
|
+ errTimer.Reset(10 * time.Second)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // Authenticate the client with the server
|
|
|
+ if err = s.login(conn); err != nil {
|
|
|
+ log.Warn("Stats login failed", "err", err)
|
|
|
+ conn.Close()
|
|
|
+ errTimer.Reset(10 * time.Second)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ go s.readLoop(conn)
|
|
|
|
|
|
- for err == nil {
|
|
|
- select {
|
|
|
- case <-quitCh:
|
|
|
- fullReport.Stop()
|
|
|
- // Make sure the connection is closed
|
|
|
+ // Send the initial stats so our node looks decent from the get go
|
|
|
+ if err = s.report(conn); err != nil {
|
|
|
+ log.Warn("Initial stats report failed", "err", err)
|
|
|
conn.Close()
|
|
|
- return
|
|
|
+ errTimer.Reset(0)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // Keep sending status updates until the connection breaks
|
|
|
+ fullReport := time.NewTicker(15 * time.Second)
|
|
|
|
|
|
- case <-fullReport.C:
|
|
|
- if err = s.report(conn); err != nil {
|
|
|
- log.Warn("Full stats report failed", "err", err)
|
|
|
- }
|
|
|
- case list := <-s.histCh:
|
|
|
- if err = s.reportHistory(conn, list); err != nil {
|
|
|
- log.Warn("Requested history report failed", "err", err)
|
|
|
- }
|
|
|
- case head := <-headCh:
|
|
|
- if err = s.reportBlock(conn, head); err != nil {
|
|
|
- log.Warn("Block stats report failed", "err", err)
|
|
|
- }
|
|
|
- if err = s.reportPending(conn); err != nil {
|
|
|
- log.Warn("Post-block transaction stats report failed", "err", err)
|
|
|
- }
|
|
|
- case <-txCh:
|
|
|
- if err = s.reportPending(conn); err != nil {
|
|
|
- log.Warn("Transaction stats report failed", "err", err)
|
|
|
+ for err == nil {
|
|
|
+ select {
|
|
|
+ case <-quitCh:
|
|
|
+ fullReport.Stop()
|
|
|
+ // Make sure the connection is closed
|
|
|
+ conn.Close()
|
|
|
+ return
|
|
|
+
|
|
|
+ case <-fullReport.C:
|
|
|
+ if err = s.report(conn); err != nil {
|
|
|
+ log.Warn("Full stats report failed", "err", err)
|
|
|
+ }
|
|
|
+ case list := <-s.histCh:
|
|
|
+ if err = s.reportHistory(conn, list); err != nil {
|
|
|
+ log.Warn("Requested history report failed", "err", err)
|
|
|
+ }
|
|
|
+ case head := <-headCh:
|
|
|
+ if err = s.reportBlock(conn, head); err != nil {
|
|
|
+ log.Warn("Block stats report failed", "err", err)
|
|
|
+ }
|
|
|
+ if err = s.reportPending(conn); err != nil {
|
|
|
+ log.Warn("Post-block transaction stats report failed", "err", err)
|
|
|
+ }
|
|
|
+ case <-txCh:
|
|
|
+ if err = s.reportPending(conn); err != nil {
|
|
|
+ log.Warn("Transaction stats report failed", "err", err)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ fullReport.Stop()
|
|
|
+ // Make sure the connection is closed
|
|
|
+ conn.Close()
|
|
|
}
|
|
|
- fullReport.Stop()
|
|
|
- // Make sure the connection is closed
|
|
|
- conn.Close()
|
|
|
}
|
|
|
}
|
|
|
|