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