Skip to content

Commit

Permalink
clientv3: fix race when setting grpc Logger
Browse files Browse the repository at this point in the history
grpc only permits SetLogger on init()
  • Loading branch information
Anthony Romano committed Mar 28, 2016
1 parent d91f90c commit d7954f5
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 14 deletions.
16 changes: 2 additions & 14 deletions clientv3/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ package clientv3
import (
"crypto/tls"
"errors"
"io/ioutil"
"log"
"net"
"net/url"
"strings"
Expand All @@ -28,15 +26,12 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/grpclog"
)

var (
ErrNoAvailableEndpoints = errors.New("etcdclient: no available endpoints")
)

type Logger grpclog.Logger

// Client provides and manages an etcd v3 client session.
type Client struct {
Cluster
Expand All @@ -54,8 +49,6 @@ type Client struct {

ctx context.Context
cancel context.CancelFunc

logger Logger
}

// EndpointDialer is a policy for choosing which endpoint to dial next
Expand Down Expand Up @@ -190,13 +183,8 @@ func newClient(cfg *Config) (*Client, error) {
client.Watcher = NewWatcher(client)
client.Auth = NewAuth(client)
client.Maintenance = &maintenance{c: client}
if cfg.Logger == nil {
client.logger = log.New(ioutil.Discard, "", 0)
// disable client side grpc by default
grpclog.SetLogger(log.New(ioutil.Discard, "", 0))
} else {
client.logger = cfg.Logger
grpclog.SetLogger(cfg.Logger)
if cfg.Logger != nil {
logger.Set(cfg.Logger)
}

return client, nil
Expand Down
46 changes: 46 additions & 0 deletions clientv3/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright 2016 CoreOS, Inc.
//
// 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 (
"io/ioutil"
"log"
"sync"

"google.golang.org/grpc/grpclog"
)

type Logger grpclog.Logger

var (
logger settableLogger
)

type settableLogger struct {
grpclog.Logger
mu sync.Mutex
}

func init() {
logger = settableLogger{Logger: log.New(ioutil.Discard, "", 0)}
// disable client side grpc by default
grpclog.SetLogger(&logger)
}

func (s *settableLogger) Set(l grpclog.Logger) {
s.mu.Lock()
logger.Logger = l
s.mu.Unlock()
}

0 comments on commit d7954f5

Please sign in to comment.