clientv3/client.go
func (c *Client) dial(target string, creds *credentials.TransportCredentials, dopts ...grpc.DialOption) (*grpc.ClientConn, error) {
	opts, err := c.dialSetupOpts(creds, dopts...)
	if err != nil {
		return nil, fmt.Errorf("failed to configure dialer: %v", err)
	}

	if c.Username != "" && c.Password != "" {
		c.tokenCred = &authTokenCredential{
			tokenMu: &sync.RWMutex{},
		}

		ctx, cancel := c.ctx, func() {}
		if c.cfg.DialTimeout > 0 {
			ctx, cancel = context.WithTimeout(ctx, c.cfg.DialTimeout)
		}

		err = c.getToken(ctx)
		if err != nil {
			if toErr(ctx, err) != rpctypes.ErrAuthNotEnabled {
				if err == ctx.Err() && ctx.Err() != c.ctx.Err() {
					err = context.DeadlineExceeded
				}
				cancel()
				return nil, err
			}
		} else {
			opts = append(opts, grpc.WithPerRPCCredentials(c.tokenCred))
		}
		cancel()
	}

	opts = append(opts, c.cfg.DialOptions...)

	dctx := c.ctx
	if c.cfg.DialTimeout > 0 {
		var cancel context.CancelFunc
		dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout)
		defer cancel() // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options?
	}

	conn, err := grpc.DialContext(dctx, target, opts...)
	if err != nil {
		return nil, err
	}
	return conn, nil
}
func (c *Client) dial(target string, creds *credentials.TransportCredentials, dopts ...grpc.DialOption) (*grpc.ClientConn, error) {
	opts, err := c.dialSetupOpts(creds, dopts...)
	if err != nil {
		return nil, fmt.Errorf("failed to configure dialer: %v", err)
	}

	if c.Username != "" && c.Password != "" {
		c.tokenCred = &authTokenCredential{
			tokenMu: &sync.RWMutex{},
		}

		ctx, cancel := c.ctx, func() {}
		if c.cfg.DialTimeout > 0 {
			ctx, cancel = context.WithTimeout(ctx, c.cfg.DialTimeout)
		}

		err = c.getToken(ctx)
		if err != nil {
			if toErr(ctx, err) != rpctypes.ErrAuthNotEnabled {
				if err == ctx.Err() && ctx.Err() != c.ctx.Err() {
					err = context.DeadlineExceeded
				}
				cancel()
				return nil, err
			}
		} else {
			opts = append(opts, grpc.WithPerRPCCredentials(c.tokenCred))
		}
		cancel()
	}

	opts = append(opts, c.cfg.DialOptions...)

	dctx := c.ctx
	if c.cfg.DialTimeout > 0 {
		var cancel context.CancelFunc
		dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout)
		defer cancel() // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options?
	}

	conn, err := grpc.DialContext(dctx, target, opts...)
	if err != nil {
		return nil, err
	}
	return conn, nil
}
func ( c * Client ) dial ( target string , creds * credentials . TransportCredentials , dopts ... grpc . DialOption ) ( * grpc . ClientConn , error ) { opts , err := c . dialSetupOpts ( creds , dopts ... ) if err != nil { return nil , fmt . Errorf ( " " , err ) } if c . Username != " " && c . Password != " " { c . tokenCred = & authTokenCredential { tokenMu : & sync . RWMutex { } , } ctx , cancel := c . ctx , func ( ) { } if c . cfg . DialTimeout > 0 { ctx , cancel = context . WithTimeout ( ctx , c . cfg . DialTimeout ) } err = c . getToken ( ctx ) if err != nil { if toErr ( ctx , err ) != rpctypes . ErrAuthNotEnabled { if err == ctx . Err ( ) && ctx . Err ( ) != c . ctx . Err ( ) { err = context . DeadlineExceeded } cancel ( ) return nil , err } } else { opts = append ( opts , grpc . WithPerRPCCredentials ( c . tokenCred ) ) } cancel ( ) } opts = append ( opts , c . cfg . DialOptions ... ) dctx := c . ctx if c . cfg . DialTimeout > 0 { var cancel context . CancelFunc dctx , cancel = context . WithTimeout ( c . ctx , c . cfg . DialTimeout ) defer cancel ( ) // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options? } conn , err := grpc . DialContext ( dctx , target , opts ... ) if err != nil { return nil , err } return conn , nil }
// dial configures and dials any grpc balancer target.
dial configures and dials any grpc balancer target .