package com.sohu.cache.redis; import com.sohu.cache.web.util.DateUtil; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; /** * Created by yijunzhang on 14-9-26. */ public class ReshardProcess { /** * 存储每个slot迁移的数量 */ private ConcurrentMap<Integer, Long> slotProcessMap = new ConcurrentSkipListMap<Integer, Long>(); /** * 已完成迁移的slot数量 */ private volatile int reshardSlot; /** * 需要迁移的总数 */ private volatile int totalSlot; /** * 0,上线节点 * 1,下线节点 */ private volatile int type; /** * 0:运行中 * 1:完成 * 2:出错 */ private volatile int status; private volatile Date beginTime; private volatile Date endTime; /** * Reshard状态 */ public static enum ReshardStatusEnum { RUNNING(0, "运行中"), FINISH(1, "完成"), ERROR(2, "出错"); private int value; private String info; private final static Map<Integer, ReshardStatusEnum> MAP = new HashMap<Integer, ReshardStatusEnum>(); static { for (ReshardStatusEnum reshardStatusEnum : ReshardStatusEnum.values()) { MAP.put(reshardStatusEnum.getValue(), reshardStatusEnum); } } public static ReshardStatusEnum getReshardStatusEnum(int value) { return MAP.get(value); } private ReshardStatusEnum(int value, String info) { this.value = value; this.info = info; } public int getValue() { return value; } public String getInfo() { return info; } } public ReshardProcess() { beginTime = new Date(); } public Map<Integer, Long> getSlotProcessMap() { return slotProcessMap; } public int getReshardSlot() { return reshardSlot; } public int getTotalSlot() { return totalSlot; } public void setTotalSlot(int totalSlot) { this.totalSlot = totalSlot; } public void addReshardSlot(int slot, long moveCount) { reshardSlot += 1; slotProcessMap.put(slot, moveCount); } public void setStatus(int status) { this.status = status; if (Arrays.asList(ReshardStatusEnum.FINISH.getValue(), ReshardStatusEnum.ERROR.getValue()).contains(status) && endTime == null) { endTime = new Date(); } } public String getStatusDesc() { ReshardStatusEnum reshardStatusEnum = ReshardStatusEnum.getReshardStatusEnum(status); return reshardStatusEnum == null ? "" : reshardStatusEnum.getInfo(); } public void setReshardSlot(int reshardSlot) { this.reshardSlot = reshardSlot; } public int getStatus() { return status; } public int getType() { return type; } public void setType(int type) { this.type = type; } public Date getBeginTime() { return beginTime; } public Date getEndTime() { return endTime; } @Override public String toString() { return "ReshardProcess{" + "slotProcessMap=" + slotProcessMap + ", reshardSlot=" + reshardSlot + ", totalSlot=" + totalSlot + ", type=" + type + ", status=" + status + ", beginTime=" + DateUtil.formatYYYYMMddHHMMSS(beginTime) + ", endTime=" + DateUtil.formatYYYYMMddHHMMSS(endTime) + '}'; } }