package com.alibaba.doris.admin.web.configer.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import com.alibaba.doris.admin.dataobject.PhysicalNodeDO;
import com.alibaba.doris.admin.service.expansion.processor.ExpansionMigrateProcessor;
import com.alibaba.doris.admin.service.failover.node.check.NodeAdminStatusWrapper;
import com.alibaba.doris.admin.service.failover.node.check.NodeStatusManager;
import com.alibaba.doris.admin.web.configer.support.NodeForView;
import com.alibaba.doris.admin.web.configer.support.SequenceForView;
import com.alibaba.doris.common.MigrateStatusEnum;
import com.alibaba.doris.common.NodeRouteStatus;
import com.alibaba.doris.common.StoreNodeSequenceEnum;
public class PhysicalNodeUtil {
public static Map<Integer, SequenceForView> getSortedNodeMap(List<PhysicalNodeDO> physicalNodeList) {
Map<Integer, SequenceForView> nodemap = new LinkedHashMap<Integer, SequenceForView>();
Comparator<PhysicalNodeDO> nodeComparator = new Comparator<PhysicalNodeDO>() {
public int compare(PhysicalNodeDO node1, PhysicalNodeDO node2) {
if (node1.getSerialId() < 0) return 1;
if (node2.getSerialId() < 0) return -1;
if (node1.getSerialId() == 0 && node2.getSerialId() > 0) return 1;
if (node1.getSerialId() > 0 && node2.getSerialId() == 0) return -1;
return node1.getSerialId() - node2.getSerialId() == 0 ? node1.getLogicalId() - node2.getLogicalId() : node1.getSerialId()
- node2.getSerialId();
}
};
Collections.sort(physicalNodeList, nodeComparator);
for (PhysicalNodeDO physicalNodeDO : physicalNodeList) {
int storeNodeSequence = physicalNodeDO.getSerialId();
SequenceForView sequenceForView = nodemap.get(storeNodeSequence);
boolean isSequenceMigrating = ExpansionMigrateProcessor.getInstance().isMigrating(
StoreNodeSequenceEnum.getTypeByValue(storeNodeSequence));
if (sequenceForView == null) {
sequenceForView = new SequenceForView();
}
sequenceForView.setSequenceMigrating(isSequenceMigrating);
List<NodeForView> servicelist = sequenceForView.getNodeViewList();
NodeForView view = new NodeForView();
view.setPhysicalNodeDO(physicalNodeDO);
NodeAdminStatusWrapper statusWrapper = NodeStatusManager.getInstance().getNodeAdminStatus(
view.getPhysicalId());
view.setHealthStatus(statusWrapper.getNodeHealth().toString());
MigrateStatusEnum migrateStatus = statusWrapper.getMigrateStatus();
view.setMigrationStatus(migrateStatus == null ? null : migrateStatus.getValue());
view.setMigrationStatusDetail(statusWrapper.getMigrateStatusDetail());
view.setMigrateProgress(statusWrapper.getMigrateProgress());
view.setRouteStatus(NodeRouteStatus.OK.equals(statusWrapper.getNodeRouteStatus()) ? "OK" : "Temp Failed");
if (servicelist == null) {
List<NodeForView> nodeList = new ArrayList<NodeForView>();
nodeList.add(view);
sequenceForView.setNodeViewList(nodeList);
nodemap.put(physicalNodeDO.getSerialId(), sequenceForView);
} else {
servicelist.add(view);
}
}
return nodemap;
}
public static boolean isAllNodesOk(List<StoreNodeSequenceEnum> exceptSequences) {
NodeStatusManager nodeStatusManager = NodeStatusManager.getInstance();
List<NodeAdminStatusWrapper> nodesStatus = nodeStatusManager.getAllNodeAdminStatus();
if (nodesStatus == null || nodesStatus.size() == 0) return false;
for (NodeAdminStatusWrapper wrapper : nodesStatus) {
if (wrapper.getNodeRouteStatus().getValue() != NodeRouteStatus.OK.getValue()
&& !exceptSequences.contains(wrapper.getStoreNode().getSequence())) {
return false;
}
}
return true;
}
public static boolean isLegalMigrateNodes(String[] newNodes) {
Map<String, String> checkMap = new HashMap<String, String>();
for (String node : newNodes) {
if (StringUtils.isBlank(node)) continue;
String[] item = node.split("#");
if (NumberUtils.isDigits(item[1])) {
if (!checkMap.containsKey(item[2])) {
checkMap.put(item[2], item[1]);
} else {
if (!checkMap.get(item[2]).equals(item[1])) {
return false;
}
}
}
}
return true;
}
}