From ebf3cc64567d0755fe3c800804c2f2c0840bc605 Mon Sep 17 00:00:00 2001 From: shen <zhangqi1@cmiot.chinamobile.com> Date: Fri, 4 Sep 2020 13:57:31 +0800 Subject: [PATCH] concurrency problem fixed --- registry/consul/service_discovery.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/registry/consul/service_discovery.go b/registry/consul/service_discovery.go index 5767a2c81..ae2233d59 100644 --- a/registry/consul/service_discovery.go +++ b/registry/consul/service_discovery.go @@ -74,7 +74,6 @@ func newConsulServiceDiscovery(name string) (registry.ServiceDiscovery, error) { return &consulServiceDiscovery{ address: remoteConfig.Address, descriptor: descriptor, - ttl: make(map[string]chan struct{}), }, nil } @@ -90,7 +89,7 @@ type consulServiceDiscovery struct { tag string tags []string address string - ttl map[string]chan struct{} + ttl sync.Map *consul.Config } @@ -115,10 +114,11 @@ func (csd *consulServiceDiscovery) String() string { func (csd *consulServiceDiscovery) Destroy() error { csd.consulClient = nil - for _, t := range csd.ttl { - close(t) - } - csd.ttl = nil + csd.ttl.Range(func(key, t interface{}) bool { + close(t.(chan struct{})) + csd.ttl.Delete(key) + return true + }) return nil } @@ -137,7 +137,7 @@ func (csd *consulServiceDiscovery) registerTtl(instance registry.ServiceInstance checkID := buildID(instance) stopChan := make(chan struct{}) - csd.ttl[buildID(instance)] = stopChan + csd.ttl.LoadOrStore(buildID(instance), stopChan) period := time.Duration(csd.checkPassInterval/8) * time.Millisecond timer := time.NewTimer(period) @@ -177,13 +177,14 @@ func (csd *consulServiceDiscovery) Unregister(instance registry.ServiceInstance) logger.Errorf("unregister service instance %s,error: %v", instance.GetId(), err) return err } - stopChanel, ok := csd.ttl[buildID(instance)] + + stopChanel, ok := csd.ttl.Load(buildID(instance)) if !ok { logger.Warnf("ttl for service instance %s didn't exist", instance.GetId()) return nil } - close(stopChanel) - delete(csd.ttl, buildID(instance)) + close(stopChanel.(chan struct{})) + csd.ttl.Delete(buildID(instance)) return nil } @@ -404,7 +405,7 @@ func (csd *consulServiceDiscovery) buildRegisterInstance(instance registry.Servi func (csd *consulServiceDiscovery) buildCheck(instance registry.ServiceInstance) consul.AgentServiceCheck { deregister, ok := instance.GetMetadata()[constant.DEREGISTER_AFTER] - if !ok || deregister == "" { + if !ok || len(deregister) == 0 { deregister = constant.DEFAULT_DEREGISTER_TIME } return consul.AgentServiceCheck{ -- GitLab