From e88adbc3fc15a2de717f9478454c5a5229ece10e Mon Sep 17 00:00:00 2001 From: Dante Niewenhuis Date: Fri, 26 Sep 2025 09:48:29 +0200 Subject: Fixed a small bug that caused duplications in usedHosts in the FilterScheduler.kt (#372) --- .../compute/simulator/scheduler/FilterScheduler.kt | 12 ++++---- .../simulator/scheduler/FilterSchedulerTest.kt | 32 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) (limited to 'opendc-compute') diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/scheduler/FilterScheduler.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/scheduler/FilterScheduler.kt index 9295acb2..fb7eadfb 100644 --- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/scheduler/FilterScheduler.kt +++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/scheduler/FilterScheduler.kt @@ -146,13 +146,15 @@ public class FilterScheduler( iter.remove() - val host = subset.first() - val hostType = host.host.getType() + val hostView = subset.first() + val hostType = hostView.host.getType() - emptyHostMap[hostType]?.remove(host) - usedHosts.add(host) + if (hostView.host.isEmpty()) { + emptyHostMap[hostType]?.remove(hostView) + usedHosts.add(hostView) + } - return SchedulingResult(SchedulingResultType.SUCCESS, host, req) + return SchedulingResult(SchedulingResultType.SUCCESS, hostView, req) } override fun removeTask( diff --git a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/scheduler/FilterSchedulerTest.kt b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/scheduler/FilterSchedulerTest.kt index 4f00100f..5d71d5de 100644 --- a/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/scheduler/FilterSchedulerTest.kt +++ b/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/scheduler/FilterSchedulerTest.kt @@ -98,10 +98,12 @@ internal class FilterSchedulerTest { val hostA = mockk() every { hostA.host.getState() } returns HostState.DOWN every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -131,10 +133,12 @@ internal class FilterSchedulerTest { val hostA = mockk() every { hostA.host.getState() } returns HostState.DOWN every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -162,6 +166,7 @@ internal class FilterSchedulerTest { val host = mockk() every { host.host.getState() } returns HostState.DOWN every { host.host.getType() } returns "A" + every { host.host.isEmpty() } returns true scheduler.addHost(host) @@ -184,6 +189,7 @@ internal class FilterSchedulerTest { val host = mockk() every { host.host.getState() } returns HostState.UP every { host.host.getType() } returns "A" + every { host.host.isEmpty() } returns true scheduler.addHost(host) @@ -208,12 +214,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.availableMemory } returns 512 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.availableMemory } returns 2048 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -239,6 +247,7 @@ internal class FilterSchedulerTest { every { host.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { host.availableMemory } returns 2048 every { host.host.getType() } returns "A" + every { host.host.isEmpty() } returns true scheduler.addHost(host) @@ -263,12 +272,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.provisionedCpuCores } returns 3 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.provisionedCpuCores } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -294,6 +305,7 @@ internal class FilterSchedulerTest { every { host.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { host.provisionedCpuCores } returns 0 every { host.host.getType() } returns "A" + every { host.host.isEmpty() } returns true scheduler.addHost(host) @@ -318,6 +330,7 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(8 * 2600.0, 8, 2048) every { hostA.availableMemory } returns 512 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true scheduler.addHost(hostA) val hostB = mockk() @@ -325,6 +338,7 @@ internal class FilterSchedulerTest { every { hostB.host.getModel() } returns HostModel(4 * 3200.0, 4, 2048) every { hostB.availableMemory } returns 512 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostB) val req = mockk() @@ -349,12 +363,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.instanceCount } returns 2 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.instanceCount } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -389,6 +405,7 @@ internal class FilterSchedulerTest { every { hostA.host.getInstances() } returns emptySet() every { hostA.provisionedCpuCores } returns 3 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP @@ -396,6 +413,7 @@ internal class FilterSchedulerTest { every { hostB.host.getInstances() } returns setOf(reqA.task) every { hostB.provisionedCpuCores } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -435,6 +453,7 @@ internal class FilterSchedulerTest { every { hostA.host.getInstances() } returns setOf(reqA.task) every { hostA.provisionedCpuCores } returns 3 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP @@ -442,6 +461,7 @@ internal class FilterSchedulerTest { every { hostB.host.getInstances() } returns emptySet() every { hostB.provisionedCpuCores } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -480,6 +500,7 @@ internal class FilterSchedulerTest { ) every { hostA.provisionedGpuCores } returns 0 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true scheduler.addHost(hostA) val hostB = mockk() @@ -496,6 +517,7 @@ internal class FilterSchedulerTest { ) every { hostB.provisionedGpuCores } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostB) val req = mockk() @@ -528,6 +550,7 @@ internal class FilterSchedulerTest { ) every { hostA.availableMemory } returns 512 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true scheduler.addHost(hostA) val hostB = mockk() @@ -544,6 +567,7 @@ internal class FilterSchedulerTest { ) every { hostB.availableMemory } returns 512 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostB) val req = mockk() @@ -568,12 +592,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.availableMemory } returns 1024 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.availableMemory } returns 512 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -599,12 +625,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(12 * 2600.0, 12, 2048) every { hostA.availableMemory } returns 1024 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.availableMemory } returns 512 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -630,12 +658,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.provisionedCpuCores } returns 2 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.provisionedCpuCores } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) @@ -661,12 +691,14 @@ internal class FilterSchedulerTest { every { hostA.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostA.instanceCount } returns 2 every { hostA.host.getType() } returns "A" + every { hostA.host.isEmpty() } returns true val hostB = mockk() every { hostB.host.getState() } returns HostState.UP every { hostB.host.getModel() } returns HostModel(4 * 2600.0, 4, 2048) every { hostB.instanceCount } returns 0 every { hostB.host.getType() } returns "B" + every { hostB.host.isEmpty() } returns true scheduler.addHost(hostA) scheduler.addHost(hostB) -- cgit v1.2.3