From ebb559af59faa0421b617259afb90f8d9fa00cd6 Mon Sep 17 00:00:00 2001 From: johncming Date: Sat, 23 Mar 2019 10:36:37 +0800 Subject: [PATCH] clientv3/ordering: adjust violation count. --- clientv3/client.go | 12 +++++++----- clientv3/ordering/util.go | 7 ++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/clientv3/client.go b/clientv3/client.go index 445ecfeb1eb..f078f6f8eeb 100644 --- a/clientv3/client.go +++ b/clientv3/client.go @@ -79,7 +79,7 @@ type Client struct { creds *credentials.TransportCredentials balancer balancer.Balancer resolverGroup *endpoint.ResolverGroup - mu *sync.Mutex + mu *sync.RWMutex ctx context.Context cancel context.CancelFunc @@ -143,11 +143,13 @@ func (c *Client) Close() error { func (c *Client) Ctx() context.Context { return c.ctx } // Endpoints lists the registered endpoints for the client. -func (c *Client) Endpoints() (eps []string) { +func (c *Client) Endpoints() []string { // copy the slice; protect original endpoints from being changed - eps = make([]string, len(c.cfg.Endpoints)) + c.mu.RLock() + defer c.mu.RUnlock() + eps := make([]string, len(c.cfg.Endpoints)) copy(eps, c.cfg.Endpoints) - return + return eps } // SetEndpoints updates client's endpoints. @@ -442,7 +444,7 @@ func newClient(cfg *Config) (*Client, error) { creds: creds, ctx: ctx, cancel: cancel, - mu: new(sync.Mutex), + mu: new(sync.RWMutex), callOpts: defaultCallOpts, } diff --git a/clientv3/ordering/util.go b/clientv3/ordering/util.go index f08740cb462..811fb5eb530 100644 --- a/clientv3/ordering/util.go +++ b/clientv3/ordering/util.go @@ -29,8 +29,13 @@ var ErrNoGreaterRev = errors.New("etcdclient: no cluster members have a revision func NewOrderViolationSwitchEndpointClosure(c clientv3.Client) OrderViolationFunc { var mu sync.Mutex violationCount := 0 + prev := 0 return func(op clientv3.Op, resp clientv3.OpResponse, prevRev int64) error { - if violationCount > len(c.Endpoints()) { + if prev != len(c.Endpoints()) { + prev = len(c.Endpoints()) + violationCount = 0 + } + if violationCount >= len(c.Endpoints()) { return ErrNoGreaterRev } mu.Lock()