private String selectTargetAgent()

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;
    }