From 2916db1b34279df8d38e389072dd86b3db51013f Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 13 Aug 2015 16:16:29 +0200 Subject: [PATCH] =per #15889 Add tck test for save snapshot with same seqNr --- .../snapshot/SnapshotStoreSpec.scala | 17 ++++++++++++++--- .../akka/persistence/SnapshotProtocol.scala | 10 ++++++++++ .../main/scala/akka/persistence/package.scala | 14 -------------- 3 files changed, 24 insertions(+), 17 deletions(-) delete mode 100644 akka-persistence/src/main/scala/akka/persistence/package.scala diff --git a/akka-persistence-tck/src/main/scala/akka/persistence/snapshot/SnapshotStoreSpec.scala b/akka-persistence-tck/src/main/scala/akka/persistence/snapshot/SnapshotStoreSpec.scala index 587240d212..3f570e871d 100644 --- a/akka-persistence-tck/src/main/scala/akka/persistence/snapshot/SnapshotStoreSpec.scala +++ b/akka-persistence-tck/src/main/scala/akka/persistence/snapshot/SnapshotStoreSpec.scala @@ -77,8 +77,8 @@ abstract class SnapshotStoreSpec(config: Config) extends PluginSpec(config) { snapshotStore.tell(LoadSnapshot(pid, SnapshotSelectionCriteria.Latest.copy(maxTimestamp = metadata(2).timestamp), 13), senderProbe.ref) senderProbe.expectMsg(LoadSnapshotResult(Some(SelectedSnapshot(metadata(2), s"s-3")), 13)) } - "delete a single snapshot identified by snapshot metadata" in { - val md = metadata(2) + "delete a single snapshot identified by sequenceNr in snapshot metadata" in { + val md = metadata(2).copy(timestamp = 0L) // don't care about timestamp for delete of single snap val cmd = DeleteSnapshot(md) val sub = TestProbe() @@ -87,7 +87,7 @@ abstract class SnapshotStoreSpec(config: Config) extends PluginSpec(config) { sub.expectMsg(cmd) senderProbe.expectMsg(DeleteSnapshotSuccess(md)) - snapshotStore.tell(LoadSnapshot(pid, SnapshotSelectionCriteria(md.sequenceNr, md.timestamp), Long.MaxValue), senderProbe.ref) + snapshotStore.tell(LoadSnapshot(pid, SnapshotSelectionCriteria(md.sequenceNr), Long.MaxValue), senderProbe.ref) senderProbe.expectMsg(LoadSnapshotResult(Some(SelectedSnapshot(metadata(1), s"s-2")), Long.MaxValue)) } "delete all snapshots matching upper sequence number and timestamp bounds" in { @@ -106,5 +106,16 @@ abstract class SnapshotStoreSpec(config: Config) extends PluginSpec(config) { snapshotStore.tell(LoadSnapshot(pid, SnapshotSelectionCriteria(metadata(3).sequenceNr, metadata(3).timestamp), Long.MaxValue), senderProbe.ref) senderProbe.expectMsg(LoadSnapshotResult(Some(SelectedSnapshot(metadata(3), s"s-4")), Long.MaxValue)) } + "save and overwrite snapshot with same sequence number" in { + val md = metadata(4) + snapshotStore.tell(SaveSnapshot(md, s"s-5-modified"), senderProbe.ref) + val md2 = senderProbe.expectMsgPF() { case SaveSnapshotSuccess(md2) ⇒ md2 } + md2.sequenceNr should be(md.sequenceNr) + snapshotStore.tell(LoadSnapshot(pid, SnapshotSelectionCriteria(md.sequenceNr), Long.MaxValue), senderProbe.ref) + val result = senderProbe.expectMsgType[LoadSnapshotResult] + result.snapshot.get.snapshot should be("s-5-modified") + result.snapshot.get.metadata.sequenceNr should be(md.sequenceNr) + // metadata timestamp may have been changed + } } } diff --git a/akka-persistence/src/main/scala/akka/persistence/SnapshotProtocol.scala b/akka-persistence/src/main/scala/akka/persistence/SnapshotProtocol.scala index 042b7be716..457d42589e 100644 --- a/akka-persistence/src/main/scala/akka/persistence/SnapshotProtocol.scala +++ b/akka-persistence/src/main/scala/akka/persistence/SnapshotProtocol.scala @@ -16,6 +16,16 @@ package akka.persistence final case class SnapshotMetadata(persistenceId: String, sequenceNr: Long, timestamp: Long = 0L) //#snapshot-metadata +object SnapshotMetadata { + implicit val ordering: Ordering[SnapshotMetadata] = Ordering.fromLessThan[SnapshotMetadata] { (a, b) ⇒ + if (a eq b) false + else if (a.persistenceId != b.persistenceId) a.persistenceId.compareTo(b.persistenceId) < 0 + else if (a.sequenceNr != b.sequenceNr) a.sequenceNr < b.sequenceNr + else if (a.timestamp != b.timestamp) a.timestamp < b.timestamp + else false + } +} + /** * Sent to a [[PersistentActor]] after successful saving of a snapshot. * diff --git a/akka-persistence/src/main/scala/akka/persistence/package.scala b/akka-persistence/src/main/scala/akka/persistence/package.scala deleted file mode 100644 index f46001888e..0000000000 --- a/akka-persistence/src/main/scala/akka/persistence/package.scala +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (C) 2009-2015 Typesafe Inc. - * Copyright (C) 2012-2013 Eligotech BV. - */ - -package akka - -package object persistence { - implicit val snapshotMetadataOrdering = new Ordering[SnapshotMetadata] { - def compare(x: SnapshotMetadata, y: SnapshotMetadata) = - if (x.persistenceId == y.persistenceId) math.signum(x.sequenceNr - y.sequenceNr).toInt - else x.persistenceId.compareTo(y.persistenceId) - } -}