(dst *pb.Group)
| 342 | } |
| 343 | |
| 344 | func (s *Server) createProposals(dst *pb.Group) ([]*pb.ZeroProposal, error) { |
| 345 | var res []*pb.ZeroProposal |
| 346 | if len(dst.Members) > 1 { |
| 347 | return res, errors.Errorf("Create Proposal: Invalid group: %+v", dst) |
| 348 | } |
| 349 | |
| 350 | s.RLock() |
| 351 | defer s.RUnlock() |
| 352 | // There is only one member. We use for loop because we don't know what the mid is. |
| 353 | for mid, dstMember := range dst.Members { |
| 354 | group, has := s.state.Groups[dstMember.GroupId] |
| 355 | if !has { |
| 356 | return res, errors.Errorf("Unknown group for member: %+v", dstMember) |
| 357 | } |
| 358 | srcMember, has := group.Members[mid] |
| 359 | if !has { |
| 360 | return res, errors.Errorf("Unknown member: %+v", dstMember) |
| 361 | } |
| 362 | if srcMember.Addr != dstMember.Addr || |
| 363 | srcMember.Leader != dstMember.Leader { |
| 364 | |
| 365 | proposal := &pb.ZeroProposal{ |
| 366 | Member: dstMember, |
| 367 | } |
| 368 | res = append(res, proposal) |
| 369 | } |
| 370 | if !dstMember.Leader { |
| 371 | // Don't continue to tablets if request is not from the leader. |
| 372 | return res, nil |
| 373 | } |
| 374 | if dst.SnapshotTs > group.SnapshotTs { |
| 375 | res = append(res, &pb.ZeroProposal{ |
| 376 | SnapshotTs: map[uint32]uint64{dstMember.GroupId: dst.SnapshotTs}, |
| 377 | }) |
| 378 | } |
| 379 | } |
| 380 | |
| 381 | var tablets []*pb.Tablet |
| 382 | for key, dstTablet := range dst.Tablets { |
| 383 | group, has := s.state.Groups[dstTablet.GroupId] |
| 384 | if !has { |
| 385 | return res, errors.Errorf("Unknown group for tablet: %+v", dstTablet) |
| 386 | } |
| 387 | srcTablet, has := group.Tablets[key] |
| 388 | if !has { |
| 389 | // Tablet moved to new group |
| 390 | continue |
| 391 | } |
| 392 | |
| 393 | s := float64(srcTablet.OnDiskBytes) |
| 394 | d := float64(dstTablet.OnDiskBytes) |
| 395 | if dstTablet.Remove || (s == 0 && d > 0) || (s > 0 && math.Abs(d/s-1) > 0.1) { |
| 396 | dstTablet.Force = false |
| 397 | tablets = append(tablets, dstTablet) |
| 398 | } |
| 399 | } |
| 400 | |
| 401 | if len(tablets) > 0 { |
no test coverage detected