func (s *Server) fillSlot(i int, force bool) { if !validSlot(i) { return } if !force && s.slots[i] != nil { //check log.Fatalf("slot %d already filled, slot: %+v", i, s.slots[i]) return } s.clearSlot(i) slotInfo, groupInfo, err := s.top.GetSlotByIndex(i) if err != nil { log.Fatal(errors.ErrorStack(err)) } slot := &Slot{ slotInfo: slotInfo, dst: group.NewGroup(*groupInfo), groupInfo: groupInfo, } log.Infof("fill slot %d, force %v, %+v", i, force, slot.dst) s.pools.AddPool(slot.dst.Master()) if slot.slotInfo.State.Status == models.SLOT_STATUS_MIGRATE { //get migrate src group and fill it from, err := s.top.GetGroup(slot.slotInfo.State.MigrateStatus.From) if err != nil { //todo: retry ? log.Fatal(err) } slot.migrateFrom = group.NewGroup(*from) s.pools.AddPool(slot.migrateFrom.Master()) } s.slots[i] = slot s.counter.Add("FillSlot", 1) }
func (s *Server) fillSlot(i int, force bool) { if !s.isValidSlot(i) { return } slot := s.slots[i] if !force && slot.backend.bc != nil { log.Panicf("slot %04d already filled, slot: %+v", i, slot) } slotInfo, slotGroup, err := s.topo.GetSlotByIndex(i) if err != nil { log.PanicErrorf(err, "get slot by index failed", i) } var from string var addr = group.NewGroup(*slotGroup).Master() if slotInfo.State.Status == models.SLOT_STATUS_MIGRATE { fromGroup, err := s.topo.GetGroup(slotInfo.State.MigrateStatus.From) if err != nil { log.PanicErrorf(err, "get migrate from failed") } from = group.NewGroup(*fromGroup).Master() if from == addr { log.Panicf("set slot %04d migrate from %s to %s", i, from, addr) } } slot.blockAndWait() s.putBackendConn(slot.backend.bc) s.putBackendConn(slot.migrate.bc) slot.reset() slot.Info, slot.Group = slotInfo, slotGroup if len(addr) != 0 { xx := strings.Split(addr, ":") if len(xx) >= 1 { slot.backend.host = []byte(xx[0]) } if len(xx) >= 2 { slot.backend.port = []byte(xx[1]) } slot.backend.addr = addr slot.backend.bc = s.getBackendConn(addr) } if len(from) != 0 { slot.migrate.from = from slot.migrate.bc = s.getBackendConn(from) } if slotInfo.State.Status != models.SLOT_STATUS_PRE_MIGRATE { slot.unblock() } if slot.migrate.bc != nil { log.Infof("fill slot %04d, force %v, backend.addr = %s, migrate.from = %s", i, force, slot.backend.addr, slot.migrate.from) } else { log.Infof("fill slot %04d, force %v, backend.addr = %s", i, force, slot.backend.addr) } }