gRPC migration

Change-Id: Ib390f6dde0d5a8d6db12ccd7da41135570ad1354
diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go
index 9258858..917c242 100644
--- a/vendor/google.golang.org/grpc/balancer/balancer.go
+++ b/vendor/google.golang.org/grpc/balancer/balancer.go
@@ -117,15 +117,6 @@
 	HealthCheckEnabled bool
 }
 
-// State contains the balancer's state relevant to the gRPC ClientConn.
-type State struct {
-	// State contains the connectivity state of the balancer, which is used to
-	// determine the state of the ClientConn.
-	ConnectivityState connectivity.State
-	// Picker is used to choose connections (SubConns) for RPCs.
-	Picker V2Picker
-}
-
 // ClientConn represents a gRPC ClientConn.
 //
 // This interface is to be implemented by gRPC. Users should not need a
@@ -146,19 +137,10 @@
 	//
 	// gRPC will update the connectivity state of the ClientConn, and will call pick
 	// on the new picker to pick new SubConn.
-	//
-	// Deprecated: use UpdateState instead
 	UpdateBalancerState(s connectivity.State, p Picker)
 
-	// UpdateState notifies gRPC that the balancer's internal state has
-	// changed.
-	//
-	// gRPC will update the connectivity state of the ClientConn, and will call pick
-	// on the new picker to pick new SubConns.
-	UpdateState(State)
-
 	// ResolveNow is called by balancer to notify gRPC to do a name resolving.
-	ResolveNow(resolver.ResolveNowOptions)
+	ResolveNow(resolver.ResolveNowOption)
 
 	// Target returns the dial target for this ClientConn.
 	//
@@ -203,14 +185,11 @@
 	ParseConfig(LoadBalancingConfigJSON json.RawMessage) (serviceconfig.LoadBalancingConfig, error)
 }
 
-// PickInfo contains additional information for the Pick operation.
-type PickInfo struct {
+// PickOptions contains addition information for the Pick operation.
+type PickOptions struct {
 	// FullMethodName is the method name that NewClientStream() is called
 	// with. The canonical format is /service/Method.
 	FullMethodName string
-	// Ctx is the RPC's context, and may contain relevant RPC-level information
-	// like the outgoing header metadata.
-	Ctx context.Context
 }
 
 // DoneInfo contains additional information for done.
@@ -236,7 +215,7 @@
 	ErrNoSubConnAvailable = errors.New("no SubConn is available")
 	// ErrTransientFailure indicates all SubConns are in TransientFailure.
 	// WaitForReady RPCs will block, non-WaitForReady RPCs will fail.
-	ErrTransientFailure = TransientFailureError(errors.New("all SubConns are in TransientFailure"))
+	ErrTransientFailure = errors.New("all SubConns are in TransientFailure")
 )
 
 // Picker is used by gRPC to pick a SubConn to send an RPC.
@@ -244,8 +223,6 @@
 // internal state has changed.
 //
 // The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
