* * Copyright 2017 gRPC 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 grpc

import (
	
	

	
	
)
PickFirstBalancerName is the name of the pick_first balancer.
Set a failing picker if we don't have a good picker.
		.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure,
			Picker: &picker{err: fmt.Errorf("name resolver error: %v", )},
		})
	}
	if logger.V(2) {
		logger.Infof("pickfirstBalancer: ResolverError called with error %v", )
	}
}

func ( *pickfirstBalancer) ( balancer.ClientConnState) error {
	if len(.ResolverState.Addresses) == 0 {
		.ResolverError(errors.New("produced zero addresses"))
		return balancer.ErrBadResolverState
	}
	if .sc == nil {
		var  error
		.sc,  = .cc.NewSubConn(.ResolverState.Addresses, balancer.NewSubConnOptions{})
		if  != nil {
			if logger.V(2) {
				logger.Errorf("pickfirstBalancer: failed to NewSubConn: %v", )
			}
			.state = connectivity.TransientFailure
			.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure,
				Picker: &picker{err: fmt.Errorf("error creating connection: %v", )},
			})
			return balancer.ErrBadResolverState
		}
		.state = connectivity.Idle
		.cc.UpdateState(balancer.State{ConnectivityState: connectivity.Idle, Picker: &picker{result: balancer.PickResult{SubConn: .sc}}})
		.sc.Connect()
	} else {
		.sc.UpdateAddresses(.ResolverState.Addresses)
		.sc.Connect()
	}
	return nil
}

func ( *pickfirstBalancer) ( balancer.SubConn,  balancer.SubConnState) {
	if logger.V(2) {
		logger.Infof("pickfirstBalancer: UpdateSubConnState: %p, %v", , )
	}
	if .sc !=  {
		if logger.V(2) {
			logger.Infof("pickfirstBalancer: ignored state change because sc is not recognized")
		}
		return
	}
	.state = .ConnectivityState
	if .ConnectivityState == connectivity.Shutdown {
		.sc = nil
		return
	}

	switch .ConnectivityState {
	case connectivity.Ready, connectivity.Idle:
		.cc.UpdateState(balancer.State{ConnectivityState: .ConnectivityState, Picker: &picker{result: balancer.PickResult{SubConn: }}})
	case connectivity.Connecting:
		.cc.UpdateState(balancer.State{ConnectivityState: .ConnectivityState, Picker: &picker{err: balancer.ErrNoSubConnAvailable}})
	case connectivity.TransientFailure:
		.cc.UpdateState(balancer.State{
			ConnectivityState: .ConnectivityState,
			Picker:            &picker{err: .ConnectionError},
		})
	}
}

func ( *pickfirstBalancer) () {
}

type picker struct {
	result balancer.PickResult
	err    error
}

func ( *picker) ( balancer.PickInfo) (balancer.PickResult, error) {
	return .result, .err
}

func () {
	balancer.Register(newPickfirstBuilder())