diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go index c25028d58f32f4028779fd6c050e60eef2bd7bd5..d81c7523c402184dc06692ecb42214ca666a61e3 100644 --- a/registry/zookeeper/listener.go +++ b/registry/zookeeper/listener.go @@ -74,11 +74,12 @@ type RegistryConfigurationListener struct { client *zk.ZookeeperClient registry *zkRegistry events chan *config_center.ConfigChangeEvent + isClosed bool } func NewRegistryConfigurationListener(client *zk.ZookeeperClient, reg *zkRegistry) *RegistryConfigurationListener { reg.wg.Add(1) - return &RegistryConfigurationListener{client: client, registry: reg, events: make(chan *config_center.ConfigChangeEvent, 32)} + return &RegistryConfigurationListener{client: client, registry: reg, events: make(chan *config_center.ConfigChangeEvent, 32), isClosed: false} } func (l *RegistryConfigurationListener) Process(configType *config_center.ConfigChangeEvent) { l.events <- configType @@ -114,6 +115,7 @@ func (l *RegistryConfigurationListener) Close() { * if the registry is not available, it means that the registry has been destroy * so we don't need to call Done(), or it will cause the negative count panic for registry.wg */ + l.isClosed = true l.registry.wg.Done() } } diff --git a/registry/zookeeper/registry.go b/registry/zookeeper/registry.go index 13fb6c751f8010f1e716e37541aa8ac59256288c..137aa5423a3990f38d0632998ee49b66a25d8ecf 100644 --- a/registry/zookeeper/registry.go +++ b/registry/zookeeper/registry.go @@ -453,6 +453,10 @@ func (r *zkRegistry) getListener(conf *common.URL) (*RegistryConfigurationListen ) r.listenerLock.Lock() + if r.configListener.isClosed { + return nil, perrors.New("configListener already been closed") + r.listenerLock.Unlock() + } zkListener = r.configListener r.listenerLock.Unlock() if r.listener == nil {