// will block until all keys are migrated func (task *MigrateTask) Migrate(slot *models.Slot, fromGroup, toGroup int, onProgress func(SlotMigrateProgress)) (err error) { groupFrom, err := models.GetGroup(task.zkConn, task.productName, fromGroup) if err != nil { return err } groupTo, err := models.GetGroup(task.zkConn, task.productName, toGroup) if err != nil { return err } fromMaster, err := groupFrom.Master(task.zkConn) if err != nil { return err } toMaster, err := groupTo.Master(task.zkConn) if err != nil { return err } if fromMaster == nil || toMaster == nil { return errors.Trace(ErrGroupMasterNotFound) } c, err := utils.DialTo(fromMaster.Addr, globalEnv.Password()) if err != nil { return err } defer c.Close() _, remain, err := utils.SlotsMgrtTagSlot(c, slot.Id, toMaster.Addr) if err != nil { return err } for remain > 0 { if task.Delay > 0 { time.Sleep(time.Duration(task.Delay) * time.Millisecond) } _, remain, err = utils.SlotsMgrtTagSlot(c, slot.Id, toMaster.Addr) if remain >= 0 { onProgress(SlotMigrateProgress{ SlotId: slot.Id, FromGroup: fromGroup, ToGroup: toGroup, Remain: remain, }) } if err != nil { return err } } return nil }
func apiPromoteServer(server models.Server, param martini.Params) (int, string) { lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("promote server %+v", server)); err != nil { return 500, err.Error() } defer func() { err := lock.Unlock() if err != nil && err != zk.ErrNoNode { log.ErrorErrorf(err, "unlock node failed") } }() group, err := models.GetGroup(safeZkConn, globalEnv.ProductName(), server.GroupId) if err != nil { log.ErrorErrorf(err, "get group %d failed", server.GroupId) return 500, err.Error() } err = group.Promote(safeZkConn, server.Addr, globalEnv.Password()) if err != nil { log.ErrorErrorf(err, "promote group %d failed", server.GroupId) return 500, err.Error() } return jsonRetSucc() }
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) } groupServer, err := models.GetGroup(top.zkConn, top.ProductName, slot.GroupId) if err != nil { return nil, nil, errors.Trace(err) } return slot, groupServer, nil }
func apiGetServerGroup(param martini.Params) (int, string) { id := param["id"] groupId, err := strconv.Atoi(id) if err != nil { log.ErrorErrorf(err, "parse groupid failed") return 500, err.Error() } group, err := models.GetGroup(safeZkConn, globalEnv.ProductName(), groupId) if err != nil { log.ErrorErrorf(err, "get group %d failed", groupId) return 500, err.Error() } b, err := json.MarshalIndent(group, " ", " ") return 200, string(b) }
func apiGetRedisSlotInfoFromGroupId(param martini.Params) (int, string) { groupId, err := strconv.Atoi(param["group_id"]) if err != nil { log.ErrorErrorf(err, "parse groupid failed") return 500, err.Error() } slotId, err := strconv.Atoi(param["slot_id"]) if err != nil { log.ErrorErrorf(err, "parse slotid failed") return 500, err.Error() } g, err := models.GetGroup(safeZkConn, globalEnv.ProductName(), groupId) if err != nil { log.ErrorErrorf(err, "get group %d failed", groupId) return 500, err.Error() } s, err := g.Master(safeZkConn) if err != nil { log.ErrorErrorf(err, "get master of group %d failed", groupId) return 500, err.Error() } if s == nil { return 500, "master not found" } slotInfo, err := utils.SlotsInfo(s.Addr, globalEnv.Password(), slotId, slotId) if err != nil { log.ErrorErrorf(err, "get slot info %d failed", slotId) return 500, err.Error() } out, _ := json.MarshalIndent(map[string]interface{}{ "keys": slotInfo[slotId], "slot_id": slotId, "group_id": groupId, "addr": s.Addr, }, " ", " ") return 200, string(out) }
func (top *Topology) GetGroup(groupId int) (*models.ServerGroup, error) { return models.GetGroup(top.zkConn, top.ProductName, groupId) }