summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-05-06 15:24:57 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-05-06 15:24:57 +0200
commite2e7e1abaf70d7e49e2e4af04648796f01ba6492 (patch)
treeda7ece74fea9e3924a7b3240dbde9dd48c5f8c18
parent171d9948af5f14243da7aa140a231dbf9ae8df15 (diff)
parentb157ed2791917dd512fd356a573f611ab4de24e9 (diff)
Merge branch 'failures-configurable' into '2.x'
Make failure interval configurable Closes #59 See merge request opendc/opendc-simulator!64
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Experiment.kt23
-rw-r--r--opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt2
2 files changed, 17 insertions, 8 deletions
diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Experiment.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Experiment.kt
index fc4b9058..b1964197 100644
--- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Experiment.kt
+++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Experiment.kt
@@ -67,9 +67,9 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileReader
-import java.lang.IllegalArgumentException
import java.util.ServiceLoader
import java.util.TreeSet
+import kotlin.math.ln
import kotlin.math.max
import kotlin.random.Random
@@ -89,6 +89,8 @@ class ExperimentParameters(parser: ArgParser) {
val seed by parser.storing("the random seed") { toInt() }
.default(0)
val failures by parser.flagging("-x", "--failures", help = "enable (correlated) machine failures")
+ val failureInterval by parser.storing("expected number of hours between failures") { toInt() }
+ .default(24 * 7) // one week
val allocationPolicy by parser.storing("name of VM allocation policy to use").default("core-mem")
fun getSelectedVmList(): List<String> {
@@ -112,7 +114,12 @@ class ExperimentParameters(parser: ArgParser) {
/**
* Construct the failure domain for the experiments.
*/
-suspend fun createFailureDomain(seed: Int, bareMetalProvisioner: ProvisioningService, chan: Channel<Unit>): Domain {
+suspend fun createFailureDomain(
+ seed: Int,
+ failureInterval: Int,
+ bareMetalProvisioner: ProvisioningService,
+ chan: Channel<Unit>
+): Domain {
val root = simulationContext.domain
val domain = root.newDomain(name = "failures")
domain.launch {
@@ -121,7 +128,8 @@ suspend fun createFailureDomain(seed: Int, bareMetalProvisioner: ProvisioningSer
val injectors = mutableMapOf<String, FaultInjector>()
for (node in bareMetalProvisioner.nodes()) {
val cluster = node.metadata[NODE_CLUSTER] as String
- val injector = injectors.getOrPut(cluster) { createFaultInjector(simulationContext.domain, random) }
+ val injector =
+ injectors.getOrPut(cluster) { createFaultInjector(simulationContext.domain, random, failureInterval) }
injector.enqueue(node.metadata["driver"] as FailureDomain)
}
}
@@ -131,11 +139,12 @@ suspend fun createFailureDomain(seed: Int, bareMetalProvisioner: ProvisioningSer
/**
* Obtain the [FaultInjector] to use for the experiments.
*/
-fun createFaultInjector(domain: Domain, random: Random): FaultInjector {
+fun createFaultInjector(domain: Domain, random: Random, failureInterval: Int): FaultInjector {
// Parameters from A. Iosup, A Framework for the Study of Grid Inter-Operation Mechanisms, 2009
// GRID'5000
- return CorrelatedFaultInjector(domain,
- iatScale = -1.39, iatShape = 1.03, // Hours
+ return CorrelatedFaultInjector(
+ domain,
+ iatScale = ln(failureInterval.toDouble()), iatShape = 1.03, // Hours
sizeScale = 1.88, sizeShape = 1.25,
dScale = 9.51, dShape = 3.21, // Minutes
random = random
@@ -341,7 +350,7 @@ fun main(args: Array<String>) {
val failureDomain = if (cli.failures) {
println("ENABLING failures")
- createFailureDomain(cli.seed, bareMetalProvisioner, chan)
+ createFailureDomain(cli.seed, cli.failureInterval, bareMetalProvisioner, chan)
} else {
null
}
diff --git a/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt b/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt
index dd0931e4..2bf6bcf3 100644
--- a/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt
+++ b/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt
@@ -101,7 +101,7 @@ class Sc20IntegrationTest {
val failureDomain = if (failures) {
println("ENABLING failures")
- createFailureDomain(seed, bareMetalProvisioner, chan)
+ createFailureDomain(seed, 24 * 7, bareMetalProvisioner, chan)
} else {
null
}