From a188a1e150ecc917d85631f9e1308712ff55bd5d Mon Sep 17 00:00:00 2001
From: Hao Duan <duanhao0814@gmail.com>
Date: Wed, 13 May 2020 17:06:19 +0800
Subject: [PATCH] ethstats: stop report ticker in each loop cycle #21070
 (#21071)

Co-authored-by: Hao Duan <duan.hao@hyperchain.cn>
---
 ethstats/ethstats.go | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go
index defca45c8..6e1aad693 100644
--- a/ethstats/ethstats.go
+++ b/ethstats/ethstats.go
@@ -154,7 +154,7 @@ func (s *Service) loop() {
 	txSub := txpool.SubscribeNewTxsEvent(txEventCh)
 	defer txSub.Unsubscribe()
 
-	// Start a goroutine that exhausts the subsciptions to avoid events piling up
+	// Start a goroutine that exhausts the subscriptions to avoid events piling up
 	var (
 		quitCh = make(chan struct{})
 		headCh = make(chan *types.Block, 1)
@@ -194,16 +194,17 @@ func (s *Service) loop() {
 		}
 		close(quitCh)
 	}()
+
+	// Resolve the URL, defaulting to TLS, but falling back to none too
+	path := fmt.Sprintf("%s/api", s.host)
+	urls := []string{path}
+
+	// url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779)
+	if !strings.Contains(path, "://") {
+		urls = []string{"wss://" + path, "ws://" + path}
+	}
 	// Loop reporting until termination
 	for {
-		// Resolve the URL, defaulting to TLS, but falling back to none too
-		path := fmt.Sprintf("%s/api", s.host)
-		urls := []string{path}
-
-		// url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779)
-		if !strings.Contains(path, "://") {
-			urls = []string{"wss://" + path, "ws://" + path}
-		}
 		// Establish a websocket connection to the server on any supported URL
 		var (
 			conn *websocket.Conn
@@ -240,11 +241,12 @@ func (s *Service) loop() {
 		}
 		// Keep sending status updates until the connection breaks
 		fullReport := time.NewTicker(15 * time.Second)
-		defer fullReport.Stop()
 
 		for err == nil {
 			select {
 			case <-quitCh:
+				fullReport.Stop()
+				// Make sure the connection is closed
 				conn.Close()
 				return
 
@@ -269,6 +271,7 @@ func (s *Service) loop() {
 				}
 			}
 		}
+		fullReport.Stop()
 		// Make sure the connection is closed
 		conn.Close()
 	}
-- 
GitLab