From 898fce9303f11ce7dbf551258d443c30da03f54a Mon Sep 17 00:00:00 2001 From: "scott.wang" <sxllwx@github.com> Date: Wed, 31 Jul 2019 18:21:14 +0800 Subject: [PATCH] ADD RACE for etcd test --- registry/etcdv3/registry.go | 2 +- registry/etcdv3/registry_test.go | 4 +++- remoting/etcdv3/client.go | 21 ++++++++++++++++++--- remoting/etcdv3/client_test.go | 5 +++-- remoting/etcdv3/facede_test.go | 4 ++-- remoting/etcdv3/listener_test.go | 25 ++++++++++++++++--------- 6 files changed, 43 insertions(+), 18 deletions(-) diff --git a/registry/etcdv3/registry.go b/registry/etcdv3/registry.go index 24f2858e0..89dbe3135 100644 --- a/registry/etcdv3/registry.go +++ b/registry/etcdv3/registry.go @@ -157,9 +157,9 @@ func (r *etcdV3Registry) stop() { // close current client r.client.Close() - r.client = nil r.cltLock.Lock() + r.client = nil r.services = nil r.cltLock.Unlock() } diff --git a/registry/etcdv3/registry_test.go b/registry/etcdv3/registry_test.go index bc781200e..9391e5307 100644 --- a/registry/etcdv3/registry_test.go +++ b/registry/etcdv3/registry_test.go @@ -28,7 +28,9 @@ func initRegistry(t *testing.T) *etcdV3Registry { t.Fatal(err) } - return reg.(*etcdV3Registry) + out := reg.(*etcdV3Registry) + out.client.CleanKV() + return out } func Test_Register(t *testing.T) { diff --git a/remoting/etcdv3/client.go b/remoting/etcdv3/client.go index 4cac0c8ae..dbc77a2f0 100644 --- a/remoting/etcdv3/client.go +++ b/remoting/etcdv3/client.go @@ -157,10 +157,8 @@ func (c *Client) clean() { // cancel ctx for raw client c.cancel() - // clean ctx cancel raw client + // clean raw client c.rawClient = nil - c.ctx = nil - c.cancel = nil } func (c *Client) stop() bool { @@ -290,6 +288,23 @@ func (c *Client) get(k string) (string, error) { return string(resp.Kvs[0].Value), nil } +func (c *Client) CleanKV()error{ + + c.lock.RLock() + defer c.lock.RUnlock() + + if c.rawClient == nil { + return ErrNilETCDV3Client + } + + _, err := c.rawClient.Delete(c.ctx, "", clientv3.WithPrefix()) + if err != nil { + return err + } + + return nil +} + func (c *Client) getChildren(k string) ([]string, []string, error) { c.lock.RLock() diff --git a/remoting/etcdv3/client_test.go b/remoting/etcdv3/client_test.go index 848aefce6..8646adf26 100644 --- a/remoting/etcdv3/client_test.go +++ b/remoting/etcdv3/client_test.go @@ -55,6 +55,7 @@ func initClient(t *testing.T) *Client { if err != nil { t.Fatal(err) } + c.CleanKV() return c } @@ -79,7 +80,7 @@ func TestClient_Create(t *testing.T) { tests := tests c := initClient(t) - c.Close() + defer c.Close() for _, tc := range tests { @@ -110,7 +111,7 @@ func TestClient_Delete(t *testing.T) { tests := tests c := initClient(t) - c.Close() + defer c.Close() for _, tc := range tests { diff --git a/remoting/etcdv3/facede_test.go b/remoting/etcdv3/facede_test.go index ce0bfdc3c..590d30dc2 100644 --- a/remoting/etcdv3/facede_test.go +++ b/remoting/etcdv3/facede_test.go @@ -56,14 +56,14 @@ func (r *mockFacade) IsAvailable() bool { func Test_Fascade(t *testing.T) { c := initClient(t) - defer c.Close() - url, err := common.NewURL(context.Background(), "mock://127.0.0.1") + url, err := common.NewURL(context.Background(), "mock://127.0.0.1:2379") if err != nil { t.Fatal(err) } mock := &mockFacade{client: c, URL: &url} go HandleClientRestart(mock) + c.Close() time.Sleep(2 * time.Second) } diff --git a/remoting/etcdv3/listener_test.go b/remoting/etcdv3/listener_test.go index 57a2b3445..22f8b7088 100644 --- a/remoting/etcdv3/listener_test.go +++ b/remoting/etcdv3/listener_test.go @@ -2,12 +2,12 @@ package etcdv3 import ( "testing" + "time" "github.com/apache/dubbo-go/remoting" "github.com/stretchr/testify/assert" ) - var changedData = ` dubbo.consumer.request_timeout=3s dubbo.consumer.connect_timeout=5s @@ -29,10 +29,11 @@ var changedData = ` dubbo.service.com.ikurento.user.UserProvider.warmup=100 dubbo.service.com.ikurento.user.UserProvider.cluster=failover ` + func TestListener(t *testing.T) { - var tests = []struct{ - input struct{ + var tests = []struct { + input struct { k string v string } @@ -47,31 +48,37 @@ func TestListener(t *testing.T) { defer c.Close() listener := NewEventListener(c) - dataListener := &mockDataListener{client: c, changedData: changedData} + dataListener := &mockDataListener{client: c, changedData: changedData, rc: make(chan remoting.Event)} listener.ListenServiceEvent("/dubbo", dataListener) - - for _, tc := range tests{ + // NOTICE: direct listen will lose create msg + time.Sleep(time.Second) + for _, tc := range tests { k := tc.input.k v := tc.input.v - if err := c.Create(k, v); err != nil{ + if err := c.Create(k, v); err != nil { t.Fatal(err) } + } - assert.Equal(t, changedData, dataListener.eventList[0].Content) + msg := <-dataListener.rc + assert.Equal(t, changedData, msg.Content) + } type mockDataListener struct { eventList []remoting.Event client *Client changedData string + + rc chan remoting.Event } func (m *mockDataListener) DataChange(eventType remoting.Event) bool { m.eventList = append(m.eventList, eventType) if eventType.Content == m.changedData { - //m.client.Close() + m.rc <- eventType } return true } -- GitLab