From ab252a579d249b44ba0180bd6b5a8a2393675ae9 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 18 Apr 2015 14:49:27 -0400 Subject: [PATCH] use channel to stop refresh goroutine --- node.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/node.go b/node.go index 62c582fb..16b64f2b 100644 --- a/node.go +++ b/node.go @@ -14,9 +14,9 @@ type Node struct { Host Host aliases []Host - cluster *Cluster - pool *Pool - refreshTicker *time.Ticker + cluster *Cluster + pool *Pool + refreshDoneChan chan bool mu sync.RWMutex closed bool @@ -25,14 +25,14 @@ type Node struct { func newNode(id string, aliases []Host, cluster *Cluster, pool *Pool) *Node { node := &Node{ - ID: id, - Host: aliases[0], - aliases: aliases, - cluster: cluster, - pool: pool, - health: 100, + ID: id, + Host: aliases[0], + aliases: aliases, + cluster: cluster, + pool: pool, + health: 100, + refreshDoneChan: make(chan bool), } - // Start node refresh loop refreshInterval := cluster.opts.NodeRefreshInterval if refreshInterval <= 0 { @@ -41,9 +41,15 @@ func newNode(id string, aliases []Host, cluster *Cluster, pool *Pool) *Node { } go func() { - node.refreshTicker = time.NewTicker(refreshInterval) - for _ = range node.refreshTicker.C { - node.Refresh() + + refreshTicker := time.NewTicker(refreshInterval) + for { + select { + case <-refreshTicker.C: + node.Refresh() + case <-node.refreshDoneChan: + return + } } }() @@ -73,7 +79,7 @@ func (n *Node) Close(optArgs ...CloseOpts) error { } } - n.refreshTicker.Stop() + n.refreshDoneChan <- true if n.pool != nil { n.pool.Close() }