diff --git a/registry/consul/registry.go b/registry/consul/registry.go index c425c5ec20d36be02c00499340f13b13c9aa2655..b92e335fdb69f82210d2977789902eb6123201b8 100644 --- a/registry/consul/registry.go +++ b/registry/consul/registry.go @@ -36,7 +36,8 @@ import ( ) const ( - registryConnDelay = 3 + registryConnDelay = 3 + registryDestroyDefaultTimeout = time.Second * 3 ) func init() { @@ -187,5 +188,25 @@ func (r *consulRegistry) IsAvailable() bool { // Destroy consul registry center func (r *consulRegistry) Destroy() { + if r.URL != nil { + done := make(chan struct{}, 1) + 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 <-time.After(registryDestroyDefaultTimeout): + logger.Errorf("consul unregister timeout") + } + } close(r.done) } diff --git a/registry/consul/registry_test.go b/registry/consul/registry_test.go index 94718f5ab657c198882f065a50e5d5a2c9d4bc6f..b300f7536ddf35f2a4d062900b1f3e4eda33f25d 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 939352dc088faa2c32be8173d0aa6f4516dfe503..0e5bffe457b9e3317ff056c51e4f5a9633a429e6 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,6 +184,7 @@ func test2(t *testing.T) { suite.testListener(remoting.EventTypeAdd) suite.testUnregister() suite.testListener(remoting.EventTypeDel) + suite.testDestroy() } func TestConsulRegistry(t *testing.T) {