func apiSlotRangeSet(task RangeSetTask) (int, string) { lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("set slot range, %+v", task)); err != nil { return 500, err.Error() } defer func() { err := lock.Unlock() if err != nil && err != zk.ErrNoNode { log.ErrorErrorf(err, "unlock node failed") } }() // default set online if len(task.Status) == 0 { task.Status = string(models.SLOT_STATUS_ONLINE) } err := models.SetSlotRange(safeZkConn, globalEnv.ProductName(), task.FromSlot, task.ToSlot, task.NewGroupId, models.SlotStatus(task.Status)) if err != nil { log.ErrorErrorf(err, "set slot range [%d,%d] failed", task.FromSlot, task.ToSlot) return 500, err.Error() } return jsonRetSucc() }
// actions func apiActionGC(r *http.Request) (int, string) { r.ParseForm() keep, _ := strconv.Atoi(r.FormValue("keep")) secs, _ := strconv.Atoi(r.FormValue("secs")) lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("action gc")); err != nil { return 500, err.Error() } defer func() { err := lock.Unlock() if err != nil && err != zk.ErrNoNode { log.ErrorErrorf(err, "unlock node failed") } }() var err error if keep >= 0 { err = models.ActionGC(safeZkConn, globalEnv.ProductName(), models.GC_TYPE_N, keep) } else if secs > 0 { err = models.ActionGC(safeZkConn, globalEnv.ProductName(), models.GC_TYPE_SEC, secs) } if err != nil { return 500, err.Error() } return jsonRetSucc() }
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() }
// add redis server to exist server group func apiAddServerToGroup(server models.Server, param martini.Params) (int, string) { groupId, _ := strconv.Atoi(param["id"]) lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("add server to group, %+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") } }() // check group exists first serverGroup := models.NewServerGroup(globalEnv.ProductName(), groupId) exists, err := serverGroup.Exists(safeZkConn) if err != nil { log.ErrorErrorf(err, "check group exits failed") return 500, err.Error() } // create new group if not exists if !exists { if err := serverGroup.Create(safeZkConn); err != nil { return 500, err.Error() } } if err := serverGroup.AddServer(safeZkConn, &server, globalEnv.Password()); err != nil { log.ErrorErrorf(err, "add server to group failed") return 500, err.Error() } return jsonRetSucc() }
// create new server group func apiAddServerGroup(newGroup models.ServerGroup) (int, string) { lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("add group %+v", newGroup)); err != nil { return 500, err.Error() } defer func() { err := lock.Unlock() if err != nil && err != zk.ErrNoNode { log.ErrorErrorf(err, "unlock node failed") } }() newGroup.ProductName = globalEnv.ProductName() exists, err := newGroup.Exists(safeZkConn) if err != nil { log.ErrorErrorf(err, "check group exits failed") return 500, err.Error() } if exists { return 500, "group already exists" } err = newGroup.Create(safeZkConn) if err != nil { log.ErrorErrorf(err, "create node for new group failed") return 500, err.Error() } return jsonRetSucc() }
func TestForceRemoveLock(t *testing.T) { fakeZkConn := zkhelper.NewConn() zkLock := utils.GetZkLock(fakeZkConn, productName) assert.Must(zkLock != nil) zkLock.Lock("force remove lock") zkPath := fmt.Sprintf("/zk/codis/db_%s/LOCK", productName) children, _, err := fakeZkConn.Children(zkPath) assert.MustNoError(err) assert.Must(len(children) != 0) ForceRemoveLock(fakeZkConn, productName) children, _, err = fakeZkConn.Children(zkPath) assert.MustNoError(err) assert.Must(len(children) == 0) }
func apiRemoveServerFromGroup(server models.Server, param martini.Params) (int, string) { groupId, _ := strconv.Atoi(param["id"]) lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("removing server from group, %+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") } }() serverGroup := models.NewServerGroup(globalEnv.ProductName(), groupId) err := serverGroup.RemoveServer(safeZkConn, server.Addr) if err != nil { log.ErrorErrorf(err, "remove group %d failed", groupId) return 500, err.Error() } return jsonRetSucc() }
func apiRemoveServerGroup(param martini.Params) (int, string) { lock := utils.GetZkLock(safeZkConn, globalEnv.ProductName()) if err := lock.LockWithTimeout(0, fmt.Sprintf("removing group %s", param["id"])); err != nil { return 500, err.Error() } defer func() { err := lock.Unlock() if err != nil && err != zk.ErrNoNode { log.ErrorErrorf(err, "unlock node failed") } }() groupId, _ := strconv.Atoi(param["id"]) serverGroup := models.NewServerGroup(globalEnv.ProductName(), groupId) if err := serverGroup.Remove(safeZkConn); err != nil { log.ErrorErrorf(err, "remove server group failed") return 500, err.Error() } return jsonRetSucc() }