@@ -314,10 +314,8 @@ func (s *Server) ServingTablet(tablet string) *pb.Tablet {
314
314
defer s .RUnlock ()
315
315
316
316
for _ , group := range s .state .Groups {
317
- for key , tab := range group .Tablets {
318
- if key == tablet {
319
- return tab
320
- }
317
+ if tab , ok := group .Tablets [tablet ]; ok {
318
+ return tab
321
319
}
322
320
}
323
321
return nil
@@ -339,10 +337,8 @@ func (s *Server) servingTablet(tablet string) *pb.Tablet {
339
337
s .AssertRLock ()
340
338
341
339
for _ , group := range s .state .Groups {
342
- for key , tab := range group .Tablets {
343
- if key == tablet {
344
- return tab
345
- }
340
+ if tab , ok := group .Tablets [tablet ]; ok {
341
+ return tab
346
342
}
347
343
}
348
344
return nil
@@ -408,6 +404,71 @@ func (s *Server) createProposals(dst *pb.Group) ([]*pb.ZeroProposal, error) {
408
404
return res , nil
409
405
}
410
406
407
+ func (s * Server ) Inform (ctx context.Context , req * pb.TabletRequest ) (* pb.TabletResponse , error ) {
408
+ ctx , span := otrace .StartSpan (ctx , "Zero.Inform" )
409
+ defer span .End ()
410
+ if req == nil || len (req .Tablets ) == 0 {
411
+ return nil , errors .Errorf ("Tablets are empty in %+v" , req )
412
+ }
413
+
414
+ if req .GroupId == 0 {
415
+ return nil , errors .Errorf ("Group ID is Zero in %+v" , req )
416
+ }
417
+
418
+ tablets := make ([]* pb.Tablet , 0 )
419
+ unknownTablets := make ([]* pb.Tablet , 0 )
420
+ for _ , t := range req .Tablets {
421
+ tab := s .ServingTablet (t .Predicate )
422
+ span .Annotatef (nil , "Tablet for %s: %+v" , t .Predicate , tab )
423
+ switch {
424
+ case tab != nil && ! t .Force :
425
+ tablets = append (tablets , t )
426
+ case t .ReadOnly :
427
+ tablets = append (tablets , & pb.Tablet {})
428
+ default :
429
+ unknownTablets = append (unknownTablets , t )
430
+ }
431
+ }
432
+
433
+ if len (unknownTablets ) == 0 {
434
+ return & pb.TabletResponse {
435
+ Tablets : tablets ,
436
+ }, nil
437
+ }
438
+
439
+ // Set the tablet to be served by this server's group.
440
+ var proposal pb.ZeroProposal
441
+ proposal .Tablets = make ([]* pb.Tablet , 0 )
442
+ for _ , t := range unknownTablets {
443
+ if x .IsReservedPredicate (t .Predicate ) {
444
+ // Force all the reserved predicates to be allocated to group 1.
445
+ // This is to make it easier to stream ACL updates to all alpha servers
446
+ // since they only need to open one pipeline to receive updates for all
447
+ // ACL predicates.
448
+ // This will also make it easier to restore the reserved predicates after
449
+ // a DropAll operation.
450
+ t .GroupId = 1
451
+ }
452
+ proposal .Tablets = append (proposal .Tablets , t )
453
+ }
454
+
455
+ if err := s .Node .proposeAndWait (ctx , & proposal ); err != nil && err != errTabletAlreadyServed {
456
+ span .Annotatef (nil , "While proposing tablet: %v" , err )
457
+ return nil , err
458
+ }
459
+
460
+ for _ , t := range unknownTablets {
461
+ tab := s .ServingTablet (t .Predicate )
462
+ x .AssertTrue (tab != nil )
463
+ span .Annotatef (nil , "Now serving tablet for %s: %+v" , t .Predicate , tab )
464
+ tablets = append (tablets , tab )
465
+ }
466
+
467
+ return & pb.TabletResponse {
468
+ Tablets : tablets ,
469
+ }, nil
470
+ }
471
+
411
472
// RemoveNode removes the given node from the given group.
412
473
// It's the user's responsibility to ensure that node doesn't come back again
413
474
// before calling the api.
0 commit comments