-//
-// Deprecated: use V2Picker instead
 type Picker interface {
 	// Pick returns the SubConn to be used to send the RPC.
 	// The returned SubConn must be one returned by NewSubConn().
@@ -266,76 +243,18 @@
 	//
 	// If the returned error is not nil:
 	// - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState()
-	// - If the error is ErrTransientFailure or implements IsTransientFailure()
-	//   bool, returning true:
+	// - If the error is ErrTransientFailure:
 	//   - If the RPC is wait-for-ready, gRPC will block until UpdateBalancerState()
 	//     is called to pick again;
 	//   - Otherwise, RPC will fail with unavailable error.
 	// - Else (error is other non-nil error):
-	//   - The RPC will fail with the error's status code, or Unknown if it is
-	//     not a status error.
+	//   - The RPC will fail with unavailable error.
 	//
 	// The returned done() function will be called once the rpc has finished,
 	// with the final status of that RPC.  If the SubConn returned is not a
 	// valid SubConn type, done may not be called.  done may be nil if balancer
 	// doesn't care about the RPC status.
-	Pick(ctx context.Context, info PickInfo) (conn SubConn, done func(DoneInfo), err error)
-}
-
-// PickResult contains information related to a connection chosen for an RPC.
-type PickResult struct {
-	// SubConn is the connection to use for this pick, if its state is Ready.
-	// If the state is not Ready, gRPC will block the RPC until a new Picker is
-	// provided by the balancer (using ClientConn.UpdateState).  The SubConn
-	// must be one returned by ClientConn.NewSubConn.
-	SubConn SubConn
-
-	// Done is called when the RPC is completed.  If the SubConn is not ready,
-	// this will be called with a nil parameter.  If the SubConn is not a valid
-	// type, Done may not be called.  May be nil if the balancer does not wish
-	// to be notified when the RPC completes.
-	Done func(DoneInfo)
-}
-
-type transientFailureError struct {
-	error
-}
-
-func (e *transientFailureError) IsTransientFailure() bool { return true }
-
-// TransientFailureError wraps err in an error implementing
-// IsTransientFailure() bool, returning true.
-func TransientFailureError(err error) error {
-	return &transientFailureError{error: err}
-}
-
-// V2Picker is used by gRPC to pick a SubConn to send an RPC.
-// Balancer is expected to generate a new picker from its snapshot every time its
-// internal state has changed.
-//
-// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
-type V2Picker interface {
-	// Pick returns the connection to use for this RPC and related information.
-	//
-	// Pick should not block.  If the balancer needs to do I/O or any blocking
-	// or time-consuming work to service this call, it should return
-	// ErrNoSubConnAvailable, and the Pick call will be repeated by gRPC when
-	// the Picker is updated (using ClientConn.UpdateState).
-	//
-	// If an error is returned:
-	//
-	// - If the error is ErrNoSubConnAvailable, gRPC will block until a new
-	//   Picker is provided by the balancer (using ClientConn.UpdateState).
-	//
-	// - If the error implements IsTransientFailure() bool, returning true,
-	//   wait for ready RPCs will wait, but non-wait for ready RPCs will be
-	//   terminated with this error's Error() string and status code
-	//   Unavailable.
-	//
-	// - Any other errors terminate all RPCs with the code and message
-	//   provided.  If the error is not a status error, it will be converted by
-	//   gRPC to a status error with code Unknown.
-	Pick(info PickInfo) (PickResult, error)
+	Pick(ctx context.Context, opts PickOptions) (conn SubConn, done func(DoneInfo), err error)
 }
 
 // Balancer takes input from gRPC, manages SubConns, and collects and aggregates
@@ -373,11 +292,8 @@
 
 // SubConnState describes the state of a SubConn.
 type SubConnState struct {
-	// ConnectivityState is the connectivity state of the SubConn.
 	ConnectivityState connectivity.State
-	// ConnectionError is set if the ConnectivityState is TransientFailure,
-	// describing the reason the SubConn failed.  Otherwise, it is nil.
-	ConnectionError error
+	// TODO: add last connection error
 }
 
 // ClientConnState describes the state of a ClientConn relevant to the
@@ -419,8 +335,9 @@
 //
 // It's not thread safe.
 type ConnectivityStateEvaluator struct {
-	numReady      uint64 // Number of addrConns in ready state.
-	numConnecting uint64 // Number of addrConns in connecting state.
+	numReady            uint64 // Number of addrConns in ready state.
+	numConnecting       uint64 // Number of addrConns in connecting state.
+	numTransientFailure uint64 // Number of addrConns in transientFailure.
 }
 
 // RecordTransition records state change happening in subConn and based on that
@@ -440,6 +357,8 @@
 			cse.numReady += updateVal
 		case connectivity.Connecting:
 			cse.numConnecting += updateVal
+		case connectivity.TransientFailure:
+			cse.numTransientFailure += updateVal
 		}
 	}