Merge pull request #18085 from ktoso/wip-persistence-atomicwrite-impr-ktoso

+per #18076 makes AtomicWrite more user friendly
This commit is contained in:
Konrad Malawski 2015-08-10 18:36:02 +02:00
commit 7896e98f53
2 changed files with 54 additions and 0 deletions

View file

@ -38,6 +38,20 @@ object AtomicWrite {
}
final case class AtomicWrite(payload: immutable.Seq[PersistentRepr]) extends PersistentEnvelope with Message {
// only check that all persistenceIds are equal when there's more than one in the Seq
if (payload match {
case l: List[PersistentRepr] => l.tail.nonEmpty
case v: Vector[PersistentRepr] => v.size > 1
case _ => true // some other collection type, let's just check
}) require(payload.forall(_.persistenceId == payload.head.persistenceId),
"AtomicWrite must contain messages for the same persistenceId, " +
s"yet different persistenceIds found: ${payload.map(_.persistenceId).toSet}")
def persistenceId = payload.head.persistenceId
def lowestSequenceNr = payload.head.sequenceNr // this assumes they're gapless; they should be (it is only our code creating AWs)
def highestSequenceNr = payload.last.sequenceNr // TODO: could be optimised, since above require traverses already
override def sender: ActorRef = ActorRef.noSender
override def size: Int = payload.size
}

View file

@ -0,0 +1,40 @@
/*
* Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.persistence
import org.scalatest.{ Matchers, WordSpec }
class AtomicWriteSpec extends WordSpec with Matchers {
"AtomicWrite" must {
"only contain messages for the same persistence id" in {
AtomicWrite(
PersistentRepr("", 1, "p1") ::
PersistentRepr("", 2, "p1") :: Nil).persistenceId should ===("p1")
intercept[IllegalArgumentException] {
AtomicWrite(
PersistentRepr("", 1, "p1") ::
PersistentRepr("", 2, "p1") ::
PersistentRepr("", 3, "p2") :: Nil)
}
}
"have highestSequenceNr" in {
AtomicWrite(
PersistentRepr("", 1, "p1") ::
PersistentRepr("", 2, "p1") ::
PersistentRepr("", 3, "p1") :: Nil).highestSequenceNr should ===(3)
}
"have lowestSequenceNr" in {
AtomicWrite(
PersistentRepr("", 2, "p1") ::
PersistentRepr("", 3, "p1") ::
PersistentRepr("", 4, "p1") :: Nil).lowestSequenceNr should ===(2)
}
}
}