From 4c2942f9f948d74795d201ac2153d50d84c61cf9 Mon Sep 17 00:00:00 2001 From: TANABE Ken-ichi Date: Wed, 22 Jan 2014 19:42:07 +0900 Subject: [PATCH] fix(mod/lock): Use dedicated channel to shutdown goroutine properly If closeChan is available and stopWatchChan was closed by defer select selects a single channel randomly. This causes a panic sending to closed channel. --- mod/lock/v2/acquire_handler.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/lock/v2/acquire_handler.go b/mod/lock/v2/acquire_handler.go index 1fd6aeadf..fdb33621d 100644 --- a/mod/lock/v2/acquire_handler.go +++ b/mod/lock/v2/acquire_handler.go @@ -146,14 +146,17 @@ func (h *handler) ttlKeepAlive(k string, value string, ttl int, stopChan chan bo func (h *handler) watch(keypath string, index int, closeChan <- chan bool) error { // Wrap close chan so we can pass it to Client.Watch(). stopWatchChan := make(chan bool) + stopWrapChan := make(chan bool) go func() { select { case <- closeChan: stopWatchChan <- true + case <- stopWrapChan: + stopWatchChan <- true case <- stopWatchChan: } }() - defer close(stopWatchChan) + defer close(stopWrapChan) for { // Read all nodes for the lock.