diff --git a/registry/consul/registry.go b/registry/consul/registry.go index 7f237a1f24330ac3c16d3ead392e0dbcc640d706..33bf6d2c3897b0e4c78d36198f09446d59f94a31 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 94718f5ab657c198882f065a50e5d5a2c9d4bc6f..bc4fd400eba82b5f644426a922cf0018cf862d72 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..819feb2916a958bd99f78d7ff33f7568b212c3bf 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)