in controller/src/main/java/org/apache/airavata/mft/controller/TransferDispatcher.java [99:132]
private String selectTargetAgent(List<String> liveAgentIds) throws MFTConsulClientException {
String selectedAgent = null;
List<Optional<AgentInfo>> agentInfos = liveAgentIds.stream().map(
id -> mftConsulClient.getAgentInfo(id)).collect(Collectors.toList());
long transferCount = -1;
List<String> candidates = new ArrayList<>();
for (Optional<AgentInfo> agentInfo : agentInfos) {
if (agentInfo.isPresent()) {
int agentActiveTransfers = mftConsulClient.getEndpointHookCountForAgent(agentInfo.get().getId());
long pendingTransferCount = mftConsulClient.getAgentPendingTransferCount(agentInfo.get().getId());
long totalTransferCount = agentActiveTransfers + pendingTransferCount;
logger.info("Agent {} has transfers assigned {}", agentInfo.get().getId(), totalTransferCount);
if (transferCount == -1) {
transferCount = totalTransferCount;
candidates.add(agentInfo.get().getId());
} else if (transferCount == totalTransferCount) {
candidates.add(agentInfo.get().getId());
} else if (transferCount > totalTransferCount) {
candidates = new ArrayList<>();
transferCount = totalTransferCount;
candidates.add(agentInfo.get().getId());
}
}
}
if (candidates.size() > 0) {
Random rand = new Random();
selectedAgent = candidates.get(rand.nextInt(candidates.size()));
logger.info("Selecting agent {}", selectedAgent);
}
return selectedAgent;
}