summaryrefslogtreecommitdiff
path: root/opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2017-09-21 23:25:44 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2017-09-21 23:25:44 +0200
commita031db367c71ec1604b34f3765198c2196bfe551 (patch)
tree793c4af1a9b0c4f8bbc0d901b2a8ae90ac22d4ee /opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container
parent735d5543ed72f0c6cf632b35b3f23323cebcf81b (diff)
Create simple datacenter experiment
Diffstat (limited to 'opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container')
-rw-r--r--opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container/Datacenter.kt62
1 files changed, 61 insertions, 1 deletions
diff --git a/opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container/Datacenter.kt b/opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container/Datacenter.kt
index 4136c03c..f8954527 100644
--- a/opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container/Datacenter.kt
+++ b/opendc-stdlib/src/main/kotlin/nl/atlarge/opendc/topology/container/Datacenter.kt
@@ -24,16 +24,76 @@
package nl.atlarge.opendc.topology.container
+import mu.KotlinLogging
+import nl.atlarge.opendc.extension.topology.destinations
+import nl.atlarge.opendc.kernel.Context
+import nl.atlarge.opendc.kernel.Process
+import nl.atlarge.opendc.kernel.time.Duration
+import nl.atlarge.opendc.scheduler.Scheduler
import nl.atlarge.opendc.topology.Entity
+import nl.atlarge.opendc.topology.machine.Machine
+import nl.atlarge.opendc.workload.Task
+import java.util.*
/**
* A representation of a facility used to house computer systems and associated components.
*
+ * @property scheduler The tasks scheduler the datacenter uses.
+ * @property interval The interval at which task will be (re)scheduled.
* @author Fabian Mastenbroek (f.s.mastenbroek@student.tudelft.nl)
*/
-class Datacenter : Entity<Unit> {
+class Datacenter(val scheduler: Scheduler, val interval: Duration) : Entity<Unit>, Process<Datacenter> {
+ /**
+ * The logger instance to use for the simulator.
+ */
+ private val logger = KotlinLogging.logger {}
+
/**
* The initial state of the entity.
*/
override val initialState = Unit
+
+ /**
+ * This method is invoked to start the simulation an [Entity] associated with this [Process].
+ *
+ * This method is assumed to be running during a simulation, but should hand back control to the simulator at
+ * some point by suspending the process. This allows other processes to do work in the current tick of the
+ * simulation.
+ * Suspending the process can be achieved by calling suspending method in the context:
+ * - [Context.tick] - Wait for the next tick to occur
+ * - [Context.wait] - Wait for `n` amount of ticks before resuming execution.
+ * - [Context.receive] - Wait for a message to be received in the mailbox of the [Entity] before resuming
+ * execution.
+ *
+ * If this method exits early, before the simulation has finished, the entity is assumed to be shutdown and its
+ * simulation will not run any further.
+ */
+ suspend override fun Context<Datacenter>.run() {
+ // The queue of messages to be processed after a cycle
+ val queue: Queue<Any> = ArrayDeque()
+ // Find all machines in the datacenter
+ val machines = outgoingEdges.destinations<Room>("room").asSequence()
+ .flatMap { it.outgoingEdges.destinations<Rack>("rack").asSequence() }
+ .flatMap { it.outgoingEdges.destinations<Machine>("machine").asSequence() }.toList()
+
+ logger.info { "Initialising datacenter with ${machines.size} machines" }
+
+ // Register all machines to the scheduler
+ machines.forEach(scheduler::register)
+
+ while (true) {
+ // Process all messages in the queue
+ while (queue.isNotEmpty()) {
+ val msg = queue.poll()
+ if (msg is Task) {
+ scheduler.submit(msg)
+ }
+ }
+ // (Re)schedule the tasks
+ scheduler.run { schedule() }
+
+ // Sleep a time quantum
+ wait(interval, queue)
+ }
+ }
}