#1417 - Added a test to attempt to statistically verify memory consistency for actors
This commit is contained in:
parent
af3a7101da
commit
070d446165
1 changed files with 49 additions and 0 deletions
|
|
@ -0,0 +1,49 @@
|
|||
package akka.actor
|
||||
|
||||
import akka.testkit.AkkaSpec
|
||||
import akka.dispatch.UnboundedMailbox
|
||||
import akka.util.duration._
|
||||
|
||||
object ConsistencySpec {
|
||||
class CacheMisaligned(var value: Long, var padding1: Long, var padding2: Long, var padding3: Int) //Vars, no final fences
|
||||
|
||||
class ConsistencyCheckingActor extends Actor {
|
||||
var left = new CacheMisaligned(42, 0, 0, 0) //var
|
||||
var right = new CacheMisaligned(0, 0, 0, 0) //var
|
||||
def receive = {
|
||||
case "check" ⇒
|
||||
var shouldBeFortyTwo = left.value + right.value
|
||||
if (shouldBeFortyTwo != 42)
|
||||
sender ! "Test failed"
|
||||
else {
|
||||
left.value += 1
|
||||
right.value -= 1
|
||||
}
|
||||
case "done" ⇒ sender ! "done"; self.stop()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ConsistencySpec extends AkkaSpec {
|
||||
import ConsistencySpec._
|
||||
"The Akka actor model implementation" must {
|
||||
"provide memory consistency" in {
|
||||
val dispatcher = system
|
||||
.dispatcherFactory
|
||||
.newDispatcher("consistency-dispatcher", 1, UnboundedMailbox())
|
||||
.withNewThreadPoolWithArrayBlockingQueueWithCapacityAndFairness(1000, true)
|
||||
.setCorePoolSize(10)
|
||||
.setMaxPoolSize(10)
|
||||
.setKeepAliveTimeInMillis(1)
|
||||
.setAllowCoreThreadTimeout(true)
|
||||
.build
|
||||
|
||||
val props = Props[ConsistencyCheckingActor].withDispatcher(dispatcher)
|
||||
val actors = Vector.fill(3)(system.actorOf(props))
|
||||
for (i ← 1 to 1000000) actors(i % actors.size).tell("check", testActor)
|
||||
for (a ← actors) a.tell("done", testActor)
|
||||
|
||||
for (a ← actors) expectMsg(5 minutes, "done")
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue