This is an automated email from the ASF dual-hosted git repository.
dimuthuupe pushed a commit to branch cybershuttle-staging
in repository https://gitbox.apache.org/repos/asf/airavata.git
The following commit(s) were added to refs/heads/cybershuttle-staging by this
push:
new 3069b06b8b Meta scheduling behavior for agent launch
3069b06b8b is described below
commit 3069b06b8b666f2cd2e6ca382deef6c2c07add7e
Author: DImuthuUpe <[email protected]>
AuthorDate: Thu Apr 10 04:36:12 2025 -0400
Meta scheduling behavior for agent launch
---
.../service/controllers/ExperimentController.java | 18 ++++++++++++++
.../service/handlers/AgentManagementHandler.java | 28 ++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
index c1cb78812c..fcd93327a4 100644
---
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
+++
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
@@ -8,6 +8,8 @@ import
org.apache.airavata.agent.connection.service.models.AgentLaunchResponse;
import
org.apache.airavata.agent.connection.service.models.AgentTerminateResponse;
import org.apache.airavata.model.experiment.ExperimentModel;
import org.apache.airavata.model.process.ProcessModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
@@ -17,10 +19,14 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+
@RestController
@RequestMapping("/api/v1/exp")
public class ExperimentController {
+ private final static Logger logger =
LoggerFactory.getLogger(ExperimentController.class);
+
private final AgentManagementHandler agentManagementHandler;
public ExperimentController(AgentManagementHandler agentManagementHandler)
{
@@ -38,6 +44,18 @@ public class ExperimentController {
return ResponseEntity.ok(agentResponse);
}
+ @PostMapping(value = "/launchoptimize", consumes =
MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<AgentLaunchResponse>
createAndLaunchOptimizedExperiment(@Valid @RequestBody List<AgentLaunchRequest>
request) {
+ try {
+ AgentLaunchRequest agentLaunchRequest =
agentManagementHandler.filterOptimumLaunchRequest(request);
+ AgentLaunchResponse agentResponse =
agentManagementHandler.createAndLaunchExperiment(agentLaunchRequest);
+ return ResponseEntity.ok(agentResponse);
+ } catch (Exception e) {
+ logger.error("Failed to fetch optimum launch request", e);
+ throw new RuntimeException("Failed to fetch optimum launch
request");
+ }
+ }
+
@GetMapping(value = "/terminate/{expId}", produces =
MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<AgentTerminateResponse>
terminateExperiment(@PathVariable("expId") String expId) {
return
ResponseEntity.ok(agentManagementHandler.terminateExperiment(expId));
diff --git
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
index fb3b6900a5..48c16c16b8 100644
---
a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
+++
b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
@@ -16,6 +16,7 @@ import
org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeRes
import
org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
import org.apache.airavata.model.application.io.InputDataObjectType;
import org.apache.airavata.model.experiment.ExperimentModel;
+import org.apache.airavata.model.experiment.ExperimentStatistics;
import org.apache.airavata.model.experiment.ExperimentType;
import org.apache.airavata.model.experiment.UserConfigurationDataModel;
import org.apache.airavata.model.process.ProcessModel;
@@ -78,6 +79,33 @@ public class AgentManagementHandler {
}
}
+ /**
+ * Meta-scheduling logic
+ * @param launchRequests
+ * @return
+ * @throws Exception
+ */
+ public AgentLaunchRequest
filterOptimumLaunchRequest(List<AgentLaunchRequest> launchRequests) throws
Exception {
+ int leastRunningExpCount = Integer.MAX_VALUE;
+ AgentLaunchRequest sortedLaunchRequest = launchRequests.get(0);
+
+ for (AgentLaunchRequest req : launchRequests) {
+ String appInterfaceId =
clusterApplicationConfig.getApplicationInterfaceIdByCluster(req.getApplicationInterfaceName());
+ ExperimentStatistics experimentStatistics =
airavataService.airavata().getExperimentStatistics(UserContext.authzToken(),
UserContext.gatewayId(),
+ System.currentTimeMillis() - 60 * 60 * 1000,
System.currentTimeMillis(), null,
+ appInterfaceId, null, 100, 0);
+
+ int runningExperimentCount =
experimentStatistics.getRunningExperimentCount();
+ int failedExperimentCount =
experimentStatistics.getFailedExperimentCount();
+ LOGGER.info("Running count {} failed count {} for appInterfaceId
{}", runningExperimentCount, failedExperimentCount, appInterfaceId);
+ if (runningExperimentCount + failedExperimentCount <
leastRunningExpCount) {
+ leastRunningExpCount = runningExperimentCount +
failedExperimentCount;
+ sortedLaunchRequest = req;
+ }
+ }
+ return sortedLaunchRequest;
+ }
+
public AgentLaunchResponse createAndLaunchExperiment(AgentLaunchRequest
req) {
try {
String agentId = "agent_" + UUID.randomUUID().toString();