// grpcTransportFactory is the default TransportFactory, using GRPC. func grpcTransportFactory( opts SendOptions, rpcContext *rpc.Context, replicas ReplicaSlice, args roachpb.BatchRequest, ) (Transport, error) { clients := make([]batchClient, 0, len(replicas)) for _, replica := range replicas { conn, err := rpcContext.GRPCDial(replica.NodeDesc.Address.String()) if err != nil { return nil, err } argsCopy := args argsCopy.Replica = replica.ReplicaDescriptor remoteAddr := replica.NodeDesc.Address.String() clients = append(clients, batchClient{ remoteAddr: remoteAddr, conn: conn, client: roachpb.NewInternalClient(conn), args: argsCopy, healthy: rpcContext.IsConnHealthy(remoteAddr), }) } // Put known-unhealthy clients last. splitHealthy(clients) return &grpcTransport{ opts: opts, rpcContext: rpcContext, orderedClients: clients, }, nil }