diff options
| author | Dante Niewenhuis <d.niewenhuis@hotmail.com> | 2024-11-19 10:57:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-19 10:57:37 +0100 |
| commit | 698a64615d0eef8994fc1eaf0a3b71da194e1dcd (patch) | |
| tree | c08bdf98b50d0faf20e1a2727a2f3eb84a2b3609 | |
| parent | 279f2a3e54c5b25b58e187a7c89bbddabe5b2724 (diff) | |
Small update to trace-based failure models (#271)
* Added startPoint to TraceBasedFailureModel.kt, this decides where in the trace, the model should start. Added repeat to TraceBasedFailureModel.kt. This decides if the trace should be repeated when finished
* spotless applied
* Fixed some issues with the failure shuffling
* applied spotless
4 files changed, 29 insertions, 7 deletions
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f862..9355b415 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/opendc-compute/opendc-compute-failure/src/main/kotlin/org/opendc/compute/failure/models/TraceBasedFailureModel.kt b/opendc-compute/opendc-compute-failure/src/main/kotlin/org/opendc/compute/failure/models/TraceBasedFailureModel.kt index cab96cd8..3bd253da 100644 --- a/opendc-compute/opendc-compute-failure/src/main/kotlin/org/opendc/compute/failure/models/TraceBasedFailureModel.kt +++ b/opendc-compute/opendc-compute-failure/src/main/kotlin/org/opendc/compute/failure/models/TraceBasedFailureModel.kt @@ -33,6 +33,7 @@ import java.io.File import java.time.InstantSource import java.util.random.RandomGenerator import kotlin.coroutines.CoroutineContext +import kotlin.time.times /** * A definition of a Failure @@ -71,9 +72,10 @@ public class TraceBasedFailureModel( service: ComputeService, random: RandomGenerator, pathToTrace: String, - private val repeat: Boolean = false, + startPoint: Double, + private val repeat: Boolean = true, ) : FailureModel(context, clock, service, random) { - private val failureList = loadTrace(pathToTrace) + private val failureList = loadTrace(pathToTrace, startPoint) override suspend fun runInjector() { do { @@ -92,7 +94,10 @@ public class TraceBasedFailureModel( * * @param pathToFile */ - private fun loadTrace(pathToFile: String): List<Failure> { + private fun loadTrace( + pathToFile: String, + startPoint: Double, + ): List<Failure> { val trace = Trace.open(File(pathToFile), "failure") val reader = checkNotNull(trace.getTable(TABLE_FAILURES)).newReader() @@ -112,7 +117,8 @@ public class TraceBasedFailureModel( entries.add(Failure(failureStartTime, failureDuration, failureIntensity)) } - return entries + val startIndex: Int = (entries.size * startPoint).toInt() + return entries.subList(startIndex, entries.size) + entries.subList(0, startIndex) } catch (e: Exception) { e.printStackTrace() throw e diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/FailureModelSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/FailureModelSpec.kt index 520d7e3d..4a1add59 100644 --- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/FailureModelSpec.kt +++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/experiment/specs/FailureModelSpec.kt @@ -78,6 +78,12 @@ public sealed interface FailureModelSpec { public var name: String } +@Serializable +@SerialName("no") +public data class NoFailureModel( + override var name: String = "no failure model", +) : FailureModelSpec + /** * A failure model spec for failure models based on a failure trace. * @@ -87,11 +93,15 @@ public sealed interface FailureModelSpec { @SerialName("trace-based") public data class TraceBasedFailureModelSpec( public val pathToFile: String, + public val startPoint: Double = 0.0, + public val repeat: Boolean = true, ) : FailureModelSpec { override var name: String = File(pathToFile).nameWithoutExtension init { require(File(pathToFile).exists()) { "Path to file $pathToFile does not exist" } + require(startPoint < 1.0) { "Starting point must be smaller than 1.0" } + require(startPoint >= 0.0) { "Starting point must be equal or larger than 0.0" } } } @@ -267,7 +277,7 @@ public fun createFailureModel( random: java.util.random.RandomGenerator, failureModel: TraceBasedFailureModelSpec, ): FailureModel { - return TraceBasedFailureModel(context, clock, service, random, failureModel.pathToFile) + return TraceBasedFailureModel(context, clock, service, random, failureModel.pathToFile, failureModel.startPoint, failureModel.repeat) } /** diff --git a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt index bffd9624..abf16fef 100644 --- a/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt +++ b/opendc-experiments/opendc-experiments-base/src/test/kotlin/org/opendc/experiments/base/ScenarioIntegrationTest.kt @@ -135,7 +135,11 @@ class ScenarioIntegrationTest { val workload = createTestWorkload("single_task", 1.0, seed) val topology = createTopology("single.json") val monitor = monitor - val failureModelSpec = TraceBasedFailureModelSpec("src/test/resources/failureTraces/single_failure.parquet") + val failureModelSpec = + TraceBasedFailureModelSpec( + "src/test/resources/failureTraces/single_failure.parquet", + repeat = false, + ) Provisioner(dispatcher, seed).use { provisioner -> provisioner.runSteps( @@ -145,6 +149,8 @@ class ScenarioIntegrationTest { ) val service = provisioner.registry.resolve("compute.opendc.org", ComputeService::class.java)!! + service.setTasksExpected(workload.size) + service.replay(timeSource, workload, failureModelSpec = failureModelSpec, seed = seed) } |
