From 23bc41d68d9442ae642c1e75f68599be1f0cc189 Mon Sep 17 00:00:00 2001 From: "Michael N. Lipp" Date: Fri, 31 Jan 2025 15:26:25 +0100 Subject: [PATCH] Prefer running VMs for new assignments. --- .../jdrupes/vmoperator/manager/VmMonitor.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/VmMonitor.java b/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/VmMonitor.java index 2060109..c2d717a 100644 --- a/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/VmMonitor.java +++ b/org.jdrupes.vmoperator.manager/src/org/jdrupes/vmoperator/manager/VmMonitor.java @@ -293,8 +293,9 @@ public class VmMonitor extends var pool = vmPool; assignedVm = channelManager.channels().stream() .filter(c -> isAssignable(pool, c.vmDefinition())) - .sorted(Comparator.comparing(c -> c.vmDefinition() - .assignmentLastUsed().orElse(Instant.ofEpochSecond(0)))) + .sorted(Comparator.comparing((VmChannel c) -> c.vmDefinition() + .assignmentLastUsed().orElse(Instant.ofEpochSecond(0))) + .thenComparing(preferRunning)) .findFirst(); // None found @@ -322,6 +323,19 @@ public class VmMonitor extends } } + private static Comparator preferRunning + = new Comparator<>() { + @Override + public int compare(VmChannel ch1, VmChannel ch2) { + if (ch1.vmDefinition().conditionStatus("Running").orElse(false) + && !ch2.vmDefinition().conditionStatus("Running") + .orElse(false)) { + return -1; + } + return 0; + } + }; + @SuppressWarnings("PMD.SimplifyBooleanReturns") private boolean isAssignable(VmPool pool, VmDefinition vmDef) { // Check if the VM is in the pool