package com.alibaba.doris.admin.service.common.migrate.command; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.alibaba.doris.admin.core.AdminServiceLocator; import com.alibaba.doris.admin.dataobject.PhysicalNodeDO; import com.alibaba.doris.admin.service.common.node.NodesManager; import com.alibaba.doris.algorithm.mirgate.MigrationPair; import com.alibaba.doris.algorithm.mirgate.MigrationRouter; import com.alibaba.doris.algorithm.mirgate.TempFailResolveRouter; import com.alibaba.doris.common.StoreNodeSequenceEnum; import com.alibaba.doris.common.route.MigrationRoutePair; /** * 迁移命令解析 * * @author frank */ public class CommandParser { private static int virtualNodeNum = AdminServiceLocator.getVirtualNodeService() .getVirtualNodeNum(); // TODO // admin.core // give a // method private CommandParser() { } /** * 解析扩容命令 * * @param sourcePhysicalId * @param physicalIdList * @return */ public static List<MigrationRoutePair> parseExpansionCommand(String sourcePhysicalId, List<String> physicalIdList) { PhysicalNodeDO node = NodesManager.getInstance().getNode(sourcePhysicalId); int oldLength = NodesManager.getInstance().getSequenceLenght(node.getSerialId()); int logicNo = node.getLogicalId(); int newLength = oldLength + physicalIdList.size(); MigrationRouter mr = new MigrationRouter(virtualNodeNum, oldLength, newLength); List<MigrationPair> pairList = mr.getMigrationPairOfPNode(logicNo); List<MigrationRoutePair> routePairList = new ArrayList<MigrationRoutePair>(); for (MigrationPair pair : pairList) { MigrationRoutePair mrp = new MigrationRoutePair(); mrp.setTargetPhysicalId(physicalIdList.get(pair.getTarget() - oldLength)); mrp.setVnode(pair.getVnode()); routePairList.add(mrp); } return routePairList; } /** * 解析失效恢复命令 * * @param sourcePhysicalId * @param targetPhysicalId * @return */ public static List<MigrationRoutePair> parseFailCommand(String sourcePhysicalId, String targetPhysicalId) { PhysicalNodeDO sourceNode = NodesManager.getInstance().getNode(sourcePhysicalId); int sourceSequenceLength = NodesManager.getInstance().getSequenceLenght( sourceNode.getSerialId()); int sourceLogicNo = sourceNode.getLogicalId(); TempFailResolveRouter sfrr = new TempFailResolveRouter(virtualNodeNum, sourceSequenceLength); List<Integer> sourceVirtualList = sfrr.getTempFailMigerateVirtialNodes(sourceLogicNo); PhysicalNodeDO targetNode = NodesManager.getInstance().getNode(targetPhysicalId); int targetSequenceLength = NodesManager.getInstance().getSequenceLenght( targetNode.getSerialId()); int targetLogicNo = targetNode.getLogicalId(); TempFailResolveRouter tfrr = new TempFailResolveRouter(virtualNodeNum, targetSequenceLength); List<Integer> targetVirtualList = tfrr.getTempFailMigerateVirtialNodes(targetLogicNo); Set<Integer> sourceSet = new HashSet<Integer>(sourceVirtualList); List<MigrationRoutePair> routePairList = new ArrayList<MigrationRoutePair>(); int serialId = sourceNode.getSerialId(); for (Integer vNo : targetVirtualList) { if (serialId == StoreNodeSequenceEnum.TEMP_SEQUENCE.getValue() || sourceSet.contains(vNo)) {//临时失效:目标虚拟节点都发送,永久失效:源节点包含目标虚拟节点即发送。 MigrationRoutePair mrp = new MigrationRoutePair(); mrp.setTargetPhysicalId(targetPhysicalId); mrp.setVnode(vNo); routePairList.add(mrp); } } return routePairList; } public static void main(String[] args) { List<String> nl = new ArrayList<String>(); nl.add("1"); System.out.println(parseExpansionCommand("0", nl)); } }