func runSlotInfo(slotId int) error { s, err := models.GetSlot(zkConn, productName, slotId) if err != nil { return errors.Trace(err) } b, _ := json.MarshalIndent(s, " ", " ") fmt.Println(string(b)) return nil }
func (top *Topology) GetSlotByIndex(i int) (*models.Slot, *models.ServerGroup, error) { slot, err := models.GetSlot(top.zkConn, top.ProductName, i) if err != nil { return nil, nil, errors.Trace(err) } log.Debugf("get slot %d : %+v", i, slot) if slot.State.Status != models.SLOT_STATUS_ONLINE && slot.State.Status != models.SLOT_STATUS_MIGRATE { log.Errorf("slot not online, %+v", slot) } groupServer, err := models.GetGroup(top.zkConn, top.ProductName, slot.GroupId) if err != nil { return nil, nil, errors.Trace(err) } return slot, groupServer, nil }
// migrate multi slots func RunMigrateTask(task *MigrateTask) error { conn := CreateZkConn() defer conn.Close() lock := utils.GetZkLock(conn, productName) to := task.NewGroupId task.Status = MIGRATE_TASK_MIGRATING for slotId := task.FromSlot; slotId <= task.ToSlot; slotId++ { err := func() error { log.Info("start migrate slot:", slotId) lock.Lock(fmt.Sprintf("migrate %d", slotId)) defer func() { err := lock.Unlock() if err != nil { log.Info(err) } }() // set slot status s, err := models.GetSlot(conn, productName, slotId) if err != nil { log.Error(err) return err } if s.State.Status != models.SLOT_STATUS_ONLINE && s.State.Status != models.SLOT_STATUS_MIGRATE { log.Warning("status is not online && migrate", s) return nil } from := s.GroupId if s.State.Status == models.SLOT_STATUS_MIGRATE { from = s.State.MigrateStatus.From } // make sure from group & target group exists exists, err := models.GroupExists(conn, productName, from) if err != nil { return errors.Trace(err) } if !exists { log.Errorf("src group %d not exist when migrate from %d to %d", from, from, to) return errors.NotFoundf("group %d", from) } exists, err = models.GroupExists(conn, productName, to) if err != nil { return errors.Trace(err) } if !exists { return errors.NotFoundf("group %d", to) } // cannot migrate to itself if from == to { log.Warning("from == to, ignore", s) return nil } // modify slot status if err := s.SetMigrateStatus(conn, from, to); err != nil { log.Error(err) return err } // do real migrate err = MigrateSingleSlot(conn, slotId, from, to, task.Delay, task.stopChan) if err != nil { log.Error(err) return err } // migrate done, change slot status back s.State.Status = models.SLOT_STATUS_ONLINE s.State.MigrateStatus.From = models.INVALID_ID s.State.MigrateStatus.To = models.INVALID_ID if err := s.Update(zkConn); err != nil { log.Error(err) return err } return nil }() if err == ErrStopMigrateByUser { log.Info("stop migration job by user") break } else if err != nil { log.Error(err) task.Status = MIGRATE_TASK_ERR return err } task.Percent = (slotId - task.FromSlot + 1) * 100 / (task.ToSlot - task.FromSlot + 1) log.Info("total percent:", task.Percent) } task.Status = MIGRATE_TASK_FINISHED log.Info("migration finished") return nil }