diff options
| author | Dante Niewenhuis <d.niewenhuis@hotmail.com> | 2024-05-07 12:33:39 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-07 12:33:39 +0200 |
| commit | ad20465a5df47b49561bb0afbdda5cd65c5da4b8 (patch) | |
| tree | 268f0fde5924b71ca2750dbbbba4cbe24c361f12 /opendc-compute/opendc-compute-service | |
| parent | 7c0691eb6c348d2e49da3ef354b652cf26604905 (diff) | |
Revamped failure models (#228)
Diffstat (limited to 'opendc-compute/opendc-compute-service')
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 } } |
