From 229b8fca2ab2498fd7c034841830d24cc7f188eb Mon Sep 17 00:00:00 2001 From: Daniel Smith Date: Tue, 1 Jul 2014 12:37:35 -0700 Subject: [PATCH] Don't double-close the channel when etcd returns an error. --- pkg/controller/replication_controller.go | 7 +++---- pkg/util/fake_etcd_client.go | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/controller/replication_controller.go b/pkg/controller/replication_controller.go index 133e5aac21a..6847a63cbbd 100644 --- a/pkg/controller/replication_controller.go +++ b/pkg/controller/replication_controller.go @@ -105,11 +105,10 @@ func (rm *ReplicationManager) watchControllers() { }() go func() { defer util.HandleCrash() - defer func() { - close(watchChannel) - }() _, err := rm.etcdClient.Watch("/registry/controllers", 0, true, watchChannel, stop) - if err != etcd.ErrWatchStoppedByUser { + if err == etcd.ErrWatchStoppedByUser { + close(watchChannel) + } else { glog.Errorf("etcd.Watch stopped unexpectedly: %v (%#v)", err, err) } }() diff --git a/pkg/util/fake_etcd_client.go b/pkg/util/fake_etcd_client.go index 635d6236191..36a00752ad8 100644 --- a/pkg/util/fake_etcd_client.go +++ b/pkg/util/fake_etcd_client.go @@ -135,6 +135,8 @@ func (f *FakeEtcdClient) Watch(prefix string, waitIndex uint64, recursive bool, case <-stop: return nil, etcd.ErrWatchStoppedByUser case err := <-injectedError: + // Emulate etcd's behavior. + close(receiver) return nil, err } // Never get here.