summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-service
diff options
context:
space:
mode:
authorDante Niewenhuis <d.niewenhuis@hotmail.com>2024-05-07 12:33:39 +0200
committerGitHub <noreply@github.com>2024-05-07 12:33:39 +0200
commitad20465a5df47b49561bb0afbdda5cd65c5da4b8 (patch)
tree268f0fde5924b71ca2750dbbbba4cbe24c361f12 /opendc-compute/opendc-compute-service
parent7c0691eb6c348d2e49da3ef354b652cf26604905 (diff)
Revamped failure models (#228)
Diffstat (limited to 'opendc-compute/opendc-compute-service')
-rw-r--r--opendc-compute/opendc-compute-service/build.gradle.kts1
-rw-r--r--opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ComputeService.java24
-rw-r--r--opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ServiceServer.java11
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/FilterScheduler.kt1
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/ComputeFilter.kt3
-rw-r--r--opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/RamFilter.kt16
6 files changed, 46 insertions, 10 deletions
diff --git a/opendc-compute/opendc-compute-service/build.gradle.kts b/opendc-compute/opendc-compute-service/build.gradle.kts
index 0efdb05f..cd25e05c 100644
--- a/opendc-compute/opendc-compute-service/build.gradle.kts
+++ b/opendc-compute/opendc-compute-service/build.gradle.kts
@@ -31,6 +31,7 @@ dependencies {
api(projects.opendcCompute.opendcComputeApi)
implementation(projects.opendcCommon)
implementation(libs.kotlin.logging)
+ implementation(project(mapOf("path" to ":opendc-simulator:opendc-simulator-compute")))
testImplementation(projects.opendcSimulator.opendcSimulatorCore)
testImplementation(libs.log4j.slf4j)
diff --git a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ComputeService.java b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ComputeService.java
index 167b13c7..a7e9f509 100644
--- a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ComputeService.java
+++ b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ComputeService.java
@@ -52,6 +52,7 @@ import org.opendc.compute.service.driver.HostModel;
import org.opendc.compute.service.driver.HostState;
import org.opendc.compute.service.scheduler.ComputeScheduler;
import org.opendc.compute.service.telemetry.SchedulerStats;
+import org.opendc.simulator.compute.workload.SimWorkload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -161,7 +162,9 @@ public final class ComputeService implements AutoCloseable {
serviceServer.setState(newState);
- if (newState == ServerState.TERMINATED || newState == ServerState.DELETED) {
+ if (newState == ServerState.TERMINATED
+ || newState == ServerState.DELETED
+ || newState == ServerState.ERROR) {
LOGGER.info("Server {} {} {} finished", server.getUid(), server.getName(), server.getFlavor());
if (activeServers.remove(server) != null) {
@@ -353,6 +356,8 @@ public final class ComputeService implements AutoCloseable {
* Run a single scheduling iteration.
*/
private void doSchedule() {
+ // reorder tasks
+
while (!queue.isEmpty()) {
SchedulingRequest request = queue.peek();
@@ -363,6 +368,9 @@ public final class ComputeService implements AutoCloseable {
}
final ServiceServer server = request.server;
+ // Check if all dependencies are met
+ // otherwise continue
+
final ServiceFlavor flavor = server.getFlavor();
final HostView hv = scheduler.select(request.server);
@@ -582,6 +590,20 @@ public final class ComputeService implements AutoCloseable {
public String toString() {
return "ComputeService.Client";
}
+
+ @Nullable
+ @Override
+ public void rescheduleServer(@NotNull Server server, @NotNull SimWorkload workload) {
+ ServiceServer internalServer = (ServiceServer) findServer(server.getUid());
+ Host from = service.lookupHost(internalServer);
+
+ from.delete(internalServer);
+
+ internalServer.host = null;
+
+ internalServer.setWorkload(workload);
+ internalServer.start();
+ }
}
/**
diff --git a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ServiceServer.java b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ServiceServer.java
index 265feac0..e363faf2 100644
--- a/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ServiceServer.java
+++ b/opendc-compute/opendc-compute-service/src/main/java/org/opendc/compute/service/ServiceServer.java
@@ -25,6 +25,7 @@ package org.opendc.compute.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -46,11 +47,12 @@ public final class ServiceServer implements Server {
private final ComputeService service;
private final UUID uid;
+
private final String name;
private final ServiceFlavor flavor;
private final ServiceImage image;
private final Map<String, String> labels;
- private final Map<String, ?> meta;
+ private Map<String, ?> meta;
private final List<ServerWatcher> watchers = new ArrayList<>();
private ServerState state = ServerState.TERMINATED;
@@ -111,6 +113,13 @@ public final class ServiceServer implements Server {
return Collections.unmodifiableMap(meta);
}
+ public void setWorkload(Object _workload) {
+ Map<String, Object> new_meta = new HashMap<String, Object>();
+ new_meta.put("workload", _workload);
+
+ meta = new_meta;
+ }
+
@NotNull
@Override
public ServerState getState() {
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/FilterScheduler.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/FilterScheduler.kt
index cdcd1af0..41118386 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/FilterScheduler.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/FilterScheduler.kt
@@ -101,6 +101,7 @@ public class FilterScheduler(
filteredHosts
}
+ // fixme: currently finding no matching hosts can result in an error
return when (val maxSize = min(subsetSize, subset.size)) {
0 -> null
1 -> subset[0]
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/ComputeFilter.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/ComputeFilter.kt
index 23590c13..dd707f60 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/ComputeFilter.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/ComputeFilter.kt
@@ -34,7 +34,8 @@ public class ComputeFilter : HostFilter {
host: HostView,
server: Server,
): Boolean {
- return host.host.state == HostState.UP
+ val result = host.host.state == HostState.UP
+ return result
}
override fun toString(): String = "ComputeFilter"
diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/RamFilter.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/RamFilter.kt
index 4792a7a0..d8c3d540 100644
--- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/RamFilter.kt
+++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/scheduler/filters/RamFilter.kt
@@ -35,19 +35,21 @@ public class RamFilter(private val allocationRatio: Double) : HostFilter {
host: HostView,
server: Server,
): Boolean {
- val requested = server.flavor.memorySize
- val available = host.availableMemory
- val total = host.host.model.memoryCapacity
+ val requestedMemory = server.flavor.memorySize
+ val availableMemory = host.availableMemory
+ val memoryCapacity = host.host.model.memoryCapacity
// Do not allow an instance to overcommit against itself, only against
// other instances.
- if (requested > total) {
+ if (requestedMemory > memoryCapacity) {
return false
}
- val limit = total * allocationRatio
- val used = total - available
+ val limit = memoryCapacity * allocationRatio
+ val used = memoryCapacity - availableMemory
val usable = limit - used
- return usable >= requested
+
+ val result = usable >= requestedMemory
+ return result
}
}