From 366911db2fc5936851ea2be21b90837ad3eb30c3 Mon Sep 17 00:00:00 2001
From: "382673304@qq.com" <382673304@qq.com>
Date: Mon, 12 Oct 2020 12:41:07 +0800
Subject: [PATCH] fix: add consul destroy timeout and test file

---
 registry/consul/registry.go      | 26 ++++++++++++++++++++++++--
 registry/consul/registry_test.go | 16 ++++++++++++++++
 registry/consul/utils_test.go    |  4 ++++
 3 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/registry/consul/registry.go b/registry/consul/registry.go
index 7f237a1f2..33bf6d2c3 100644
--- a/registry/consul/registry.go
+++ b/registry/consul/registry.go
@@ -37,6 +37,7 @@ import (
 
 const (
 	registryConnDelay = 3
+	registryDestroyDefaultTimeout = time.Second
 )
 
 func init() {
@@ -55,6 +56,9 @@ type consulRegistry struct {
 	// Done field represents whether
 	// consul registry is closed.
 	done chan struct{}
+
+	// time wait when destroy
+	timeOut time.Duration
 }
 
 func newConsulRegistry(url *common.URL) (registry.Registry, error) {
@@ -68,6 +72,7 @@ func newConsulRegistry(url *common.URL) (registry.Registry, error) {
 		URL:    url,
 		client: client,
 		done:   make(chan struct{}),
+		timeOut: registryDestroyDefaultTimeout,
 	}
 
 	return r, nil
@@ -188,8 +193,25 @@ func (r *consulRegistry) IsAvailable() bool {
 // Destroy consul registry center
 func (r *consulRegistry) Destroy() {
 	if r.URL != nil{
-		if err := r.UnRegister(*r.URL); err != nil{
-			logger.Errorf("consul registry unregister with err: %s", err.Error())
+		done := make(chan struct{}, 1)
+		ticker := time.NewTicker(r.timeOut)
+		go func(){
+			defer func(){
+				if e := recover(); e != nil{
+					logger.Errorf("consulRegistry destory with panic: %v", e)
+				}
+				done <- struct{}{}
+			}()
+			if err := r.UnRegister(*r.URL); err != nil{
+				logger.Errorf("consul registry unregister with err: %s", err.Error())
+			}
+		}()
+		select {
+		case <- done:
+			logger.Infof("consulRegistry unregister done")
+		case <- ticker.C:
+			logger.Errorf("consul unregister timeout")
+			ticker.Stop()
 		}
 	}
 	close(r.done)
diff --git a/registry/consul/registry_test.go b/registry/consul/registry_test.go
index 94718f5ab..bc4fd400e 100644
--- a/registry/consul/registry_test.go
+++ b/registry/consul/registry_test.go
@@ -55,3 +55,19 @@ func (suite *consulRegistryTestSuite) testSubscribe() {
 	assert.NoError(suite.t, err)
 	suite.listener = listener
 }
+
+func (suite *consulRegistryTestSuite) testDestroy(){
+	consumerRegistryUrl := newConsumerRegistryUrl(registryHost, registryPort)
+	consumerRegistry, _ := newConsulRegistry(consumerRegistryUrl)
+	consulRegistryImp := consumerRegistry.(*consulRegistry)
+	assert.True(suite.t, consulRegistryImp.IsAvailable())
+	consulRegistryImp.Destroy()
+	assert.False(suite.t, consulRegistryImp.IsAvailable())
+
+	consumerRegistry, _ = newConsulRegistry(consumerRegistryUrl)
+	consulRegistryImp = consumerRegistry.(*consulRegistry)
+	consulRegistryImp.URL = nil
+	assert.True(suite.t, consulRegistryImp.IsAvailable())
+	consulRegistryImp.Destroy()
+	assert.False(suite.t, consulRegistryImp.IsAvailable())
+}
diff --git a/registry/consul/utils_test.go b/registry/consul/utils_test.go
index 939352dc0..819feb291 100644
--- a/registry/consul/utils_test.go
+++ b/registry/consul/utils_test.go
@@ -163,6 +163,7 @@ func test1(t *testing.T) {
 	suite.testListener(remoting.EventTypeAdd)
 	suite.testUnregister()
 	suite.testListener(remoting.EventTypeDel)
+	suite.testDestroy()
 }
 
 // subscribe -> register -> unregister
@@ -183,8 +184,11 @@ func test2(t *testing.T) {
 	suite.testListener(remoting.EventTypeAdd)
 	suite.testUnregister()
 	suite.testListener(remoting.EventTypeDel)
+	suite.testDestroy()
 }
 
+
+
 func TestConsulRegistry(t *testing.T) {
 	t.Run("test1", test1)
 	t.Run("test2", test2)
-- 
GitLab