diff options
| author | Dante Niewenhuis <d.niewenhuis@hotmail.com> | 2025-07-22 15:47:44 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-22 15:47:44 +0200 |
| commit | e22c97dcca7478d6941b78bdf7cd873bc0d23cdc (patch) | |
| tree | f1859c16f4c7973d8b16ed693caad4c749d42331 /opendc-compute/opendc-compute-simulator/src/main/java | |
| parent | 0c0cf25616771cd40a9e401edcba4a5e5016f76e (diff) | |
Updated workload schema (#360)
Diffstat (limited to 'opendc-compute/opendc-compute-simulator/src/main/java')
4 files changed, 63 insertions, 243 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 8b6bef2c..fde83ead 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 @@ -34,14 +34,11 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SplittableRandom; -import java.util.UUID; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.opendc.common.Dispatcher; import org.opendc.common.util.Pacer; import org.opendc.compute.api.Flavor; -import org.opendc.compute.api.Image; import org.opendc.compute.api.TaskState; import org.opendc.compute.simulator.host.HostListener; import org.opendc.compute.simulator.host.HostModel; @@ -82,11 +79,6 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { */ private final Pacer pacer; - /** - * The {@link SplittableRandom} used to generate the unique identifiers for the service resources. - */ - private final SplittableRandom random = new SplittableRandom(0); - private final int maxNumFailures; /** @@ -126,31 +118,21 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { */ private final Map<ServiceTask, SimHost> activeTasks = new HashMap<>(); - /** - * The active tasks in the system. - */ - private final List<String> completedTasks = new ArrayList<>(); + private final List<Integer> completedTasks = new ArrayList<>(); - private final List<String> terminatedTasks = new ArrayList<>(); + private final List<Integer> terminatedTasks = new ArrayList<>(); /** * The registered flavors for this compute service. */ - private final Map<UUID, ServiceFlavor> flavorById = new HashMap<>(); + private final Map<Integer, ServiceFlavor> flavorById = new HashMap<>(); private final List<ServiceFlavor> flavors = new ArrayList<>(); /** - * The registered images for this compute service. - */ - private final Map<UUID, ServiceImage> imageById = new HashMap<>(); - - private final List<ServiceImage> images = new ArrayList<>(); - - /** * The registered tasks for this compute service. */ - private final Map<UUID, ServiceTask> taskById = new HashMap<>(); + private final Map<Integer, ServiceTask> taskById = new HashMap<>(); private final List<ServiceTask> tasksToRemove = new ArrayList<>(); @@ -192,7 +174,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { || newState == TaskState.PAUSED || newState == TaskState.TERMINATED || newState == TaskState.FAILED) { - LOGGER.info("task {} {} {} finished", task.getUid(), task.getName(), task.getFlavor()); + LOGGER.info("task {} {} {} finished", task.getId(), task.getName(), task.getFlavor()); if (activeTasks.remove(task) != null) { tasksActive--; @@ -272,7 +254,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { /** * Return the {@link ServiceTask}s hosted by this service. */ - public Map<UUID, ServiceTask> getTasks() { + public Map<Integer, ServiceTask> getTasks() { return taskById; } @@ -419,11 +401,10 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { } SchedulingRequest schedule(ServiceTask task, boolean atFront) { - LOGGER.debug("Enqueueing task {} to be assigned to host", task.getUid()); + LOGGER.debug("Enqueueing task {} to be assigned to host", task.getId()); if (task.getNumFailures() >= maxNumFailures) { - LOGGER.warn("task {} has been terminated because it failed {} times", (Object) task, (Object) - task.getNumFailures()); + LOGGER.warn("task {} has been terminated because it failed {} times", task, task.getNumFailures()); tasksTerminated++; task.setState(TaskState.TERMINATED); @@ -436,8 +417,8 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { SchedulingRequest request = new SchedulingRequest(task, now); ServiceFlavor flavor = task.getFlavor(); - for (String taskName : this.terminatedTasks) { - if (flavor.isInDependencies(taskName)) { + for (int taskId : this.terminatedTasks) { + if (flavor.isInDependencies(taskId)) { // Terminate task task.setState(TaskState.TERMINATED); } @@ -447,10 +428,10 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { flavor.updatePendingDependencies(this.completedTasks); // If there are still pending dependencies, we cannot schedule the task yet - Set<String> pendingDependencies = flavor.getDependencies(); + Set<Integer> pendingDependencies = flavor.getDependencies(); if (!pendingDependencies.isEmpty()) { // If the task has pending dependencies, we cannot schedule it yet - LOGGER.debug("Task {} has pending dependencies: {}", task.getUid(), pendingDependencies); + LOGGER.debug("Task {} has pending dependencies: {}", task.getId(), pendingDependencies); blockedTasks.add(request); return null; } @@ -466,18 +447,18 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { } void addCompletedTask(ServiceTask task) { - String taskName = task.getName(); + int taskId = task.getId(); - if (!this.completedTasks.contains(taskName)) { - this.completedTasks.add(taskName); + if (!this.completedTasks.contains(taskId)) { + this.completedTasks.add(taskId); } List<SchedulingRequest> requestsToRemove = new ArrayList<>(); for (SchedulingRequest request : blockedTasks) { - request.getTask().getFlavor().updatePendingDependencies(taskName); + request.getTask().getFlavor().updatePendingDependencies(taskId); - Set<String> pendingDependencies = request.getTask().getFlavor().getDependencies(); + Set<Integer> pendingDependencies = request.getTask().getFlavor().getDependencies(); if (pendingDependencies.isEmpty()) { requestsToRemove.add(request); @@ -492,16 +473,16 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { } void addTerminatedTask(ServiceTask task) { - String taskName = task.getName(); + int taskId = task.getId(); List<SchedulingRequest> requestsToRemove = new ArrayList<>(); - if (!this.terminatedTasks.contains(taskName)) { - this.terminatedTasks.add(taskName); + if (!this.terminatedTasks.contains(taskId)) { + this.terminatedTasks.add(taskId); } for (SchedulingRequest request : blockedTasks) { - if (request.getTask().getFlavor().isInDependencies(taskName)) { + if (request.getTask().getFlavor().isInDependencies(taskId)) { requestsToRemove.add(request); request.getTask().setState(TaskState.TERMINATED); } @@ -513,18 +494,13 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { } void delete(ServiceFlavor flavor) { - flavorById.remove(flavor.getUid()); + flavorById.remove(flavor.getTaskId()); flavors.remove(flavor); } - void delete(ServiceImage image) { - imageById.remove(image.getUid()); - images.remove(image); - } - void delete(ServiceTask task) { completedTasks.remove(task); - taskById.remove(task.getUid()); + taskById.remove(task.getId()); } public void updateCarbonIntensity(double newCarbonIntensity) { @@ -675,68 +651,25 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { return new ArrayList<>(service.flavors); } - public Flavor findFlavor(@NotNull UUID id) { - checkOpen(); - - return service.flavorById.get(id); - } - @NotNull public ServiceFlavor newFlavor( - @NotNull String name, + int taskId, int cpuCount, long memorySize, int gpuCoreCount, - @NotNull Set<String> parents, - @NotNull Set<String> children, + @NotNull Set<Integer> parents, + @NotNull Set<Integer> children, @NotNull Map<String, ?> meta) { checkOpen(); final ComputeService service = this.service; - UUID uid = new UUID(service.clock.millis(), service.random.nextLong()); - ServiceFlavor flavor = - new ServiceFlavor(service, uid, name, cpuCount, memorySize, gpuCoreCount, parents, children, meta); - - // service.flavorById.put(uid, flavor); - // service.flavors.add(flavor); - return flavor; - } - - @NotNull - public List<Image> queryImages() { - checkOpen(); - - return new ArrayList<>(service.images); - } - - public Image findImage(@NotNull UUID id) { - checkOpen(); - - return service.imageById.get(id); - } - - public Image newImage(@NotNull String name) { - return newImage(name, Collections.emptyMap(), Collections.emptyMap()); - } - - @NotNull - public Image newImage(@NotNull String name, @NotNull Map<String, String> labels, @NotNull Map<String, ?> meta) { - checkOpen(); - - final ComputeService service = this.service; - UUID uid = new UUID(service.clock.millis(), service.random.nextLong()); - - ServiceImage image = new ServiceImage(service, uid, name, labels, meta); - - service.imageById.put(uid, image); - service.images.add(image); - - return image; + return new ServiceFlavor(service, taskId, cpuCount, memorySize, gpuCoreCount, parents, children, meta); } @NotNull public ServiceTask newTask( + int id, @NotNull String name, @NotNull TaskNature nature, @NotNull Duration duration, @@ -747,15 +680,10 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { checkOpen(); final ComputeService service = this.service; - UUID uid = new UUID(service.clock.millis(), service.random.nextLong()); - - // final ServiceFlavor internalFlavor = - // Objects.requireNonNull(service.flavorById.get(flavor.getUid()), "Unknown flavor"); - // ServiceTask task = new ServiceTask(service, uid, name, internalFlavor, workload, meta); - ServiceTask task = new ServiceTask(service, uid, name, nature, duration, deadline, flavor, workload, meta); + ServiceTask task = new ServiceTask(service, id, name, nature, duration, deadline, flavor, workload, meta); - service.taskById.put(uid, task); + service.taskById.put(id, task); service.tasksTotal++; @@ -765,7 +693,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { } @Nullable - public ServiceTask findTask(@NotNull UUID id) { + public ServiceTask findTask(int id) { checkOpen(); return service.taskById.get(id); } @@ -781,7 +709,7 @@ public final class ComputeService implements AutoCloseable, CarbonReceiver { @Nullable public void rescheduleTask(@NotNull ServiceTask task, @NotNull Workload workload) { - ServiceTask internalTask = findTask(task.getUid()); + ServiceTask internalTask = findTask(task.getId()); // SimHost from = service.lookupHost(internalTask); // from.delete(internalTask); diff --git a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceFlavor.java b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceFlavor.java index bb68d336..6201f21f 100644 --- a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceFlavor.java +++ b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceFlavor.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.UUID; import org.jetbrains.annotations.NotNull; import org.opendc.compute.api.Flavor; @@ -37,29 +36,26 @@ import org.opendc.compute.api.Flavor; */ public final class ServiceFlavor implements Flavor { private final ComputeService service; - private final UUID uid; - private final String name; + private final int taskId; private final int cpuCoreCount; private final long memorySize; private final int gpuCoreCount; - private final Set<String> parents; - private final Set<String> children; - private final Set<String> dependencies; + private final Set<Integer> parents; + private final Set<Integer> children; + private final Set<Integer> dependencies; private final Map<String, ?> meta; ServiceFlavor( ComputeService service, - UUID uid, - String name, + int taskId, int cpuCoreCount, long memorySize, int gpuCoreCount, - Set<String> parents, - Set<String> children, + Set<Integer> parents, + Set<Integer> children, Map<String, ?> meta) { this.service = service; - this.uid = uid; - this.name = name; + this.taskId = taskId; this.cpuCoreCount = cpuCoreCount; this.memorySize = memorySize; this.gpuCoreCount = gpuCoreCount; @@ -84,16 +80,9 @@ public final class ServiceFlavor implements Flavor { return gpuCoreCount; } - @NotNull - @Override - public UUID getUid() { - return uid; - } - - @NotNull @Override - public String getName() { - return name; + public int getTaskId() { + return taskId; } @NotNull @@ -117,45 +106,45 @@ public final class ServiceFlavor implements Flavor { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServiceFlavor flavor = (ServiceFlavor) o; - return service.equals(flavor.service) && uid.equals(flavor.uid); + return service.equals(flavor.service) && taskId == flavor.taskId; } @Override public int hashCode() { - return Objects.hash(service, uid); + return Objects.hash(service, taskId); } @Override public String toString() { - return "Flavor[uid=" + uid + ",name=" + name + "]"; + return "Flavor[name=" + taskId + "]"; } @Override - public @NotNull Set<String> getDependencies() { + public @NotNull Set<Integer> getDependencies() { return dependencies; } - public void updatePendingDependencies(List<String> completedTasks) { - for (String task : completedTasks) { + public void updatePendingDependencies(List<Integer> completedTasks) { + for (int task : completedTasks) { this.updatePendingDependencies(task); } } - public void updatePendingDependencies(String completedTask) { + public void updatePendingDependencies(int completedTask) { this.dependencies.remove(completedTask); } - public boolean isInDependencies(String task) { + public boolean isInDependencies(int task) { return this.dependencies.contains(task); } @Override - public @NotNull Set<@NotNull String> getParents() { + public @NotNull Set<Integer> getParents() { return parents; } @Override - public @NotNull Set<@NotNull String> getChildren() { + public @NotNull Set<Integer> getChildren() { return children; } } diff --git a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceImage.java b/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceImage.java deleted file mode 100644 index dffa4356..00000000 --- a/opendc-compute/opendc-compute-simulator/src/main/java/org/opendc/compute/simulator/service/ServiceImage.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.compute.simulator.service; - -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; -import org.jetbrains.annotations.NotNull; -import org.opendc.compute.api.Image; - -/** - * Implementation of {@link Image} provided by {@link ComputeService}. - */ -public final class ServiceImage implements Image { - private final ComputeService service; - private final UUID uid; - private final String name; - private final Map<String, String> labels; - private final Map<String, ?> meta; - - ServiceImage(ComputeService service, UUID uid, String name, Map<String, String> labels, Map<String, ?> meta) { - this.service = service; - this.uid = uid; - this.name = name; - this.labels = labels; - this.meta = meta; - } - - @NotNull - @Override - public UUID getUid() { - return uid; - } - - @NotNull - @Override - public String getName() { - return name; - } - - @NotNull - @Override - public Map<String, Object> getMeta() { - return Collections.unmodifiableMap(meta); - } - - @Override - public void reload() { - // No-op: this object is the source-of-truth - } - - @Override - public void delete() { - service.delete(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ServiceImage image = (ServiceImage) o; - return service.equals(image.service) && uid.equals(image.uid); - } - - @Override - public int hashCode() { - return Objects.hash(service, uid); - } - - @Override - public String toString() { - return "Image[uid=" + uid + ",name=" + name + "]"; - } -} 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 281f75ca..57bbb7c3 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 @@ -29,7 +29,6 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.UUID; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.opendc.compute.api.TaskState; @@ -47,7 +46,7 @@ public class ServiceTask { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceTask.class); private final ComputeService service; - private final UUID uid; + private final int id; private final String name; private final TaskNature nature; @@ -73,7 +72,7 @@ public class ServiceTask { ServiceTask( ComputeService service, - UUID uid, + int id, String name, TaskNature nature, Duration duration, @@ -82,7 +81,7 @@ public class ServiceTask { Workload workload, Map<String, ?> meta) { this.service = service; - this.uid = uid; + this.id = id; this.name = name; this.nature = nature; this.duration = duration; @@ -94,9 +93,8 @@ public class ServiceTask { this.submittedAt = this.service.getClock().instant(); } - @NotNull - public UUID getUid() { - return uid; + public int getId() { + return id; } @NotNull @@ -191,18 +189,18 @@ public class ServiceTask { LOGGER.warn("User tried to start deleted task"); throw new IllegalStateException("Task is deleted"); case CREATED: - LOGGER.info("User requested to start task {}", uid); + LOGGER.info("User requested to start task {}", id); setState(TaskState.PROVISIONING); assert request == null : "Scheduling request already active"; request = service.schedule(this); break; case PAUSED: - LOGGER.info("User requested to start task after pause {}", uid); + LOGGER.info("User requested to start task after pause {}", id); setState(TaskState.PROVISIONING); request = service.schedule(this, true); break; case FAILED: - LOGGER.info("User requested to start task after failure {}", uid); + LOGGER.info("User requested to start task after failure {}", id); setState(TaskState.PROVISIONING); request = service.schedule(this, true); break; @@ -235,15 +233,15 @@ public class ServiceTask { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServiceTask task = (ServiceTask) o; - return service.equals(task.service) && uid.equals(task.uid); + return service.equals(task.service) && id == task.id; } public int hashCode() { - return Objects.hash(service, uid); + return Objects.hash(service, id); } public String toString() { - return "Task[uid=" + uid + ",name=" + name + ",state=" + state + "]"; + return "Task[uid=" + id + ",name=" + name + ",state=" + state + "]"; } void setState(TaskState newState) { |
