summaryrefslogtreecommitdiff
path: root/opendc/opendc-experiments-sc20/src
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-30 15:27:31 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-30 15:29:50 +0200
commit1699ae13574dddb680dc8176386817fa05816820 (patch)
tree568d54bd76a189a1a46f5b392d26db39cd6b87c3 /opendc/opendc-experiments-sc20/src
parent3777b8fa8126b53d7e049f971bf897c93fe787b1 (diff)
bug: Record start and power off events in SC20 experiments
Diffstat (limited to 'opendc/opendc-experiments-sc20/src')
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt4
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt43
2 files changed, 42 insertions, 5 deletions
diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt
index 441b4498..120c4f81 100644
--- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt
+++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/Sc20Monitor.kt
@@ -22,8 +22,6 @@ class Sc20Monitor(
}
suspend fun onVmStateChanged(server: Server) {
- println("[${simulationContext.clock.millis()}] ${server.uid} ${server.state}")
-
if (server.state == ServerState.ERROR) {
failedInSlice++
}
@@ -44,6 +42,8 @@ class Sc20Monitor(
)
}
+ println("[${simulationContext.clock.millis()}] HOST ${server.uid} ${server.state}")
+
lastServerStates[server] = Pair(server.state, simulationContext.clock.millis())
}
diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
index d697cde3..ed971df5 100644
--- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
+++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
@@ -28,10 +28,13 @@ import com.atlarge.odcsim.Domain
import com.atlarge.odcsim.SimulationEngineProvider
import com.atlarge.odcsim.simulationContext
import com.atlarge.opendc.compute.core.Flavor
+import com.atlarge.opendc.compute.core.Server
import com.atlarge.opendc.compute.core.ServerEvent
+import com.atlarge.opendc.compute.core.ServerState
import com.atlarge.opendc.compute.metal.NODE_CLUSTER
import com.atlarge.opendc.compute.metal.service.ProvisioningService
import com.atlarge.opendc.compute.virt.HypervisorEvent
+import com.atlarge.opendc.compute.virt.driver.SimpleVirtDriver
import com.atlarge.opendc.compute.virt.service.SimpleVirtProvisioningService
import com.atlarge.opendc.compute.virt.service.allocation.AvailableMemoryAllocationPolicy
import com.atlarge.opendc.core.failure.CorrelatedFaultInjector
@@ -141,12 +144,28 @@ fun main(args: Array<String>) {
// Wait for the hypervisors to be spawned
delay(10)
+ val hypervisors = scheduler.drivers()
+ var availableHypervisors = hypervisors.size
+
// Monitor hypervisor events
- for (hypervisor in scheduler.drivers()) {
+ for (hypervisor in hypervisors) {
+ // TODO Do not expose VirtDriver directly but use Hypervisor class.
+ monitor.serverStateChanged(hypervisor, (hypervisor as SimpleVirtDriver).server)
+ hypervisor.server.events
+ .onEach { event ->
+ when (event) {
+ is ServerEvent.StateChanged -> {
+ monitor.serverStateChanged(hypervisor, event.server)
+
+ if (event.server.state == ServerState.ERROR)
+ availableHypervisors -= 1
+ }
+ }
+ }
+ .launchIn(this)
hypervisor.events
.onEach { event ->
when (event) {
- is HypervisorEvent.StateChanged -> monitor.serverStateChanged(event.driver, event.server)
is HypervisorEvent.SliceFinished -> monitor.onSliceFinish(
simulationContext.clock.millis(),
event.requestedBurst,
@@ -171,6 +190,9 @@ fun main(args: Array<String>) {
}
}
+ val running = mutableSetOf<Server>()
+ val finish = Channel<Unit>(Channel.RENDEZVOUS)
+
val reader = Sc20TraceReader(File(traceDirectory), performanceInterferenceModel, getSelectedVmList())
while (reader.hasNext()) {
val (time, workload) = reader.next()
@@ -181,12 +203,27 @@ fun main(args: Array<String>) {
workload.image.name, workload.image,
Flavor(workload.image.cores, workload.image.requiredMemory)
)
+ running += server
// Monitor server events
- server.events.onEach { if (it is ServerEvent.StateChanged) monitor.onVmStateChanged(it.server) }
+ server.events
+ .onEach {
+ if (it is ServerEvent.StateChanged)
+ monitor.onVmStateChanged(it.server)
+
+ // Detect whether the VM has finished running
+ if (it.server.state == ServerState.ERROR || it.server.state == ServerState.SHUTOFF) {
+ running -= server
+
+ if (running.isEmpty() && (!reader.hasNext() || availableHypervisors == 0))
+ finish.send(Unit)
+ }
+ }
.collect()
}
}
+ finish.receive()
+ scheduler.terminate()
println(simulationContext.clock.instant())
}