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 }