From 028960fbf584c903156c713447194df56ec5059e Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 18 Feb 2022 12:35:11 +0100 Subject: feat(utils): Add Pacer to pace scheduling cycles This change adds a new Pacer class that can pace the incoming scheduling requests into scheduling cycles by allowing the user to specify a scheduling quantum. --- .../service/internal/WorkflowServiceImpl.kt | 38 ++++------------------ 1 file changed, 6 insertions(+), 32 deletions(-) (limited to 'opendc-workflow') diff --git a/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt b/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt index 7b6d8651..cb4bfd45 100644 --- a/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt +++ b/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt @@ -26,7 +26,7 @@ import io.opentelemetry.api.metrics.Meter import io.opentelemetry.api.metrics.MeterProvider import kotlinx.coroutines.* import org.opendc.compute.api.* -import org.opendc.utils.TimerScheduler +import org.opendc.utils.Pacer import org.opendc.workflow.api.Job import org.opendc.workflow.api.WORKFLOW_TASK_CORES import org.opendc.workflow.service.* @@ -187,9 +187,9 @@ public class WorkflowServiceImpl( .build() /** - * The [TimerScheduler] to use for scheduling the scheduler cycles. + * The [Pacer] to use for scheduling the scheduler cycles. */ - private val timerScheduler: TimerScheduler = TimerScheduler(scope.coroutineContext, clock) + private val pacer = Pacer(scope.coroutineContext, clock, schedulingQuantum.toMillis()) { doSchedule() } private val jobAdmissionPolicy: JobAdmissionPolicy.Logic private val taskEligibilityPolicy: TaskEligibilityPolicy.Logic @@ -230,7 +230,7 @@ public class WorkflowServiceImpl( rootListener.jobSubmitted(jobInstance) submittedJobs.add(1) - requestSchedulingCycle() + pacer.enqueue() } override fun close() { @@ -251,31 +251,6 @@ public class WorkflowServiceImpl( rootListener.listeners -= listener } - /** - * Indicate that a new scheduling cycle is needed due to a change to the service's state. - */ - private fun requestSchedulingCycle() { - // Bail out in case we have already requested a new cycle or the queue is empty. - if (timerScheduler.isTimerActive(Unit)) { - return - } - - val quantum = schedulingQuantum.toMillis() - if (quantum == 0L) { - doSchedule() - return - } - - // We assume that the provisioner runs at a fixed slot every time quantum (e.g t=0, t=60, t=120). - // This is important because the slices of the VMs need to be aligned. - // We calculate here the delay until the next scheduling slot. - val delay = quantum - (clock.millis() % quantum) - - timerScheduler.startSingleTimer(Unit, delay) { - doSchedule() - } - } - /** * Perform a scheduling cycle immediately. */ @@ -409,10 +384,9 @@ public class WorkflowServiceImpl( finishJob(job) } - requestSchedulingCycle() - } - ServerState.DELETED -> { + pacer.enqueue() } + ServerState.DELETED -> {} else -> throw IllegalStateException() } } -- cgit v1.2.3 From 52d35cd82905612f0ef9f7b7d88611300fb48ebe Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 18 Feb 2022 14:08:18 +0100 Subject: refactor(utils): Rename utils module to common module This change adds a new module, opendc-common, that contains functionality that is shared across OpenDC's modules. We move the existing utils module into this new module. --- opendc-workflow/opendc-workflow-service/build.gradle.kts | 2 +- .../kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'opendc-workflow') diff --git a/opendc-workflow/opendc-workflow-service/build.gradle.kts b/opendc-workflow/opendc-workflow-service/build.gradle.kts index 4d8b7d7f..8f082e2f 100644 --- a/opendc-workflow/opendc-workflow-service/build.gradle.kts +++ b/opendc-workflow/opendc-workflow-service/build.gradle.kts @@ -34,7 +34,7 @@ dependencies { api(projects.opendcWorkflow.opendcWorkflowApi) api(projects.opendcCompute.opendcComputeApi) api(projects.opendcTelemetry.opendcTelemetryApi) - implementation(projects.opendcUtils) + implementation(projects.opendcCommon) implementation(libs.kotlin.logging) testImplementation(projects.opendcWorkflow.opendcWorkflowWorkload) diff --git a/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt b/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt index cb4bfd45..cdaec021 100644 --- a/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt +++ b/opendc-workflow/opendc-workflow-service/src/main/kotlin/org/opendc/workflow/service/internal/WorkflowServiceImpl.kt @@ -25,8 +25,8 @@ package org.opendc.workflow.service.internal import io.opentelemetry.api.metrics.Meter import io.opentelemetry.api.metrics.MeterProvider import kotlinx.coroutines.* +import org.opendc.common.util.Pacer import org.opendc.compute.api.* -import org.opendc.utils.Pacer import org.opendc.workflow.api.Job import org.opendc.workflow.api.WORKFLOW_TASK_CORES import org.opendc.workflow.service.* -- cgit v1.2.3 From 77aaf078650c054ccbaf5f46a71ab218390a571e Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 18 Feb 2022 14:53:12 +0100 Subject: build: Remove opendc-platform module This change removes the opendc-platform module from the project. This module represented a Java platform which was previously used for sharing a set of dependency versions between subprojects. However, with the version catalogue that was added by Gradle, we currently do not use the platform anymore. --- opendc-workflow/opendc-workflow-api/build.gradle.kts | 1 - opendc-workflow/opendc-workflow-service/build.gradle.kts | 1 - opendc-workflow/opendc-workflow-workload/build.gradle.kts | 1 - 3 files changed, 3 deletions(-) (limited to 'opendc-workflow') diff --git a/opendc-workflow/opendc-workflow-api/build.gradle.kts b/opendc-workflow/opendc-workflow-api/build.gradle.kts index 36239d05..03569d8c 100644 --- a/opendc-workflow/opendc-workflow-api/build.gradle.kts +++ b/opendc-workflow/opendc-workflow-api/build.gradle.kts @@ -28,7 +28,6 @@ plugins { } dependencies { - api(platform(projects.opendcPlatform)) api(projects.opendcCompute.opendcComputeApi) implementation(libs.kotlin.logging) } diff --git a/opendc-workflow/opendc-workflow-service/build.gradle.kts b/opendc-workflow/opendc-workflow-service/build.gradle.kts index 8f082e2f..17df33e3 100644 --- a/opendc-workflow/opendc-workflow-service/build.gradle.kts +++ b/opendc-workflow/opendc-workflow-service/build.gradle.kts @@ -30,7 +30,6 @@ plugins { } dependencies { - api(platform(projects.opendcPlatform)) api(projects.opendcWorkflow.opendcWorkflowApi) api(projects.opendcCompute.opendcComputeApi) api(projects.opendcTelemetry.opendcTelemetryApi) diff --git a/opendc-workflow/opendc-workflow-workload/build.gradle.kts b/opendc-workflow/opendc-workflow-workload/build.gradle.kts index dfb77a39..a9d497af 100644 --- a/opendc-workflow/opendc-workflow-workload/build.gradle.kts +++ b/opendc-workflow/opendc-workflow-workload/build.gradle.kts @@ -29,7 +29,6 @@ plugins { } dependencies { - api(platform(projects.opendcPlatform)) api(projects.opendcWorkflow.opendcWorkflowService) implementation(projects.opendcSimulator.opendcSimulatorCompute) -- cgit v1.2.3