From 7a17cab2ac0ca6458bb1368600a4611e9e233f9d Mon Sep 17 00:00:00 2001 From: CodingSinger <ooczzoo@gmail.com> Date: Mon, 23 Mar 2020 15:54:05 +0800 Subject: [PATCH] add mutex when use subscribed map --- registry/zookeeper/listener.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go index 6bb8a932d..5f398047a 100644 --- a/registry/zookeeper/listener.go +++ b/registry/zookeeper/listener.go @@ -39,6 +39,8 @@ import ( type RegistryDataListener struct { subscribed map[*common.URL]config_center.ConfigurationListener listener config_center.ConfigurationListener + mutex sync.Mutex + closed bool } // NewRegistryDataListener ... @@ -49,6 +51,11 @@ func NewRegistryDataListener() *RegistryDataListener { // SubscribeURL is used to set a watch listener for url func (l *RegistryDataListener) SubscribeURL(url *common.URL, listener config_center.ConfigurationListener) { + l.mutex.Lock() + defer l.mutex.Unlock() + if l.closed { + return + } l.subscribed[url] = listener } @@ -66,6 +73,11 @@ func (l *RegistryDataListener) DataChange(eventType remoting.Event) bool { logger.Errorf("Listen NewURL(r{%s}) = error{%v} eventType.Path={%v}", url, err, eventType.Path) return false } + l.mutex.Lock() + defer l.mutex.Unlock() + if l.closed { + return false + } for url, listener := range l.subscribed { if serviceURL.URLEqual(*url) { listener.Process( @@ -82,6 +94,8 @@ func (l *RegistryDataListener) DataChange(eventType remoting.Event) bool { } func (l *RegistryDataListener) Close() { + l.mutex.Lock() + defer l.mutex.Unlock() for _, listener := range l.subscribed { listener.(*RegistryConfigurationListener).Close() } -- GitLab