vitess.io/vitess@v0.16.2/go/vt/vttablet/grpctmserver/server.go (about)

     1  /*
     2  Copyright 2019 The Vitess Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package grpctmserver
    18  
    19  import (
    20  	"time"
    21  
    22  	"vitess.io/vitess/go/vt/callerid"
    23  	querypb "vitess.io/vitess/go/vt/proto/query"
    24  
    25  	"context"
    26  
    27  	"google.golang.org/grpc"
    28  
    29  	"vitess.io/vitess/go/vt/callinfo"
    30  	"vitess.io/vitess/go/vt/hook"
    31  	"vitess.io/vitess/go/vt/logutil"
    32  	"vitess.io/vitess/go/vt/mysqlctl/tmutils"
    33  	"vitess.io/vitess/go/vt/servenv"
    34  	"vitess.io/vitess/go/vt/vterrors"
    35  	"vitess.io/vitess/go/vt/vttablet/tabletmanager"
    36  
    37  	logutilpb "vitess.io/vitess/go/vt/proto/logutil"
    38  	tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata"
    39  	tabletmanagerservicepb "vitess.io/vitess/go/vt/proto/tabletmanagerservice"
    40  )
    41  
    42  // server is the gRPC implementation of the RPC server
    43  type server struct {
    44  	tabletmanagerservicepb.UnimplementedTabletManagerServer
    45  	// implementation of the tm to call
    46  	tm tabletmanager.RPCTM
    47  }
    48  
    49  func (s *server) Ping(ctx context.Context, request *tabletmanagerdatapb.PingRequest) (response *tabletmanagerdatapb.PingResponse, err error) {
    50  	defer s.tm.HandleRPCPanic(ctx, "Ping", request, response, false /*verbose*/, &err)
    51  	ctx = callinfo.GRPCCallInfo(ctx)
    52  	response = &tabletmanagerdatapb.PingResponse{
    53  		Payload: s.tm.Ping(ctx, request.Payload),
    54  	}
    55  	return response, nil
    56  }
    57  
    58  func (s *server) Sleep(ctx context.Context, request *tabletmanagerdatapb.SleepRequest) (response *tabletmanagerdatapb.SleepResponse, err error) {
    59  	defer s.tm.HandleRPCPanic(ctx, "Sleep", request, response, true /*verbose*/, &err)
    60  	ctx = callinfo.GRPCCallInfo(ctx)
    61  	response = &tabletmanagerdatapb.SleepResponse{}
    62  	s.tm.Sleep(ctx, time.Duration(request.Duration))
    63  	return response, nil
    64  }
    65  
    66  func (s *server) ExecuteHook(ctx context.Context, request *tabletmanagerdatapb.ExecuteHookRequest) (response *tabletmanagerdatapb.ExecuteHookResponse, err error) {
    67  	defer s.tm.HandleRPCPanic(ctx, "ExecuteHook", request, response, true /*verbose*/, &err)
    68  	ctx = callinfo.GRPCCallInfo(ctx)
    69  	response = &tabletmanagerdatapb.ExecuteHookResponse{}
    70  	hr := s.tm.ExecuteHook(ctx, &hook.Hook{
    71  		Name:       request.Name,
    72  		Parameters: request.Parameters,
    73  		ExtraEnv:   request.ExtraEnv,
    74  	})
    75  	response.ExitStatus = int64(hr.ExitStatus)
    76  	response.Stdout = hr.Stdout
    77  	response.Stderr = hr.Stderr
    78  	return response, nil
    79  }
    80  
    81  func (s *server) GetSchema(ctx context.Context, request *tabletmanagerdatapb.GetSchemaRequest) (response *tabletmanagerdatapb.GetSchemaResponse, err error) {
    82  	defer s.tm.HandleRPCPanic(ctx, "GetSchema", request, response, false /*verbose*/, &err)
    83  	ctx = callinfo.GRPCCallInfo(ctx)
    84  	response = &tabletmanagerdatapb.GetSchemaResponse{}
    85  	sd, err := s.tm.GetSchema(ctx, request)
    86  	if err == nil {
    87  		response.SchemaDefinition = sd
    88  	}
    89  	return response, err
    90  }
    91  
    92  func (s *server) GetPermissions(ctx context.Context, request *tabletmanagerdatapb.GetPermissionsRequest) (response *tabletmanagerdatapb.GetPermissionsResponse, err error) {
    93  	defer s.tm.HandleRPCPanic(ctx, "GetPermissions", request, response, false /*verbose*/, &err)
    94  	ctx = callinfo.GRPCCallInfo(ctx)
    95  	response = &tabletmanagerdatapb.GetPermissionsResponse{}
    96  	p, err := s.tm.GetPermissions(ctx)
    97  	if err == nil {
    98  		response.Permissions = p
    99  	}
   100  	return response, err
   101  }
   102  
   103  //
   104  // Various read-write methods
   105  //
   106  
   107  func (s *server) SetReadOnly(ctx context.Context, request *tabletmanagerdatapb.SetReadOnlyRequest) (response *tabletmanagerdatapb.SetReadOnlyResponse, err error) {
   108  	defer s.tm.HandleRPCPanic(ctx, "SetReadOnly", request, response, true /*verbose*/, &err)
   109  	ctx = callinfo.GRPCCallInfo(ctx)
   110  	response = &tabletmanagerdatapb.SetReadOnlyResponse{}
   111  	return response, s.tm.SetReadOnly(ctx, true)
   112  }
   113  
   114  func (s *server) SetReadWrite(ctx context.Context, request *tabletmanagerdatapb.SetReadWriteRequest) (response *tabletmanagerdatapb.SetReadWriteResponse, err error) {
   115  	defer s.tm.HandleRPCPanic(ctx, "SetReadWrite", request, response, true /*verbose*/, &err)
   116  	ctx = callinfo.GRPCCallInfo(ctx)
   117  	response = &tabletmanagerdatapb.SetReadWriteResponse{}
   118  	return response, s.tm.SetReadOnly(ctx, false)
   119  }
   120  
   121  func (s *server) ChangeType(ctx context.Context, request *tabletmanagerdatapb.ChangeTypeRequest) (response *tabletmanagerdatapb.ChangeTypeResponse, err error) {
   122  	defer s.tm.HandleRPCPanic(ctx, "ChangeType", request, response, true /*verbose*/, &err)
   123  	ctx = callinfo.GRPCCallInfo(ctx)
   124  	response = &tabletmanagerdatapb.ChangeTypeResponse{}
   125  	return response, s.tm.ChangeType(ctx, request.TabletType, request.GetSemiSync())
   126  }
   127  
   128  func (s *server) RefreshState(ctx context.Context, request *tabletmanagerdatapb.RefreshStateRequest) (response *tabletmanagerdatapb.RefreshStateResponse, err error) {
   129  	defer s.tm.HandleRPCPanic(ctx, "RefreshState", request, response, true /*verbose*/, &err)
   130  	ctx = callinfo.GRPCCallInfo(ctx)
   131  	response = &tabletmanagerdatapb.RefreshStateResponse{}
   132  	return response, s.tm.RefreshState(ctx)
   133  }
   134  
   135  func (s *server) RunHealthCheck(ctx context.Context, request *tabletmanagerdatapb.RunHealthCheckRequest) (response *tabletmanagerdatapb.RunHealthCheckResponse, err error) {
   136  	defer s.tm.HandleRPCPanic(ctx, "RunHealthCheck", request, response, false /*verbose*/, &err)
   137  	ctx = callinfo.GRPCCallInfo(ctx)
   138  	response = &tabletmanagerdatapb.RunHealthCheckResponse{}
   139  	s.tm.RunHealthCheck(ctx)
   140  	return response, nil
   141  }
   142  
   143  func (s *server) ReloadSchema(ctx context.Context, request *tabletmanagerdatapb.ReloadSchemaRequest) (response *tabletmanagerdatapb.ReloadSchemaResponse, err error) {
   144  	defer s.tm.HandleRPCPanic(ctx, "ReloadSchema", request, response, false /*verbose*/, &err)
   145  	ctx = callinfo.GRPCCallInfo(ctx)
   146  	response = &tabletmanagerdatapb.ReloadSchemaResponse{}
   147  	return response, s.tm.ReloadSchema(ctx, request.WaitPosition)
   148  }
   149  
   150  func (s *server) PreflightSchema(ctx context.Context, request *tabletmanagerdatapb.PreflightSchemaRequest) (response *tabletmanagerdatapb.PreflightSchemaResponse, err error) {
   151  	defer s.tm.HandleRPCPanic(ctx, "PreflightSchema", request, response, true /*verbose*/, &err)
   152  	ctx = callinfo.GRPCCallInfo(ctx)
   153  	response = &tabletmanagerdatapb.PreflightSchemaResponse{}
   154  	results, err := s.tm.PreflightSchema(ctx, request.Changes)
   155  	if err == nil {
   156  		response.ChangeResults = results
   157  	}
   158  	return response, err
   159  }
   160  
   161  func (s *server) ApplySchema(ctx context.Context, request *tabletmanagerdatapb.ApplySchemaRequest) (response *tabletmanagerdatapb.ApplySchemaResponse, err error) {
   162  	defer s.tm.HandleRPCPanic(ctx, "ApplySchema", request, response, true /*verbose*/, &err)
   163  	ctx = callinfo.GRPCCallInfo(ctx)
   164  	response = &tabletmanagerdatapb.ApplySchemaResponse{}
   165  	scr, err := s.tm.ApplySchema(ctx, &tmutils.SchemaChange{
   166  		SQL:              request.Sql,
   167  		Force:            request.Force,
   168  		AllowReplication: request.AllowReplication,
   169  		BeforeSchema:     request.BeforeSchema,
   170  		AfterSchema:      request.AfterSchema,
   171  		SQLMode:          request.SqlMode,
   172  	})
   173  	if err == nil {
   174  		response.BeforeSchema = scr.BeforeSchema
   175  		response.AfterSchema = scr.AfterSchema
   176  	}
   177  	return response, err
   178  }
   179  
   180  func (s *server) LockTables(ctx context.Context, req *tabletmanagerdatapb.LockTablesRequest) (*tabletmanagerdatapb.LockTablesResponse, error) {
   181  	err := s.tm.LockTables(ctx)
   182  	if err != nil {
   183  		return nil, err
   184  	}
   185  	return &tabletmanagerdatapb.LockTablesResponse{}, nil
   186  }
   187  
   188  func (s *server) UnlockTables(ctx context.Context, req *tabletmanagerdatapb.UnlockTablesRequest) (*tabletmanagerdatapb.UnlockTablesResponse, error) {
   189  	err := s.tm.UnlockTables(ctx)
   190  	if err != nil {
   191  		return nil, err
   192  	}
   193  	return &tabletmanagerdatapb.UnlockTablesResponse{}, nil
   194  }
   195  
   196  func (s *server) ExecuteQuery(ctx context.Context, request *tabletmanagerdatapb.ExecuteQueryRequest) (response *tabletmanagerdatapb.ExecuteQueryResponse, err error) {
   197  	defer s.tm.HandleRPCPanic(ctx, "ExecuteQuery", request, response, false /*verbose*/, &err)
   198  	ctx = callinfo.GRPCCallInfo(ctx)
   199  
   200  	// Attach the callerID as the EffectiveCallerID.
   201  	if request.CallerId != nil {
   202  		ctx = callerid.NewContext(ctx, request.CallerId, &querypb.VTGateCallerID{Username: request.CallerId.Principal})
   203  	}
   204  	response = &tabletmanagerdatapb.ExecuteQueryResponse{}
   205  	qr, err := s.tm.ExecuteQuery(ctx, request)
   206  	if err != nil {
   207  		return nil, vterrors.ToGRPC(err)
   208  	}
   209  	response.Result = qr
   210  	return response, nil
   211  }
   212  
   213  func (s *server) ExecuteFetchAsDba(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsDbaRequest) (response *tabletmanagerdatapb.ExecuteFetchAsDbaResponse, err error) {
   214  	defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsDba", request, response, false /*verbose*/, &err)
   215  	ctx = callinfo.GRPCCallInfo(ctx)
   216  	response = &tabletmanagerdatapb.ExecuteFetchAsDbaResponse{}
   217  	qr, err := s.tm.ExecuteFetchAsDba(ctx, request)
   218  	if err != nil {
   219  		return nil, vterrors.ToGRPC(err)
   220  	}
   221  	response.Result = qr
   222  	return response, nil
   223  }
   224  
   225  func (s *server) ExecuteFetchAsAllPrivs(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest) (response *tabletmanagerdatapb.ExecuteFetchAsAllPrivsResponse, err error) {
   226  	defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsAllPrivs", request, response, false /*verbose*/, &err)
   227  	ctx = callinfo.GRPCCallInfo(ctx)
   228  	response = &tabletmanagerdatapb.ExecuteFetchAsAllPrivsResponse{}
   229  	qr, err := s.tm.ExecuteFetchAsAllPrivs(ctx, request)
   230  	if err != nil {
   231  		return nil, vterrors.ToGRPC(err)
   232  	}
   233  	response.Result = qr
   234  	return response, nil
   235  }
   236  
   237  func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (response *tabletmanagerdatapb.ExecuteFetchAsAppResponse, err error) {
   238  	defer s.tm.HandleRPCPanic(ctx, "ExecuteFetchAsApp", request, response, false /*verbose*/, &err)
   239  	ctx = callinfo.GRPCCallInfo(ctx)
   240  	response = &tabletmanagerdatapb.ExecuteFetchAsAppResponse{}
   241  	qr, err := s.tm.ExecuteFetchAsApp(ctx, request)
   242  	if err != nil {
   243  		return nil, vterrors.ToGRPC(err)
   244  	}
   245  	response.Result = qr
   246  	return response, nil
   247  }
   248  
   249  //
   250  // Replication related methods
   251  //
   252  
   253  func (s *server) ReplicationStatus(ctx context.Context, request *tabletmanagerdatapb.ReplicationStatusRequest) (response *tabletmanagerdatapb.ReplicationStatusResponse, err error) {
   254  	defer s.tm.HandleRPCPanic(ctx, "ReplicationStatus", request, response, false /*verbose*/, &err)
   255  	ctx = callinfo.GRPCCallInfo(ctx)
   256  	response = &tabletmanagerdatapb.ReplicationStatusResponse{}
   257  	status, err := s.tm.ReplicationStatus(ctx)
   258  	if err == nil {
   259  		response.Status = status
   260  	}
   261  	return response, err
   262  }
   263  
   264  func (s *server) FullStatus(ctx context.Context, request *tabletmanagerdatapb.FullStatusRequest) (response *tabletmanagerdatapb.FullStatusResponse, err error) {
   265  	defer s.tm.HandleRPCPanic(ctx, "FullStatus", request, response, false /*verbose*/, &err)
   266  	ctx = callinfo.GRPCCallInfo(ctx)
   267  	response = &tabletmanagerdatapb.FullStatusResponse{}
   268  	status, err := s.tm.FullStatus(ctx)
   269  	if err == nil {
   270  		response.Status = status
   271  	}
   272  	return response, err
   273  }
   274  
   275  func (s *server) PrimaryStatus(ctx context.Context, request *tabletmanagerdatapb.PrimaryStatusRequest) (response *tabletmanagerdatapb.PrimaryStatusResponse, err error) {
   276  	defer s.tm.HandleRPCPanic(ctx, "PrimaryStatus", request, response, false /*verbose*/, &err)
   277  	ctx = callinfo.GRPCCallInfo(ctx)
   278  	response = &tabletmanagerdatapb.PrimaryStatusResponse{}
   279  	status, err := s.tm.PrimaryStatus(ctx)
   280  	if err == nil {
   281  		response.Status = status
   282  	}
   283  	return response, err
   284  }
   285  
   286  func (s *server) PrimaryPosition(ctx context.Context, request *tabletmanagerdatapb.PrimaryPositionRequest) (response *tabletmanagerdatapb.PrimaryPositionResponse, err error) {
   287  	defer s.tm.HandleRPCPanic(ctx, "PrimaryPosition", request, response, false /*verbose*/, &err)
   288  	ctx = callinfo.GRPCCallInfo(ctx)
   289  	response = &tabletmanagerdatapb.PrimaryPositionResponse{}
   290  	position, err := s.tm.PrimaryPosition(ctx)
   291  	if err == nil {
   292  		response.Position = position
   293  	}
   294  	return response, err
   295  }
   296  
   297  func (s *server) WaitForPosition(ctx context.Context, request *tabletmanagerdatapb.WaitForPositionRequest) (response *tabletmanagerdatapb.WaitForPositionResponse, err error) {
   298  	defer s.tm.HandleRPCPanic(ctx, "WaitForPosition", request, response, false /*verbose*/, &err)
   299  	ctx = callinfo.GRPCCallInfo(ctx)
   300  	response = &tabletmanagerdatapb.WaitForPositionResponse{}
   301  	return response, s.tm.WaitForPosition(ctx, request.Position)
   302  }
   303  
   304  func (s *server) StopReplication(ctx context.Context, request *tabletmanagerdatapb.StopReplicationRequest) (response *tabletmanagerdatapb.StopReplicationResponse, err error) {
   305  	defer s.tm.HandleRPCPanic(ctx, "StopReplication", request, response, true /*verbose*/, &err)
   306  	ctx = callinfo.GRPCCallInfo(ctx)
   307  	response = &tabletmanagerdatapb.StopReplicationResponse{}
   308  	return response, s.tm.StopReplication(ctx)
   309  }
   310  
   311  func (s *server) StopReplicationMinimum(ctx context.Context, request *tabletmanagerdatapb.StopReplicationMinimumRequest) (response *tabletmanagerdatapb.StopReplicationMinimumResponse, err error) {
   312  	defer s.tm.HandleRPCPanic(ctx, "StopReplicationMinimum", request, response, true /*verbose*/, &err)
   313  	ctx = callinfo.GRPCCallInfo(ctx)
   314  	response = &tabletmanagerdatapb.StopReplicationMinimumResponse{}
   315  	position, err := s.tm.StopReplicationMinimum(ctx, request.Position, time.Duration(request.WaitTimeout))
   316  	if err == nil {
   317  		response.Position = position
   318  	}
   319  	return response, err
   320  }
   321  
   322  func (s *server) StartReplication(ctx context.Context, request *tabletmanagerdatapb.StartReplicationRequest) (response *tabletmanagerdatapb.StartReplicationResponse, err error) {
   323  	defer s.tm.HandleRPCPanic(ctx, "StartReplication", request, response, true /*verbose*/, &err)
   324  	ctx = callinfo.GRPCCallInfo(ctx)
   325  	response = &tabletmanagerdatapb.StartReplicationResponse{}
   326  	return response, s.tm.StartReplication(ctx, request.GetSemiSync())
   327  }
   328  
   329  func (s *server) StartReplicationUntilAfter(ctx context.Context, request *tabletmanagerdatapb.StartReplicationUntilAfterRequest) (response *tabletmanagerdatapb.StartReplicationUntilAfterResponse, err error) {
   330  	defer s.tm.HandleRPCPanic(ctx, "StartReplication", request, response, true /*verbose*/, &err)
   331  	ctx = callinfo.GRPCCallInfo(ctx)
   332  	response = &tabletmanagerdatapb.StartReplicationUntilAfterResponse{}
   333  	return response, s.tm.StartReplicationUntilAfter(ctx, request.Position, time.Duration(request.WaitTimeout))
   334  }
   335  
   336  func (s *server) GetReplicas(ctx context.Context, request *tabletmanagerdatapb.GetReplicasRequest) (response *tabletmanagerdatapb.GetReplicasResponse, err error) {
   337  	defer s.tm.HandleRPCPanic(ctx, "GetReplicas", request, response, false /*verbose*/, &err)
   338  	ctx = callinfo.GRPCCallInfo(ctx)
   339  	response = &tabletmanagerdatapb.GetReplicasResponse{}
   340  	addrs, err := s.tm.GetReplicas(ctx)
   341  	if err == nil {
   342  		response.Addrs = addrs
   343  	}
   344  	return response, err
   345  }
   346  
   347  func (s *server) VExec(ctx context.Context, request *tabletmanagerdatapb.VExecRequest) (response *tabletmanagerdatapb.VExecResponse, err error) {
   348  	defer s.tm.HandleRPCPanic(ctx, "VExec", request, response, true /*verbose*/, &err)
   349  	ctx = callinfo.GRPCCallInfo(ctx)
   350  	response = &tabletmanagerdatapb.VExecResponse{}
   351  	response.Result, err = s.tm.VExec(ctx, request.Query, request.Workflow, request.Keyspace)
   352  	return response, err
   353  }
   354  
   355  func (s *server) VReplicationExec(ctx context.Context, request *tabletmanagerdatapb.VReplicationExecRequest) (response *tabletmanagerdatapb.VReplicationExecResponse, err error) {
   356  	defer s.tm.HandleRPCPanic(ctx, "VReplicationExec", request, response, true /*verbose*/, &err)
   357  	ctx = callinfo.GRPCCallInfo(ctx)
   358  	response = &tabletmanagerdatapb.VReplicationExecResponse{}
   359  	response.Result, err = s.tm.VReplicationExec(ctx, request.Query)
   360  	return response, err
   361  }
   362  
   363  func (s *server) VReplicationWaitForPos(ctx context.Context, request *tabletmanagerdatapb.VReplicationWaitForPosRequest) (response *tabletmanagerdatapb.VReplicationWaitForPosResponse, err error) {
   364  	defer s.tm.HandleRPCPanic(ctx, "VReplicationWaitForPos", request, response, true /*verbose*/, &err)
   365  	ctx = callinfo.GRPCCallInfo(ctx)
   366  	err = s.tm.VReplicationWaitForPos(ctx, int(request.Id), request.Position)
   367  	return &tabletmanagerdatapb.VReplicationWaitForPosResponse{}, err
   368  }
   369  
   370  func (s *server) VDiff(ctx context.Context, request *tabletmanagerdatapb.VDiffRequest) (response *tabletmanagerdatapb.VDiffResponse, err error) {
   371  	defer s.tm.HandleRPCPanic(ctx, "VDiff", request, response, true /*verbose*/, &err)
   372  	ctx = callinfo.GRPCCallInfo(ctx)
   373  	response, err = s.tm.VDiff(ctx, request)
   374  	return response, err
   375  }
   376  
   377  //
   378  // Reparenting related functions
   379  //
   380  
   381  func (s *server) ResetReplication(ctx context.Context, request *tabletmanagerdatapb.ResetReplicationRequest) (response *tabletmanagerdatapb.ResetReplicationResponse, err error) {
   382  	defer s.tm.HandleRPCPanic(ctx, "ResetReplication", request, response, true /*verbose*/, &err)
   383  	ctx = callinfo.GRPCCallInfo(ctx)
   384  	response = &tabletmanagerdatapb.ResetReplicationResponse{}
   385  	return response, s.tm.ResetReplication(ctx)
   386  }
   387  
   388  func (s *server) InitPrimary(ctx context.Context, request *tabletmanagerdatapb.InitPrimaryRequest) (response *tabletmanagerdatapb.InitPrimaryResponse, err error) {
   389  	defer s.tm.HandleRPCPanic(ctx, "InitPrimary", request, response, true /*verbose*/, &err)
   390  	ctx = callinfo.GRPCCallInfo(ctx)
   391  	response = &tabletmanagerdatapb.InitPrimaryResponse{}
   392  	position, err := s.tm.InitPrimary(ctx, request.GetSemiSync())
   393  	if err == nil {
   394  		response.Position = position
   395  	}
   396  	return response, err
   397  }
   398  
   399  func (s *server) PopulateReparentJournal(ctx context.Context, request *tabletmanagerdatapb.PopulateReparentJournalRequest) (response *tabletmanagerdatapb.PopulateReparentJournalResponse, err error) {
   400  	defer s.tm.HandleRPCPanic(ctx, "PopulateReparentJournal", request, response, false /*verbose*/, &err)
   401  	ctx = callinfo.GRPCCallInfo(ctx)
   402  	response = &tabletmanagerdatapb.PopulateReparentJournalResponse{}
   403  	return response, s.tm.PopulateReparentJournal(ctx, request.TimeCreatedNs, request.ActionName, request.PrimaryAlias, request.ReplicationPosition)
   404  }
   405  
   406  func (s *server) InitReplica(ctx context.Context, request *tabletmanagerdatapb.InitReplicaRequest) (response *tabletmanagerdatapb.InitReplicaResponse, err error) {
   407  	defer s.tm.HandleRPCPanic(ctx, "InitReplica", request, response, true /*verbose*/, &err)
   408  	ctx = callinfo.GRPCCallInfo(ctx)
   409  	response = &tabletmanagerdatapb.InitReplicaResponse{}
   410  	return response, s.tm.InitReplica(ctx, request.Parent, request.ReplicationPosition, request.TimeCreatedNs, request.GetSemiSync())
   411  }
   412  
   413  func (s *server) DemotePrimary(ctx context.Context, request *tabletmanagerdatapb.DemotePrimaryRequest) (response *tabletmanagerdatapb.DemotePrimaryResponse, err error) {
   414  	defer s.tm.HandleRPCPanic(ctx, "DemotePrimary", request, response, true /*verbose*/, &err)
   415  	ctx = callinfo.GRPCCallInfo(ctx)
   416  	response = &tabletmanagerdatapb.DemotePrimaryResponse{}
   417  	status, err := s.tm.DemotePrimary(ctx)
   418  	if err == nil {
   419  		response.PrimaryStatus = status
   420  	}
   421  	return response, err
   422  }
   423  
   424  func (s *server) UndoDemotePrimary(ctx context.Context, request *tabletmanagerdatapb.UndoDemotePrimaryRequest) (response *tabletmanagerdatapb.UndoDemotePrimaryResponse, err error) {
   425  	defer s.tm.HandleRPCPanic(ctx, "UndoDemotePrimary", request, response, true /*verbose*/, &err)
   426  	ctx = callinfo.GRPCCallInfo(ctx)
   427  	response = &tabletmanagerdatapb.UndoDemotePrimaryResponse{}
   428  	err = s.tm.UndoDemotePrimary(ctx, request.GetSemiSync())
   429  	return response, err
   430  }
   431  
   432  func (s *server) ReplicaWasPromoted(ctx context.Context, request *tabletmanagerdatapb.ReplicaWasPromotedRequest) (response *tabletmanagerdatapb.ReplicaWasPromotedResponse, err error) {
   433  	defer s.tm.HandleRPCPanic(ctx, "ReplicaWasPromoted", request, response, true /*verbose*/, &err)
   434  	ctx = callinfo.GRPCCallInfo(ctx)
   435  	response = &tabletmanagerdatapb.ReplicaWasPromotedResponse{}
   436  	return response, s.tm.ReplicaWasPromoted(ctx)
   437  }
   438  
   439  func (s *server) ResetReplicationParameters(ctx context.Context, request *tabletmanagerdatapb.ResetReplicationParametersRequest) (response *tabletmanagerdatapb.ResetReplicationParametersResponse, err error) {
   440  	defer s.tm.HandleRPCPanic(ctx, "ResetReplicationParameters", request, response, true /*verbose*/, &err)
   441  	ctx = callinfo.GRPCCallInfo(ctx)
   442  	response = &tabletmanagerdatapb.ResetReplicationParametersResponse{}
   443  	return response, s.tm.ResetReplicationParameters(ctx)
   444  }
   445  
   446  func (s *server) SetReplicationSource(ctx context.Context, request *tabletmanagerdatapb.SetReplicationSourceRequest) (response *tabletmanagerdatapb.SetReplicationSourceResponse, err error) {
   447  	defer s.tm.HandleRPCPanic(ctx, "SetReplicationSource", request, response, true /*verbose*/, &err)
   448  	ctx = callinfo.GRPCCallInfo(ctx)
   449  	response = &tabletmanagerdatapb.SetReplicationSourceResponse{}
   450  	return response, s.tm.SetReplicationSource(ctx, request.Parent, request.TimeCreatedNs, request.WaitPosition, request.ForceStartReplication, request.GetSemiSync())
   451  }
   452  
   453  func (s *server) ReplicaWasRestarted(ctx context.Context, request *tabletmanagerdatapb.ReplicaWasRestartedRequest) (response *tabletmanagerdatapb.ReplicaWasRestartedResponse, err error) {
   454  	defer s.tm.HandleRPCPanic(ctx, "ReplicaWasRestarted", request, response, true /*verbose*/, &err)
   455  	ctx = callinfo.GRPCCallInfo(ctx)
   456  	response = &tabletmanagerdatapb.ReplicaWasRestartedResponse{}
   457  	return response, s.tm.ReplicaWasRestarted(ctx, request.Parent)
   458  }
   459  
   460  func (s *server) StopReplicationAndGetStatus(ctx context.Context, request *tabletmanagerdatapb.StopReplicationAndGetStatusRequest) (response *tabletmanagerdatapb.StopReplicationAndGetStatusResponse, err error) {
   461  	defer s.tm.HandleRPCPanic(ctx, "StopReplicationAndGetStatus", request, response, true /*verbose*/, &err)
   462  	ctx = callinfo.GRPCCallInfo(ctx)
   463  	response = &tabletmanagerdatapb.StopReplicationAndGetStatusResponse{}
   464  	statusResponse, err := s.tm.StopReplicationAndGetStatus(ctx, request.StopReplicationMode)
   465  	if err == nil {
   466  		response.Status = statusResponse.Status
   467  	}
   468  	return response, err
   469  }
   470  
   471  func (s *server) PromoteReplica(ctx context.Context, request *tabletmanagerdatapb.PromoteReplicaRequest) (response *tabletmanagerdatapb.PromoteReplicaResponse, err error) {
   472  	defer s.tm.HandleRPCPanic(ctx, "PromoteReplica", request, response, true /*verbose*/, &err)
   473  	ctx = callinfo.GRPCCallInfo(ctx)
   474  	response = &tabletmanagerdatapb.PromoteReplicaResponse{}
   475  	position, err := s.tm.PromoteReplica(ctx, request.GetSemiSync())
   476  	if err == nil {
   477  		response.Position = position
   478  	}
   479  	return response, err
   480  }
   481  
   482  func (s *server) Backup(request *tabletmanagerdatapb.BackupRequest, stream tabletmanagerservicepb.TabletManager_BackupServer) (err error) {
   483  	ctx := stream.Context()
   484  	defer s.tm.HandleRPCPanic(ctx, "Backup", request, nil, true /*verbose*/, &err)
   485  	ctx = callinfo.GRPCCallInfo(ctx)
   486  
   487  	// create a logger, send the result back to the caller
   488  	logger := logutil.NewCallbackLogger(func(e *logutilpb.Event) {
   489  		// If the client disconnects, we will just fail
   490  		// to send the log events, but won't interrupt
   491  		// the backup.
   492  		stream.Send(&tabletmanagerdatapb.BackupResponse{
   493  			Event: e,
   494  		})
   495  	})
   496  
   497  	return s.tm.Backup(ctx, logger, request)
   498  }
   499  
   500  func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBackupRequest, stream tabletmanagerservicepb.TabletManager_RestoreFromBackupServer) (err error) {
   501  	ctx := stream.Context()
   502  	defer s.tm.HandleRPCPanic(ctx, "RestoreFromBackup", request, nil, true /*verbose*/, &err)
   503  	ctx = callinfo.GRPCCallInfo(ctx)
   504  
   505  	// create a logger, send the result back to the caller
   506  	logger := logutil.NewCallbackLogger(func(e *logutilpb.Event) {
   507  		// If the client disconnects, we will just fail
   508  		// to send the log events, but won't interrupt
   509  		// the backup.
   510  		stream.Send(&tabletmanagerdatapb.RestoreFromBackupResponse{
   511  			Event: e,
   512  		})
   513  	})
   514  
   515  	return s.tm.RestoreFromBackup(ctx, logger, request)
   516  }
   517  
   518  // registration glue
   519  
   520  func init() {
   521  	tabletmanager.RegisterTabletManagers = append(tabletmanager.RegisterTabletManagers, func(tm *tabletmanager.TabletManager) {
   522  		if servenv.GRPCCheckServiceMap("tabletmanager") {
   523  			tabletmanagerservicepb.RegisterTabletManagerServer(servenv.GRPCServer, &server{tm: tm})
   524  		}
   525  	})
   526  }
   527  
   528  // RegisterForTest will register the RPC, to be used by test instances only
   529  func RegisterForTest(s *grpc.Server, tm tabletmanager.RPCTM) {
   530  	tabletmanagerservicepb.RegisterTabletManagerServer(s, &server{tm: tm})
   531  }