summaryrefslogtreecommitdiff
path: root/simulator/opendc-serverless
diff options
context:
space:
mode:
Diffstat (limited to 'simulator/opendc-serverless')
-rw-r--r--simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/SimFunctionDeployer.kt45
-rw-r--r--simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/workload/SimServerlessWorkload.kt14
-rw-r--r--simulator/opendc-serverless/opendc-serverless-simulator/src/test/kotlin/org/opendc/serverless/simulator/SimServerlessServiceTest.kt10
3 files changed, 29 insertions, 40 deletions
diff --git a/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/SimFunctionDeployer.kt b/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/SimFunctionDeployer.kt
index f28a926b..160f8ebb 100644
--- a/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/SimFunctionDeployer.kt
+++ b/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/SimFunctionDeployer.kt
@@ -111,33 +111,34 @@ public class SimFunctionDeployer(
internal fun start() {
check(state == FunctionInstanceState.Provisioning) { "Invalid state of function instance" }
job = scope.launch {
- workload.onStart()
+ launch {
+ try {
+ machine.run(workload)
+ } finally {
+ state = FunctionInstanceState.Terminated
+ }
+ }
- try {
- while (isActive) {
- chan.receive()
+ while (isActive) {
+ chan.receive()
- if (queue.isNotEmpty()) {
- state = FunctionInstanceState.Active
- }
+ if (queue.isNotEmpty()) {
+ state = FunctionInstanceState.Active
+ }
- while (queue.isNotEmpty()) {
- val request = queue.poll()
- try {
- machine.run(workload.onInvoke())
- request.cont.resume(Unit)
- } catch (cause: CancellationException) {
- request.cont.resumeWithException(cause)
- throw cause
- } catch (cause: Throwable) {
- request.cont.resumeWithException(cause)
- }
+ while (queue.isNotEmpty()) {
+ val request = queue.poll()
+ try {
+ workload.invoke()
+ request.cont.resume(Unit)
+ } catch (cause: CancellationException) {
+ request.cont.resumeWithException(cause)
+ throw cause
+ } catch (cause: Throwable) {
+ request.cont.resumeWithException(cause)
}
- state = FunctionInstanceState.Idle
}
- } finally {
- state = FunctionInstanceState.Terminated
- workload.onStop()
+ state = FunctionInstanceState.Idle
}
}
}
diff --git a/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/workload/SimServerlessWorkload.kt b/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/workload/SimServerlessWorkload.kt
index afdc05af..121bf915 100644
--- a/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/workload/SimServerlessWorkload.kt
+++ b/simulator/opendc-serverless/opendc-serverless-simulator/src/main/kotlin/org/opendc/serverless/simulator/workload/SimServerlessWorkload.kt
@@ -27,19 +27,9 @@ import org.opendc.simulator.compute.workload.SimWorkload
/**
* A model for a serverless workload, which may be invoked multiple times.
*/
-public interface SimServerlessWorkload {
- /**
- * This method is invoked when a function instance is launched.
- */
- public fun onStart() {}
-
+public interface SimServerlessWorkload : SimWorkload {
/**
* This method is invoked when an active function instance is invoked.
*/
- public fun onInvoke(): SimWorkload
-
- /**
- * This method is invoked when the function instance is stopped.
- */
- public fun onStop() {}
+ public suspend fun invoke()
}
diff --git a/simulator/opendc-serverless/opendc-serverless-simulator/src/test/kotlin/org/opendc/serverless/simulator/SimServerlessServiceTest.kt b/simulator/opendc-serverless/opendc-serverless-simulator/src/test/kotlin/org/opendc/serverless/simulator/SimServerlessServiceTest.kt
index 597b5ce0..89998585 100644
--- a/simulator/opendc-serverless/opendc-serverless-simulator/src/test/kotlin/org/opendc/serverless/simulator/SimServerlessServiceTest.kt
+++ b/simulator/opendc-serverless/opendc-serverless-simulator/src/test/kotlin/org/opendc/serverless/simulator/SimServerlessServiceTest.kt
@@ -22,8 +22,8 @@
package org.opendc.serverless.simulator
+import io.mockk.coVerify
import io.mockk.spyk
-import io.mockk.verify
import io.opentelemetry.api.metrics.MeterProvider
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -65,8 +65,8 @@ internal class SimServerlessServiceTest {
fun testSmoke() = runBlockingTest {
val meter = MeterProvider.noop().get("opendc-serverless")
val clock = DelayControllerClockAdapter(this)
- val workload = spyk(object : SimServerlessWorkload {
- override fun onInvoke(): SimWorkload = SimFlopsWorkload(1000)
+ val workload = spyk(object : SimServerlessWorkload, SimWorkload by SimFlopsWorkload(1000) {
+ override suspend fun invoke() {}
})
val deployer = SimFunctionDeployer(clock, this, machineModel) { workload }
val service = ServerlessService(coroutineContext, clock, meter, deployer, RandomRoutingPolicy())
@@ -82,9 +82,7 @@ internal class SimServerlessServiceTest {
yield()
assertAll(
- { verify { workload.onStart() } },
- { verify { workload.onInvoke() } },
- { verify { workload.onStop() } }
+ { coVerify { workload.invoke() } },
)
}
}