// SplitQuery is part of the queryservice.QueryServer interface func (q *query) SplitQuery(ctx context.Context, request *querypb.SplitQueryRequest) (response *querypb.SplitQueryResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) bq, err := querytypes.Proto3ToBoundQuery(request.Query) if err != nil { return nil, vterrors.ToGRPCError(err) } splits := []querytypes.QuerySplit{} splits, err = queryservice.CallCorrectSplitQuery( q.server, request.UseSplitQueryV2, ctx, request.Target, bq.Sql, bq.BindVariables, request.SplitColumn, request.SplitCount, request.NumRowsPerQueryPart, request.Algorithm) if err != nil { return nil, vterrors.ToGRPCError(err) } qs, err := querytypes.QuerySplitsToProto3(splits) if err != nil { return nil, vterrors.ToGRPCError(err) } return &querypb.SplitQueryResponse{Queries: qs}, nil }
// ExecuteBatchKeyspaceIds is the RPC version of // vtgateservice.VTGateService method func (vtg *VTGate) ExecuteBatchKeyspaceIds(ctx context.Context, request *pb.ExecuteBatchKeyspaceIdsRequest) (response *pb.ExecuteBatchKeyspaceIdsResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) reply := new(proto.QueryResultList) bq, err := proto.ProtoToBoundKeyspaceIdQueries(request.Queries) if err != nil { return nil, vterrors.ToGRPCError(err) } executeErr := vtg.server.ExecuteBatchKeyspaceIds(ctx, bq, request.TabletType, request.AsTransaction, request.Session, reply) response = &pb.ExecuteBatchKeyspaceIdsResponse{ Error: vtgate.RPCErrorToVtRPCError(reply.Err), } if executeErr != nil { return nil, vterrors.ToGRPCError(executeErr) } response.Results = tproto.QueryResultListToProto3(reply.List) response.Session = reply.Session return response, nil }
// ExecuteKeyspaceIds is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) ExecuteKeyspaceIds(ctx context.Context, request *pb.ExecuteKeyspaceIdsRequest) (response *pb.ExecuteKeyspaceIdsResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) reply := new(proto.QueryResult) bv, err := tproto.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } executeErr := vtg.server.ExecuteKeyspaceIds(ctx, string(request.Query.Sql), bv, request.Keyspace, request.KeyspaceIds, request.TabletType, request.Session, request.NotInTransaction, reply) response = &pb.ExecuteKeyspaceIdsResponse{ Error: vtgate.RPCErrorToVtRPCError(reply.Err), } if executeErr != nil { return nil, vterrors.ToGRPCError(executeErr) } response.Result = sqltypes.ResultToProto3(reply.Result) response.Session = reply.Session return response, nil }
// SplitQuery is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) SplitQuery(ctx context.Context, request *vtgatepb.SplitQueryRequest) (response *vtgatepb.SplitQueryResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = withCallerIDContext(ctx, request.CallerId) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } splits, vtgErr := vtgateservice.CallCorrectSplitQuery( vtg.server, request.UseSplitQueryV2, ctx, request.Keyspace, string(request.Query.Sql), bv, request.SplitColumn, request.SplitCount, request.NumRowsPerQueryPart, request.Algorithm) if vtgErr != nil { return nil, vterrors.ToGRPCError(vtgErr) } return &vtgatepb.SplitQueryResponse{ Splits: splits, }, nil }
// BeginExecuteBatch is part of the queryservice.QueryServer interface func (q *query) BeginExecuteBatch(ctx context.Context, request *querypb.BeginExecuteBatchRequest) (response *querypb.BeginExecuteBatchResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) bql, err := querytypes.Proto3ToBoundQueryList(request.Queries) if err != nil { return nil, vterrors.ToGRPCError(err) } results, transactionID, err := q.server.BeginExecuteBatch(ctx, request.Target, bql, request.AsTransaction, request.Options) if err != nil { // if we have a valid transactionID, return the error in-band if transactionID != 0 { return &querypb.BeginExecuteBatchResponse{ Error: vterrors.VtRPCErrorFromVtError(err), TransactionId: transactionID, }, nil } return nil, vterrors.ToGRPCError(err) } return &querypb.BeginExecuteBatchResponse{ Results: sqltypes.ResultsToProto3(results), TransactionId: transactionID, }, nil }
// BeginExecute is part of the queryservice.QueryServer interface func (q *query) BeginExecute(ctx context.Context, request *querypb.BeginExecuteRequest) (response *querypb.BeginExecuteResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } result, transactionID, err := q.server.BeginExecute(ctx, request.Target, request.Query.Sql, bv) if err != nil { // if we have a valid transactionID, return the error in-band if transactionID != 0 { return &querypb.BeginExecuteResponse{ Error: vterrors.VtRPCErrorFromVtError(err), TransactionId: transactionID, }, nil } return nil, vterrors.ToGRPCError(err) } return &querypb.BeginExecuteResponse{ Result: sqltypes.ResultToProto3(result), TransactionId: transactionID, }, nil }
// SplitQuery is part of tabletconn.TabletConn func (itc *internalTabletConn) SplitQuery(ctx context.Context, target *querypb.Target, query querytypes.BoundQuery, splitColumn string, splitCount int64) ([]querytypes.QuerySplit, error) { splits, err := itc.tablet.qsc.QueryService().SplitQuery(ctx, target, query.Sql, query.BindVariables, splitColumn, splitCount) if err != nil { return nil, tabletconn.TabletErrorFromGRPC(vterrors.ToGRPCError(err)) } return splits, nil }
// StreamHealth is part of tabletconn.TabletConn func (itc *internalTabletConn) StreamHealth(ctx context.Context) (tabletconn.StreamHealthReader, error) { result := make(chan *querypb.StreamHealthResponse, 10) id, err := itc.tablet.qsc.QueryService().StreamHealthRegister(result) if err != nil { return nil, err } var finalErr error go func() { select { case <-ctx.Done(): } // We populate finalErr before closing the channel. // The consumer first waits on the channel closure, // then read finalErr finalErr = itc.tablet.qsc.QueryService().StreamHealthUnregister(id) finalErr = tabletconn.TabletErrorFromGRPC(vterrors.ToGRPCError(finalErr)) close(result) }() return &streamHealthReader{ c: result, err: &finalErr, }, nil }
// Begin is part of tabletconn.TabletConn func (itc *internalTabletConn) Begin(ctx context.Context, target *querypb.Target) (int64, error) { transactionID, err := itc.tablet.qsc.QueryService().Begin(ctx, target) if err != nil { return 0, tabletconn.TabletErrorFromGRPC(vterrors.ToGRPCError(err)) } return transactionID, nil }
// ExecuteVtworkerCommand is part of the vtworkerdatapb.VtworkerServer interface func (s *VtworkerServer) ExecuteVtworkerCommand(args *vtworkerdatapb.ExecuteVtworkerCommandRequest, stream vtworkerservicepb.Vtworker_ExecuteVtworkerCommandServer) (err error) { // Please note that this panic handler catches only panics occuring in the code below. // The actual execution of the vtworker command takes place in a new go routine // (started in Instance.setAndStartWorker()) which has its own panic handler. defer servenv.HandlePanic("vtworker", &err) // Stream everything back what the Wrangler is logging. logstream := logutil.NewCallbackLogger(func(e *logutilpb.Event) { stream.Send(&vtworkerdatapb.ExecuteVtworkerCommandResponse{ Event: e, }) }) // Let the Wrangler also log everything to the console (and thereby // effectively to a logfile) to make sure that any information or errors // is preserved in the logs in case the RPC or vtworker crashes. logger := logutil.NewTeeLogger(logstream, logutil.NewConsoleLogger()) wr := s.wi.CreateWrangler(logger) // Run the command as long as the RPC Context is valid. worker, done, err := s.wi.RunCommand(stream.Context(), args.Args, wr, false /*runFromCli*/) if err == nil && worker != nil && done != nil { err = s.wi.WaitForCommand(worker, done) } return vterrors.ToGRPCError(err) }
// StreamExecute is part of tabletconn.TabletConn // We need to copy the bind variables as tablet server will change them. func (itc *internalTabletConn) StreamExecute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]interface{}, options *querypb.ExecuteOptions) (sqltypes.ResultStream, error) { bv, err := querytypes.BindVariablesToProto3(bindVars) if err != nil { return nil, err } bindVars, err = querytypes.Proto3ToBindVariables(bv) if err != nil { return nil, err } result := make(chan *sqltypes.Result, 10) var finalErr error go func() { finalErr = itc.tablet.qsc.QueryService().StreamExecute(ctx, target, query, bindVars, options, func(reply *sqltypes.Result) error { // We need to deep-copy the reply before returning, // because the underlying buffers are reused. result <- reply.Copy() return nil }) finalErr = tabletconn.TabletErrorFromGRPC(vterrors.ToGRPCError(finalErr)) // the client will only access finalErr after the // channel is closed, and then it's already set. close(result) }() return &streamExecuteAdapter{result, &finalErr}, nil }
// ExecuteBatch is part of the queryservice.QueryServer interface func (q *query) ExecuteBatch(ctx context.Context, request *querypb.ExecuteBatchRequest) (response *querypb.ExecuteBatchResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) bql, err := querytypes.Proto3ToBoundQueryList(request.Queries) if err != nil { return nil, vterrors.ToGRPCError(err) } results, err := q.server.ExecuteBatch(ctx, request.Target, bql, request.AsTransaction, request.TransactionId, request.Options) if err != nil { return nil, vterrors.ToGRPCError(err) } return &querypb.ExecuteBatchResponse{ Results: sqltypes.ResultsToProto3(results), }, nil }
// Execute is part of the queryservice.QueryServer interface func (q *query) Execute(ctx context.Context, request *querypb.ExecuteRequest) (response *querypb.ExecuteResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } result, err := q.server.Execute(ctx, request.Target, request.Query.Sql, bv, request.TransactionId, request.Options) if err != nil { return nil, vterrors.ToGRPCError(err) } return &querypb.ExecuteResponse{ Result: sqltypes.ResultToProto3(result), }, nil }
// StreamExecute is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) StreamExecute(request *vtgatepb.StreamExecuteRequest, stream vtgateservicepb.Vitess_StreamExecuteServer) (err error) { defer vtg.server.HandlePanic(&err) ctx := withCallerIDContext(stream.Context(), request.CallerId) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return vterrors.ToGRPCError(err) } vtgErr := vtg.server.StreamExecute(ctx, string(request.Query.Sql), bv, request.Keyspace, request.TabletType, func(value *sqltypes.Result) error { return stream.Send(&vtgatepb.StreamExecuteResponse{ Result: sqltypes.ResultToProto3(value), }) }) return vterrors.ToGRPCError(vtgErr) }
// Rollback is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Rollback(ctx context.Context, request *vtgatepb.RollbackRequest) (response *vtgatepb.RollbackResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = withCallerIDContext(ctx, request.CallerId) vtgErr := vtg.server.Rollback(ctx, request.Session) response = &vtgatepb.RollbackResponse{} if vtgErr == nil { return response, nil } return nil, vterrors.ToGRPCError(vtgErr) }
// GetSrvKeyspace is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) GetSrvKeyspace(ctx context.Context, request *vtgatepb.GetSrvKeyspaceRequest) (response *vtgatepb.GetSrvKeyspaceResponse, err error) { defer vtg.server.HandlePanic(&err) sk, vtgErr := vtg.server.GetSrvKeyspace(ctx, request.Keyspace) if vtgErr != nil { return nil, vterrors.ToGRPCError(vtgErr) } return &vtgatepb.GetSrvKeyspaceResponse{ SrvKeyspace: sk, }, nil }
// StreamExecute is part of the queryservice.QueryServer interface func (q *query) StreamExecute(request *querypb.StreamExecuteRequest, stream queryservicepb.Query_StreamExecuteServer) (err error) { defer q.server.HandlePanic(&err) ctx := callerid.NewContext(callinfo.GRPCCallInfo(stream.Context()), request.EffectiveCallerId, request.ImmediateCallerId, ) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return vterrors.ToGRPCError(err) } if err := q.server.StreamExecute(ctx, request.Target, request.Query.Sql, bv, request.Options, func(reply *sqltypes.Result) error { return stream.Send(&querypb.StreamExecuteResponse{ Result: sqltypes.ResultToProto3(reply), }) }); err != nil { return vterrors.ToGRPCError(err) } return nil }
func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (response *tabletmanagerdatapb.ExecuteFetchAsAppResponse, err error) { defer s.agent.HandleRPCPanic(ctx, "ExecuteFetchAsApp", request, response, false /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) response = &tabletmanagerdatapb.ExecuteFetchAsAppResponse{} qr, err := s.agent.ExecuteFetchAsApp(ctx, request.Query, int(request.MaxRows)) if err != nil { return nil, vterrors.ToGRPCError(err) } response.Result = qr return response, nil }
// StreamExecute is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) StreamExecute(request *pb.StreamExecuteRequest, stream pbs.Vitess_StreamExecuteServer) (err error) { defer vtg.server.HandlePanic(&err) ctx := callerid.NewContext(callinfo.GRPCCallInfo(stream.Context()), request.CallerId, callerid.NewImmediateCallerID("grpc client")) bv, err := tproto.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return vterrors.ToGRPCError(err) } vtgErr := vtg.server.StreamExecute(ctx, string(request.Query.Sql), bv, request.TabletType, func(value *proto.QueryResult) error { return stream.Send(&pb.StreamExecuteResponse{ Result: sqltypes.ResultToProto3(value.Result), }) }) return vterrors.ToGRPCError(vtgErr) }
// Commit is part of the queryservice.QueryServer interface func (q *query) Commit(ctx context.Context, request *querypb.CommitRequest) (response *querypb.CommitResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) if err := q.server.Commit(ctx, request.Target, request.TransactionId); err != nil { return nil, vterrors.ToGRPCError(err) } return &querypb.CommitResponse{}, nil }
// Begin is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Begin(ctx context.Context, request *vtgatepb.BeginRequest) (response *vtgatepb.BeginResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = withCallerIDContext(ctx, request.CallerId) session, vtgErr := vtg.server.Begin(ctx) if vtgErr == nil { return &vtgatepb.BeginResponse{ Session: session, }, nil } return nil, vterrors.ToGRPCError(vtgErr) }
// Commit is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Commit(ctx context.Context, request *vtgatepb.CommitRequest) (response *vtgatepb.CommitResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) vtgErr := vtg.server.Commit(ctx, request.Session) response = &vtgatepb.CommitResponse{} if vtgErr == nil { return response, nil } return nil, vterrors.ToGRPCError(vtgErr) }
func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (*tabletmanagerdatapb.ExecuteFetchAsAppResponse, error) { ctx = callinfo.GRPCCallInfo(ctx) response := &tabletmanagerdatapb.ExecuteFetchAsAppResponse{} return response, s.agent.RPCWrap(ctx, actionnode.TabletActionExecuteFetchAsApp, request, response, func() error { qr, err := s.agent.ExecuteFetchAsApp(ctx, request.Query, int(request.MaxRows), request.WantFields) if err != nil { return vterrors.ToGRPCError(err) } response.Result = qr return nil }) }
// Rollback is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Rollback(ctx context.Context, request *pb.RollbackRequest) (response *pb.RollbackResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) vtgErr := vtg.server.Rollback(ctx, proto.ProtoToSession(request.Session)) response = &pb.RollbackResponse{} if vtgErr == nil { return response, nil } return nil, vterrors.ToGRPCError(vtgErr) }
func (s *server) ExecuteFetchAsDba(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsDbaRequest) (*tabletmanagerdatapb.ExecuteFetchAsDbaResponse, error) { ctx = callinfo.GRPCCallInfo(ctx) response := &tabletmanagerdatapb.ExecuteFetchAsDbaResponse{} return response, s.agent.RPCWrap(ctx, actionnode.TabletActionExecuteFetchAsDba, request, response, func() error { qr, err := s.agent.ExecuteFetchAsDba(ctx, request.Query, request.DbName, int(request.MaxRows), request.DisableBinlogs, request.ReloadSchema) if err != nil { return vterrors.ToGRPCError(err) } response.Result = qr return nil }) }
// Begin is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Begin(ctx context.Context, request *vtgatepb.BeginRequest) (response *vtgatepb.BeginResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) session, vtgErr := vtg.server.Begin(ctx) if vtgErr == nil { return &vtgatepb.BeginResponse{ Session: session, }, nil } return nil, vterrors.ToGRPCError(vtgErr) }
// ReadTransaction is part of the queryservice.QueryServer interface func (q *query) ReadTransaction(ctx context.Context, request *querypb.ReadTransactionRequest) (response *querypb.ReadTransactionResponse, err error) { defer q.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.EffectiveCallerId, request.ImmediateCallerId, ) result, err := q.server.ReadTransaction(ctx, request.Target, request.Dtid) if err != nil { return nil, vterrors.ToGRPCError(err) } return &querypb.ReadTransactionResponse{Metadata: result}, nil }
// Execute is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Execute(ctx context.Context, request *vtgatepb.ExecuteRequest) (response *vtgatepb.ExecuteResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = withCallerIDContext(ctx, request.CallerId) bv, err := querytypes.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } result, err := vtg.server.Execute(ctx, string(request.Query.Sql), bv, request.Keyspace, request.TabletType, request.Session, request.NotInTransaction) return &vtgatepb.ExecuteResponse{ Result: sqltypes.ResultToProto3(result), Session: request.Session, Error: vterrors.VtRPCErrorFromVtError(err), }, nil }
// Begin is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) Begin(ctx context.Context, request *pb.BeginRequest) (response *pb.BeginResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) outSession := new(proto.Session) vtgErr := vtg.server.Begin(ctx, outSession) response = &pb.BeginResponse{} if vtgErr == nil { response.Session = proto.SessionToProto(outSession) return response, nil } return nil, vterrors.ToGRPCError(vtgErr) }
// SplitQuery is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) SplitQuery(ctx context.Context, request *pb.SplitQueryRequest) (response *pb.SplitQueryResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) bv, err := tproto.Proto3ToBindVariables(request.Query.BindVariables) if err != nil { return nil, vterrors.ToGRPCError(err) } splits, vtgErr := vtg.server.SplitQuery(ctx, request.Keyspace, string(request.Query.Sql), bv, request.SplitColumn, int(request.SplitCount)) if vtgErr != nil { return nil, vterrors.ToGRPCError(vtgErr) } return &pb.SplitQueryResponse{ Splits: splits, }, nil }