summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-simulator/src/main/java
diff options
context:
space:
mode:
authorSacheendra Talluri <sacheendra.t@gmail.com>2025-03-27 16:14:39 +0100
committerGitHub <noreply@github.com>2025-03-27 16:14:39 +0100
commitb20dd5ebb48465470b9632dc92ecfb1794a8a4bf (patch)
tree0aeab9ad4b366cfe9e8aa79f841563e7f91758ab /opendc-compute/opendc-compute-simulator/src/main/java
parentea45406229c8349e44c88f4112fe25435b59e4e9 (diff)
Support carbon forecasting in timeshift (#327)
* Remove task from scheduler bookkeeping after failure * Support carbon forecasting in timeshift * Register scheduler and carbonmodel in context * Preliminary working task stopping; carbon intensity bug * Working carbon based stop. Two timeshift thresholds * Add a pause state task and guest * Move task stopper to allocation spec * Start tracking num pauses
Diffstat (limited to 'opendc-compute/opendc-compute-simulator/src/main/java')
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java13
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceTask.java20
2 files changed, 24 insertions, 9 deletions
diff --git a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
index b4b34881..fb9dc6e6 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
+++ b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ComputeService.java
@@ -24,7 +24,6 @@ package org.opendc.compute.simulator.service;
import java.time.Duration;
import java.time.InstantSource;
-import java.time.temporal.TemporalAmount;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
@@ -186,7 +185,10 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver {
task.setState(newState);
- if (newState == TaskState.COMPLETED || newState == TaskState.TERMINATED || newState == TaskState.FAILED) {
+ if (newState == TaskState.COMPLETED
+ || newState == TaskState.PAUSED
+ || newState == TaskState.TERMINATED
+ || newState == TaskState.FAILED) {
LOGGER.info("task {} {} {} finished", task.getUid(), task.getName(), task.getFlavor());
if (activeTasks.remove(task) != null) {
@@ -204,7 +206,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver {
}
task.setHost(null);
- host.removeTask(task);
+ host.delete(task);
if (newState == TaskState.COMPLETED) {
tasksCompleted++;
@@ -214,10 +216,11 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver {
}
if (task.getState() == TaskState.COMPLETED || task.getState() == TaskState.TERMINATED) {
- scheduler.removeTask(task, hv);
setTaskToBeRemoved(task);
}
+ scheduler.removeTask(task, hv);
+
// Try to reschedule if needed
requestSchedulingCycle();
}
@@ -672,7 +675,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver {
public ServiceTask newTask(
@NotNull String name,
@NotNull TaskNature nature,
- @NotNull TemporalAmount duration,
+ @NotNull Duration duration,
@NotNull Long deadline,
@NotNull ServiceFlavor flavor,
@NotNull Workload workload,
diff --git a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceTask.java b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceTask.java
index cada796a..6d097efb 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceTask.java
+++ b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceTask.java
@@ -22,8 +22,8 @@
package org.opendc.compute.simulator.service;
+import java.time.Duration;
import java.time.Instant;
-import java.time.temporal.TemporalAmount;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -51,7 +51,7 @@ public class ServiceTask {
private final String name;
private final TaskNature nature;
- private final TemporalAmount duration;
+ private final Duration duration;
private final Long deadline;
private ServiceFlavor flavor;
public Workload workload;
@@ -67,13 +67,14 @@ public class ServiceTask {
private SchedulingRequest request = null;
private int numFailures = 0;
+ private int numPauses = 0;
ServiceTask(
ComputeService service,
UUID uid,
String name,
TaskNature nature,
- TemporalAmount duration,
+ Duration duration,
Long deadline,
ServiceFlavor flavor,
Workload workload,
@@ -102,7 +103,7 @@ public class ServiceTask {
}
@NotNull
- public TemporalAmount getDuration() {
+ public Duration getDuration() {
return duration;
}
@@ -165,6 +166,10 @@ public class ServiceTask {
return this.numFailures;
}
+ public int getNumPauses() {
+ return this.numPauses;
+ }
+
public void start() {
switch (state) {
case PROVISIONING:
@@ -182,6 +187,11 @@ public class ServiceTask {
assert request == null : "Scheduling request already active";
request = service.schedule(this);
break;
+ case PAUSED:
+ LOGGER.info("User requested to start task after pause {}", uid);
+ setState(TaskState.PROVISIONING);
+ request = service.schedule(this, true);
+ break;
case FAILED:
LOGGER.info("User requested to start task after failure {}", uid);
setState(TaskState.PROVISIONING);
@@ -237,6 +247,8 @@ public class ServiceTask {
}
if (newState == TaskState.FAILED) {
this.numFailures++;
+ } else if (newState == TaskState.PAUSED) {
+ this.numPauses++;
}
if ((newState == TaskState.COMPLETED) || newState == TaskState.FAILED) {