This is an automated email from the ASF dual-hosted git repository. dimuthuupe pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/airavata-mft.git
commit a155f92d9a5824b6824022160a87d16666e9cf37 Author: Dimuthu Wannipurage <[email protected]> AuthorDate: Tue Sep 27 21:17:16 2022 -0400 Making agent scheduling logic fair --- .../airavata/mft/controller/MFTController.java | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/controller/src/main/java/org/apache/airavata/mft/controller/MFTController.java b/controller/src/main/java/org/apache/airavata/mft/controller/MFTController.java index 77fb123..e674993 100644 --- a/controller/src/main/java/org/apache/airavata/mft/controller/MFTController.java +++ b/controller/src/main/java/org/apache/airavata/mft/controller/MFTController.java @@ -39,6 +39,7 @@ import org.springframework.context.annotation.ComponentScan; import javax.annotation.PreDestroy; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Random; @@ -252,17 +253,28 @@ public class MFTController implements CommandLineRunner { } else if (!transferRequest.getAffinityTransfer()){ List<Optional<AgentInfo>> agentInfos = liveAgentIds.stream().map(id -> mftConsulClient.getAgentInfo(id)).collect(Collectors.toList()); int transferCount = -1; + List<String> candidates = new ArrayList<>(); for (Optional<AgentInfo> agentInfo : agentInfos) { if (agentInfo.isPresent()) { + List<String> agentActiveTransferIds = mftConsulClient.getAgentActiveTransferIds(agentInfo.get()); + logger.info("Agent {} has transfers assigned {}", agentInfo.get().getId(), agentActiveTransferIds.size()); if (transferCount == -1) { - transferCount = mftConsulClient.getAgentActiveTransferIds(agentInfo.get()).size(); - selectedAgent = agentInfo.get().getId(); - } else if (transferCount > mftConsulClient.getAgentActiveTransferIds(agentInfo.get()).size()) { - transferCount = mftConsulClient.getAgentActiveTransferIds(agentInfo.get()).size(); - selectedAgent = agentInfo.get().getId(); + transferCount = agentActiveTransferIds.size(); + candidates.add(agentInfo.get().getId()); + } else if (transferCount == agentActiveTransferIds.size()) { + candidates.add(agentInfo.get().getId()); + } else if (transferCount > agentActiveTransferIds.size()) { + candidates = new ArrayList<>(); + transferCount = agentActiveTransferIds.size(); + candidates.add(agentInfo.get().getId()); } } } + + if (candidates.size() > 0) { + Random rand = new Random(); + selectedAgent = candidates.get(rand.nextInt(candidates.size())); + } } if (selectedAgent == null) { @@ -270,6 +282,7 @@ public class MFTController implements CommandLineRunner { return Optional.empty(); } + logger.info("Selected agent {}", selectedAgent); return Optional.of(selectedAgent); }
