package com.alimama.mdrill.topology.assignment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import com.alipay.bluewhale.core.daemon.NodePort;
import com.alipay.bluewhale.core.daemon.supervisor.SupervisorInfo;
import com.alimama.mdrill.topology.MdrillTaskAssignment;
import com.alimama.mdrill.topology.assignment.Utils.*;
public class HostFreePorts {
HostSlots[] ms;
HostSlots[] shard;
HostSlots[] realtime;
private MdrillTaskAssignment params;
public HostFreePorts(MdrillTaskAssignment params) {
super();
this.params = params;
}
public void parse(FreeResources freeResource)
{
Set<NodePort> allSlots = Utils.AllSlots(params.supInfos, params.zkCluster);
this.shard=this.getHostSlots(freeResource.shard, allSlots, PortTypeEnum.shard);
this.ms=this.getHostSlots(freeResource.ms, allSlots, PortTypeEnum.mergerserver);
this.realtime=this.getHostSlots(freeResource.realtime, allSlots, PortTypeEnum.realtime);
}
private HostSlots[] getHostSlots(Set<NodePort> shard,Set<NodePort> allSlots,PortTypeEnum type) {
HashMap<String, List<NodePort>> allshard = new HashMap<String, List<NodePort>>();
for (NodePort p : allSlots) {
if (params.porttype.isType(type, p.getPort())) {
SupervisorInfo sinfo = params.supInfos.get(p.getNode());
List<NodePort> ports = allshard.get(sinfo.getHostName());
if (ports == null) {
ports = new ArrayList<NodePort>();
allshard.put(sinfo.getHostName(), ports);
}
if (shard.contains(p)) {
ports.add(p);
}
}
}
List<String> shardHosts = new ArrayList<String>();
shardHosts.addAll(allshard.keySet());
String[] shardsHostArr = new String[shardHosts.size()];
shardHosts.toArray(shardsHostArr);
Arrays.sort(shardsHostArr);
HostSlots[] allList = new HostSlots[shardsHostArr.length];
for (int i = 0; i < shardsHostArr.length; i++) {
String host = shardsHostArr[i];
allList[i] = new HostSlots(host, allshard.get(host));
}
return allList;
}
}