Browse Source

clientv3: use "pkg/logger"

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
Gyuho Lee 7 years ago
parent
commit
1f016f3b96
5 changed files with 32 additions and 117 deletions
  1. 1 1
      clientv3/client.go
  2. 9 9
      clientv3/health_balancer.go
  3. 18 52
      clientv3/logger.go
  4. 0 51
      clientv3/logger_test.go
  5. 4 4
      clientv3/retry.go

+ 1 - 1
clientv3/client.go

@@ -166,7 +166,7 @@ func (c *Client) autoSync() {
 			err := c.Sync(ctx)
 			err := c.Sync(ctx)
 			cancel()
 			cancel()
 			if err != nil && err != c.ctx.Err() {
 			if err != nil && err != c.ctx.Err() {
-				logger.Println("Auto sync endpoints failed:", err)
+				lg.Lvl(4).Infof("Auto sync endpoints failed: %v", err)
 			}
 			}
 		}
 		}
 	}
 	}

+ 9 - 9
clientv3/health_balancer.go

@@ -158,26 +158,26 @@ func (b *healthBalancer) pinned() string {
 
 
 func (b *healthBalancer) hostPortError(hostPort string, err error) {
 func (b *healthBalancer) hostPortError(hostPort string, err error) {
 	if b.endpoint(hostPort) == "" {
 	if b.endpoint(hostPort) == "" {
-		logger.Lvl(4).Infof("clientv3/balancer: %q is stale (skip marking as unhealthy on %q)", hostPort, err.Error())
+		lg.Lvl(4).Infof("clientv3/balancer: %q is stale (skip marking as unhealthy on %q)", hostPort, err.Error())
 		return
 		return
 	}
 	}
 
 
 	b.unhealthyMu.Lock()
 	b.unhealthyMu.Lock()
 	b.unhealthyHostPorts[hostPort] = time.Now()
 	b.unhealthyHostPorts[hostPort] = time.Now()
 	b.unhealthyMu.Unlock()
 	b.unhealthyMu.Unlock()
-	logger.Lvl(4).Infof("clientv3/balancer: %q is marked unhealthy (%q)", hostPort, err.Error())
+	lg.Lvl(4).Infof("clientv3/balancer: %q is marked unhealthy (%q)", hostPort, err.Error())
 }
 }
 
 
 func (b *healthBalancer) removeUnhealthy(hostPort, msg string) {
 func (b *healthBalancer) removeUnhealthy(hostPort, msg string) {
 	if b.endpoint(hostPort) == "" {
 	if b.endpoint(hostPort) == "" {
-		logger.Lvl(4).Infof("clientv3/balancer: %q was not in unhealthy (%q)", hostPort, msg)
+		lg.Lvl(4).Infof("clientv3/balancer: %q was not in unhealthy (%q)", hostPort, msg)
 		return
 		return
 	}
 	}
 
 
 	b.unhealthyMu.Lock()
 	b.unhealthyMu.Lock()
 	delete(b.unhealthyHostPorts, hostPort)
 	delete(b.unhealthyHostPorts, hostPort)
 	b.unhealthyMu.Unlock()
 	b.unhealthyMu.Unlock()
-	logger.Lvl(4).Infof("clientv3/balancer: %q is removed from unhealthy (%q)", hostPort, msg)
+	lg.Lvl(4).Infof("clientv3/balancer: %q is removed from unhealthy (%q)", hostPort, msg)
 }
 }
 
 
 func (b *healthBalancer) countUnhealthy() (count int) {
 func (b *healthBalancer) countUnhealthy() (count int) {
@@ -199,7 +199,7 @@ func (b *healthBalancer) cleanupUnhealthy() {
 	for k, v := range b.unhealthyHostPorts {
 	for k, v := range b.unhealthyHostPorts {
 		if time.Since(v) > b.healthCheckTimeout {
 		if time.Since(v) > b.healthCheckTimeout {
 			delete(b.unhealthyHostPorts, k)
 			delete(b.unhealthyHostPorts, k)
-			logger.Lvl(4).Infof("clientv3/balancer: removed %q from unhealthy after %v", k, b.healthCheckTimeout)
+			lg.Lvl(4).Infof("clientv3/balancer: removed %q from unhealthy after %v", k, b.healthCheckTimeout)
 		}
 		}
 	}
 	}
 	b.unhealthyMu.Unlock()
 	b.unhealthyMu.Unlock()
@@ -402,7 +402,7 @@ func (b *healthBalancer) Up(addr grpc.Address) func(error) {
 	}
 	}
 
 
 	if b.pinAddr != "" {
 	if b.pinAddr != "" {
-		logger.Lvl(4).Infof("clientv3/balancer: %q is up but not pinned (already pinned %q)", addr.Addr, b.pinAddr)
+		lg.Lvl(4).Infof("clientv3/balancer: %q is up but not pinned (already pinned %q)", addr.Addr, b.pinAddr)
 		return func(err error) {}
 		return func(err error) {}
 	}
 	}
 
 
@@ -410,7 +410,7 @@ func (b *healthBalancer) Up(addr grpc.Address) func(error) {
 	close(b.upc)
 	close(b.upc)
 	b.downc = make(chan struct{})
 	b.downc = make(chan struct{})
 	b.pinAddr = addr.Addr
 	b.pinAddr = addr.Addr
-	logger.Lvl(4).Infof("clientv3/balancer: pin %q", addr.Addr)
+	lg.Lvl(4).Infof("clientv3/balancer: pin %q", addr.Addr)
 
 
 	// notify client that a connection is up
 	// notify client that a connection is up
 	b.readyOnce.Do(func() { close(b.readyc) })
 	b.readyOnce.Do(func() { close(b.readyc) })
@@ -427,7 +427,7 @@ func (b *healthBalancer) Up(addr grpc.Address) func(error) {
 		close(b.downc)
 		close(b.downc)
 		b.pinAddr = ""
 		b.pinAddr = ""
 		b.mu.Unlock()
 		b.mu.Unlock()
-		logger.Lvl(4).Infof("clientv3/balancer: unpin %q (%q)", addr.Addr, err.Error())
+		lg.Lvl(4).Infof("clientv3/balancer: unpin %q (%q)", addr.Addr, err.Error())
 	}
 	}
 }
 }
 
 
@@ -454,7 +454,7 @@ func (b *healthBalancer) mayPin(addr grpc.Address) bool {
 	//   3. grpc-healthcheck still SERVING, thus retry to pin
 	//   3. grpc-healthcheck still SERVING, thus retry to pin
 	// instead, return before grpc-healthcheck if failed within healthcheck timeout
 	// instead, return before grpc-healthcheck if failed within healthcheck timeout
 	if elapsed := time.Since(failedTime); elapsed < b.healthCheckTimeout {
 	if elapsed := time.Since(failedTime); elapsed < b.healthCheckTimeout {
-		logger.Lvl(4).Infof("clientv3/balancer: %q is up but not pinned (failed %v ago, require minimum %v after failure)", addr.Addr, elapsed, b.healthCheckTimeout)
+		lg.Lvl(4).Infof("clientv3/balancer: %q is up but not pinned (failed %v ago, require minimum %v after failure)", addr.Addr, elapsed, b.healthCheckTimeout)
 		return false
 		return false
 	}
 	}
 
 

+ 18 - 52
clientv3/logger.go

@@ -18,28 +18,14 @@ import (
 	"io/ioutil"
 	"io/ioutil"
 	"sync"
 	"sync"
 
 
+	"github.com/coreos/etcd/pkg/logger"
+
 	"google.golang.org/grpc/grpclog"
 	"google.golang.org/grpc/grpclog"
 )
 )
 
 
-// Logger is the logger used by client library.
-// It implements grpclog.LoggerV2 interface.
-type Logger interface {
-	grpclog.LoggerV2
-
-	// Lvl returns logger if logger's verbosity level >= "lvl".
-	// Otherwise, logger that discards all logs.
-	Lvl(lvl int) Logger
-
-	// to satisfy capnslog
-
-	Print(args ...interface{})
-	Printf(format string, args ...interface{})
-	Println(args ...interface{})
-}
-
 var (
 var (
-	loggerMu sync.RWMutex
-	logger   Logger
+	lgMu sync.RWMutex
+	lg   logger.Logger
 )
 )
 
 
 type settableLogger struct {
 type settableLogger struct {
@@ -49,29 +35,29 @@ type settableLogger struct {
 
 
 func init() {
 func init() {
 	// disable client side logs by default
 	// disable client side logs by default
-	logger = &settableLogger{}
+	lg = &settableLogger{}
 	SetLogger(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard))
 	SetLogger(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard))
 }
 }
 
 
 // SetLogger sets client-side Logger.
 // SetLogger sets client-side Logger.
 func SetLogger(l grpclog.LoggerV2) {
 func SetLogger(l grpclog.LoggerV2) {
-	loggerMu.Lock()
-	logger = NewLogger(l)
+	lgMu.Lock()
+	lg = logger.New(l)
 	// override grpclog so that any changes happen with locking
 	// override grpclog so that any changes happen with locking
-	grpclog.SetLoggerV2(logger)
-	loggerMu.Unlock()
+	grpclog.SetLoggerV2(lg)
+	lgMu.Unlock()
 }
 }
 
 
-// GetLogger returns the current logger.
-func GetLogger() Logger {
-	loggerMu.RLock()
-	l := logger
-	loggerMu.RUnlock()
+// GetLogger returns the current logger.Logger.
+func GetLogger() logger.Logger {
+	lgMu.RLock()
+	l := lg
+	lgMu.RUnlock()
 	return l
 	return l
 }
 }
 
 
-// NewLogger returns a new Logger with grpclog.LoggerV2.
-func NewLogger(gl grpclog.LoggerV2) Logger {
+// NewLogger returns a new Logger with logger.Logger.
+func NewLogger(gl grpclog.LoggerV2) logger.Logger {
 	return &settableLogger{l: gl}
 	return &settableLogger{l: gl}
 }
 }
 
 
@@ -104,32 +90,12 @@ func (s *settableLogger) Print(args ...interface{})                 { s.get().In
 func (s *settableLogger) Printf(format string, args ...interface{}) { s.get().Infof(format, args...) }
 func (s *settableLogger) Printf(format string, args ...interface{}) { s.get().Infof(format, args...) }
 func (s *settableLogger) Println(args ...interface{})               { s.get().Infoln(args...) }
 func (s *settableLogger) Println(args ...interface{})               { s.get().Infoln(args...) }
 func (s *settableLogger) V(l int) bool                              { return s.get().V(l) }
 func (s *settableLogger) V(l int) bool                              { return s.get().V(l) }
-func (s *settableLogger) Lvl(lvl int) Logger {
+func (s *settableLogger) Lvl(lvl int) grpclog.LoggerV2 {
 	s.mu.RLock()
 	s.mu.RLock()
 	l := s.l
 	l := s.l
 	s.mu.RUnlock()
 	s.mu.RUnlock()
 	if l.V(lvl) {
 	if l.V(lvl) {
 		return s
 		return s
 	}
 	}
-	return &noLogger{}
+	return logger.NewDiscardLogger()
 }
 }
-
-type noLogger struct{}
-
-func (*noLogger) Info(args ...interface{})                    {}
-func (*noLogger) Infof(format string, args ...interface{})    {}
-func (*noLogger) Infoln(args ...interface{})                  {}
-func (*noLogger) Warning(args ...interface{})                 {}
-func (*noLogger) Warningf(format string, args ...interface{}) {}
-func (*noLogger) Warningln(args ...interface{})               {}
-func (*noLogger) Error(args ...interface{})                   {}
-func (*noLogger) Errorf(format string, args ...interface{})   {}
-func (*noLogger) Errorln(args ...interface{})                 {}
-func (*noLogger) Fatal(args ...interface{})                   {}
-func (*noLogger) Fatalf(format string, args ...interface{})   {}
-func (*noLogger) Fatalln(args ...interface{})                 {}
-func (*noLogger) Print(args ...interface{})                   {}
-func (*noLogger) Printf(format string, args ...interface{})   {}
-func (*noLogger) Println(args ...interface{})                 {}
-func (*noLogger) V(l int) bool                                { return false }
-func (ng *noLogger) Lvl(lvl int) Logger                       { return ng }

+ 0 - 51
clientv3/logger_test.go

@@ -1,51 +0,0 @@
-// Copyright 2017 The etcd Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package clientv3
-
-import (
-	"bytes"
-	"io/ioutil"
-	"strings"
-	"testing"
-
-	"google.golang.org/grpc/grpclog"
-)
-
-func TestLogger(t *testing.T) {
-	buf := new(bytes.Buffer)
-
-	l := NewLogger(grpclog.NewLoggerV2WithVerbosity(buf, buf, buf, 10))
-	l.Infof("hello world!")
-	if !strings.Contains(buf.String(), "hello world!") {
-		t.Fatalf("expected 'hello world!', got %q", buf.String())
-	}
-	buf.Reset()
-
-	l.Lvl(10).Infof("Level 10")
-	l.Lvl(30).Infof("Level 30")
-	if !strings.Contains(buf.String(), "Level 10") {
-		t.Fatalf("expected 'Level 10', got %q", buf.String())
-	}
-	if strings.Contains(buf.String(), "Level 30") {
-		t.Fatalf("unexpected 'Level 30', got %q", buf.String())
-	}
-	buf.Reset()
-
-	l = NewLogger(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard))
-	l.Infof("ignore this")
-	if len(buf.Bytes()) > 0 {
-		t.Fatalf("unexpected logs %q", buf.String())
-	}
-}

+ 4 - 4
clientv3/retry.go

@@ -96,13 +96,13 @@ func (c *Client) newRetryWrapper() retryRPCFunc {
 			if err == nil {
 			if err == nil {
 				return nil
 				return nil
 			}
 			}
-			logger.Lvl(4).Infof("clientv3/retry: error %q on pinned endpoint %q", err.Error(), pinned)
+			lg.Lvl(4).Infof("clientv3/retry: error %q on pinned endpoint %q", err.Error(), pinned)
 
 
 			if s, ok := status.FromError(err); ok && (s.Code() == codes.Unavailable || s.Code() == codes.DeadlineExceeded || s.Code() == codes.Internal) {
 			if s, ok := status.FromError(err); ok && (s.Code() == codes.Unavailable || s.Code() == codes.DeadlineExceeded || s.Code() == codes.Internal) {
 				// mark this before endpoint switch is triggered
 				// mark this before endpoint switch is triggered
 				c.balancer.hostPortError(pinned, err)
 				c.balancer.hostPortError(pinned, err)
 				c.balancer.next()
 				c.balancer.next()
-				logger.Lvl(4).Infof("clientv3/retry: switching from %q due to error %q", pinned, err.Error())
+				lg.Lvl(4).Infof("clientv3/retry: switching from %q due to error %q", pinned, err.Error())
 			}
 			}
 
 
 			if isStop(err) {
 			if isStop(err) {
@@ -120,12 +120,12 @@ func (c *Client) newAuthRetryWrapper(retryf retryRPCFunc) retryRPCFunc {
 			if err == nil {
 			if err == nil {
 				return nil
 				return nil
 			}
 			}
-			logger.Lvl(4).Infof("clientv3/auth-retry: error %q on pinned endpoint %q", err.Error(), pinned)
+			lg.Lvl(4).Infof("clientv3/auth-retry: error %q on pinned endpoint %q", err.Error(), pinned)
 			// always stop retry on etcd errors other than invalid auth token
 			// always stop retry on etcd errors other than invalid auth token
 			if rpctypes.Error(err) == rpctypes.ErrInvalidAuthToken {
 			if rpctypes.Error(err) == rpctypes.ErrInvalidAuthToken {
 				gterr := c.getToken(rpcCtx)
 				gterr := c.getToken(rpcCtx)
 				if gterr != nil {
 				if gterr != nil {
-					logger.Lvl(4).Infof("clientv3/auth-retry: cannot retry due to error %q(%q) on pinned endpoint %q", err.Error(), gterr.Error(), pinned)
+					lg.Lvl(4).Infof("clientv3/auth-retry: cannot retry due to error %q(%q) on pinned endpoint %q", err.Error(), gterr.Error(), pinned)
 					return err // return the original error for simplicity
 					return err // return the original error for simplicity
 				}
 				}
 				continue
 				continue