From 5e9362d7209f4934ba6a3c7bfe1325d67cbf45aa Mon Sep 17 00:00:00 2001
From: "vito.he" <hxmhlt@163.com>
Date: Sun, 16 Feb 2020 16:07:48 +0800
Subject: [PATCH] Mod:cancel listener dir when zkpath end of providers/ &
 consumers/

---
 common/constant/default.go     |  1 +
 config/config_loader.go        | 12 ++++++------
 config/config_loader_test.go   | 24 ++++++++++++------------
 remoting/zookeeper/listener.go | 14 ++++++++++----
 4 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/common/constant/default.go b/common/constant/default.go
index 992fc3274..8ed645e84 100644
--- a/common/constant/default.go
+++ b/common/constant/default.go
@@ -66,6 +66,7 @@ const (
 	DYNAMIC_CONFIGURATORS_CATEGORY     = "dynamicconfigurators"
 	APP_DYNAMIC_CONFIGURATORS_CATEGORY = "appdynamicconfigurators"
 	PROVIDER_CATEGORY                  = "providers"
+	CONSUMER_CATEGORY                  = "consumers"
 )
 
 const (
diff --git a/config/config_loader.go b/config/config_loader.go
index 875d1f6dd..d6be98b67 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -195,20 +195,20 @@ func GetApplicationConfig() *ApplicationConfig {
 
 // GetProviderConfig find the provider config
 // if not found, create new one
-func GetProviderConfig() ProviderConfig {
+func GetProviderConfig() *ProviderConfig {
 	if providerConfig == nil {
 		logger.Warnf("providerConfig is nil!")
-		return ProviderConfig{}
+		return &ProviderConfig{}
 	}
-	return *providerConfig
+	return providerConfig
 }
 
 // GetConsumerConfig find the consumer config
 // if not found, create new one
-func GetConsumerConfig() ConsumerConfig {
+func GetConsumerConfig() *ConsumerConfig {
 	if consumerConfig == nil {
 		logger.Warnf("consumerConfig is nil!")
-		return ConsumerConfig{}
+		return &ConsumerConfig{}
 	}
-	return *consumerConfig
+	return consumerConfig
 }
diff --git a/config/config_loader_test.go b/config/config_loader_test.go
index 498f82678..a25cccec4 100644
--- a/config/config_loader_test.go
+++ b/config/config_loader_test.go
@@ -43,9 +43,9 @@ func TestConfigLoader(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	assert.NoError(t, err)
@@ -53,9 +53,9 @@ func TestConfigLoader(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 	assert.Equal(t, "soa.com.ikurento.user.UserProvider", GetConsumerConfig().References["UserProvider"].Params["serviceid"])
 }
 
@@ -155,9 +155,9 @@ func TestConfigLoaderWithConfigCenter(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	configCenterRefreshConsumer()
@@ -167,9 +167,9 @@ func TestConfigLoaderWithConfigCenter(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 
 	assert.Equal(t, "BDTService", consumerConfig.ApplicationConfig.Name)
 	assert.Equal(t, "127.0.0.1:2181", consumerConfig.Registries["hangzhouzk"].Address)
@@ -208,9 +208,9 @@ func TestConfigLoaderWithConfigCenterSingleRegistry(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	checkApplicationName(consumerConfig.ApplicationConfig)
@@ -224,9 +224,9 @@ func TestConfigLoaderWithConfigCenterSingleRegistry(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 
 	assert.Equal(t, "BDTService", consumerConfig.ApplicationConfig.Name)
 	assert.Equal(t, "mock://127.0.0.1:2182", consumerConfig.Registries[constant.DEFAULT_KEY].Address)
diff --git a/remoting/zookeeper/listener.go b/remoting/zookeeper/listener.go
index 4493c06dc..9032e1bd0 100644
--- a/remoting/zookeeper/listener.go
+++ b/remoting/zookeeper/listener.go
@@ -18,7 +18,9 @@
 package zookeeper
 
 import (
+	"github.com/apache/dubbo-go/common/constant"
 	"path"
+	"strings"
 	"sync"
 	"time"
 )
@@ -256,10 +258,14 @@ func (l *ZkEventListener) listenDirEvent(zkPath string, listener remoting.DataLi
 			}(dubboPath, listener)
 
 			//listen sub path recursive
-			go func(zkPath string, listener remoting.DataListener) {
-				l.listenDirEvent(zkPath, listener)
-				logger.Warnf("listenDirEvent(zkPath{%s}) goroutine exit now", zkPath)
-			}(dubboPath, listener)
+			//if zkPath is end of "providers/ & consumers/" we do not listen children dir
+			if strings.LastIndex(zkPath, constant.PROVIDER_CATEGORY) == -1 &&
+				strings.LastIndex(zkPath, constant.CONSUMER_CATEGORY) == -1 {
+				go func(zkPath string, listener remoting.DataListener) {
+					l.listenDirEvent(zkPath, listener)
+					logger.Warnf("listenDirEvent(zkPath{%s}) goroutine exit now", zkPath)
+				}(dubboPath, listener)
+			}
 		}
 		select {
 		case zkEvent = <-childEventCh:
-- 
GitLab