From f5c3311297482b87d6b82d14797e1cecc027673f Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 18 Jun 2026 12:18:43 +0100 Subject: [PATCH 1/2] make one of the new persistence-tck journal tests optional --- .../PersistencePluginDocSpec.scala | 30 +++++++++---------- .../pekko/persistence/CapabilityFlags.scala | 10 +++++++ .../japi/journal/JavaJournalPerfSpec.scala | 2 ++ .../persistence/journal/JournalSpec.scala | 24 ++++++++------- .../journal/inmem/InmemJournalSpec.scala | 1 + .../leveldb/LeveldbJournalJavaSpec.scala | 3 ++ .../leveldb/LeveldbJournalNativeSpec.scala | 2 ++ ...nalNoAtomicPersistMultipleEventsSpec.scala | 2 ++ .../PersistenceTestKitJournalCompatSpec.scala | 1 + 9 files changed, 50 insertions(+), 25 deletions(-) diff --git a/docs/src/test/scala/docs/persistence/PersistencePluginDocSpec.scala b/docs/src/test/scala/docs/persistence/PersistencePluginDocSpec.scala index 79d2d8c3dc3..02661d37434 100644 --- a/docs/src/test/scala/docs/persistence/PersistencePluginDocSpec.scala +++ b/docs/src/test/scala/docs/persistence/PersistencePluginDocSpec.scala @@ -14,17 +14,17 @@ package docs.persistence import scala.collection.immutable -import org.apache.pekko.actor.ActorSystem -import org.apache.pekko.testkit.TestKit -import com.typesafe.config._ -import org.scalatest.wordspec.AnyWordSpec - import scala.concurrent.Future -import scala.util.Try import scala.concurrent.duration._ +import scala.util.Try -//#plugin-imports +import com.typesafe.config._ import org.apache.pekko +import pekko.actor.ActorSystem +import pekko.testkit.TestKit +import org.scalatest.wordspec.AnyWordSpec + +//#plugin-imports import pekko.persistence._ import pekko.persistence.journal._ import pekko.persistence.snapshot._ @@ -116,8 +116,8 @@ class PersistencePluginDocSpec extends AnyWordSpec { } object SharedLeveldbPluginDocSpec { - import org.apache.pekko.actor._ - import org.apache.pekko.persistence.journal.leveldb.SharedLeveldbJournal + import pekko.actor._ + import pekko.persistence.journal.leveldb.SharedLeveldbJournal val config = """ @@ -153,9 +153,9 @@ trait SharedLeveldbPluginDocSpec { val system: ActorSystem { - import org.apache.pekko.actor._ + import pekko.actor._ // #shared-store-creation - import org.apache.pekko.persistence.journal.leveldb.SharedLeveldbStore + import pekko.persistence.journal.leveldb.SharedLeveldbStore val store = system.actorOf(Props[SharedLeveldbStore](), "store") // #shared-store-creation @@ -192,7 +192,7 @@ class MySnapshotStore extends SnapshotStore { object PersistenceTCKDoc { object example1 { - import org.apache.pekko.persistence.journal.JournalSpec + import pekko.persistence.journal.JournalSpec // #journal-tck-scala class MyJournalSpec @@ -208,7 +208,7 @@ object PersistenceTCKDoc { // #journal-tck-scala } object example2 { - import org.apache.pekko.persistence.snapshot.SnapshotStoreSpec + import pekko.persistence.snapshot.SnapshotStoreSpec // #snapshot-store-tck-scala class MySnapshotStoreSpec @@ -223,7 +223,7 @@ object PersistenceTCKDoc { // #snapshot-store-tck-scala } object example2b { - import org.apache.pekko.persistence.state.DurableStateStoreSpec + import pekko.persistence.state.DurableStateStoreSpec // #durable-state-tck-scala class MyDurableStateStoreSpec @@ -246,7 +246,7 @@ object PersistenceTCKDoc { object example3 { import java.io.File - import org.apache.pekko.persistence.journal.JournalSpec + import pekko.persistence.journal.JournalSpec import org.iq80.leveldb.util.FileUtils // #journal-tck-before-after-scala diff --git a/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala b/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala index 0821608de36..5c64faeba4b 100644 --- a/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala +++ b/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala @@ -67,6 +67,16 @@ trait JournalCapabilityFlags extends CapabilityFlags { */ protected def supportsMetadata: CapabilityFlag + /** + * When `true` enables tests which check if the Journal supports a replay window that + * spans a deleted prefix. + *

+ * Relates to https://github.com/apache/pekko-persistence-jdbc/pull/517. + * pekko-persistence-dynamodb doesn't yet fully support this. + *

+ */ + protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag + } //#journal-flags diff --git a/persistence-tck/src/main/scala/org/apache/pekko/persistence/japi/journal/JavaJournalPerfSpec.scala b/persistence-tck/src/main/scala/org/apache/pekko/persistence/japi/journal/JavaJournalPerfSpec.scala index 10982f64bfb..7af36d3e380 100644 --- a/persistence-tck/src/main/scala/org/apache/pekko/persistence/japi/journal/JavaJournalPerfSpec.scala +++ b/persistence-tck/src/main/scala/org/apache/pekko/persistence/japi/journal/JavaJournalPerfSpec.scala @@ -65,4 +65,6 @@ class JavaJournalPerfSpec(config: Config) extends JournalPerfSpec(config) { override protected def supportsRejectingNonSerializableObjects: CapabilityFlag = CapabilityFlag.on() override protected def supportsSerialization: CapabilityFlag = CapabilityFlag.on() + + override protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag = CapabilityFlag.on() } diff --git a/persistence-tck/src/main/scala/org/apache/pekko/persistence/journal/JournalSpec.scala b/persistence-tck/src/main/scala/org/apache/pekko/persistence/journal/JournalSpec.scala index 64b683204d6..cd7762d7ac0 100644 --- a/persistence-tck/src/main/scala/org/apache/pekko/persistence/journal/JournalSpec.scala +++ b/persistence-tck/src/main/scala/org/apache/pekko/persistence/journal/JournalSpec.scala @@ -66,6 +66,8 @@ abstract class JournalSpec(config: Config) override protected def supportsMetadata: CapabilityFlag = false + override protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag = false + override protected def beforeEach(): Unit = { super.beforeEach() senderProbe = TestProbe() @@ -259,16 +261,6 @@ abstract class JournalSpec(config: Config) receiverProbe.expectMsg(RecoverySuccess(highestSequenceNr = 5L)) } - "replay surviving messages within bounds when the replay window spans a deleted prefix" in { - val deleteProbe = TestProbe() - journal ! DeleteMessagesTo(pid, 3L, deleteProbe.ref) - deleteProbe.expectMsg(DeleteMessagesSuccess(3L)) - - journal ! ReplayMessages(1, 4, Long.MaxValue, pid, receiverProbe.ref) - receiverProbe.expectMsg(replayedMessage(4)) - receiverProbe.expectMsg(RecoverySuccess(highestSequenceNr = 5L)) - } - "return only recovery success when the upper bound falls within a deleted prefix" in { val deleteProbe = TestProbe() journal ! DeleteMessagesTo(pid, 3L, deleteProbe.ref) @@ -409,5 +401,17 @@ abstract class JournalSpec(config: Config) } } + + optional(flag = supportsReplayWindowSpanningDeletedPrefix) { + "replay surviving messages within bounds when the replay window spans a deleted prefix" in { + val deleteProbe = TestProbe() + journal ! DeleteMessagesTo(pid, 3L, deleteProbe.ref) + deleteProbe.expectMsg(DeleteMessagesSuccess(3L)) + + journal ! ReplayMessages(1, 4, Long.MaxValue, pid, receiverProbe.ref) + receiverProbe.expectMsg(replayedMessage(4)) + receiverProbe.expectMsg(RecoverySuccess(highestSequenceNr = 5L)) + } + } } } diff --git a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/inmem/InmemJournalSpec.scala b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/inmem/InmemJournalSpec.scala index 0d5a8eef2b3..dac1975c466 100644 --- a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/inmem/InmemJournalSpec.scala +++ b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/inmem/InmemJournalSpec.scala @@ -20,4 +20,5 @@ import pekko.persistence.journal.JournalSpec class InmemJournalSpec extends JournalSpec(config = PersistenceSpec.config("inmem", "InmemJournalSpec")) { override protected def supportsRejectingNonSerializableObjects: CapabilityFlag = CapabilityFlag.off() + override protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag = CapabilityFlag.on() } diff --git a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalJavaSpec.scala b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalJavaSpec.scala index 6e9d68db780..89a453b655a 100644 --- a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalJavaSpec.scala +++ b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalJavaSpec.scala @@ -32,4 +32,7 @@ class LeveldbJournalJavaSpec override def supportsRejectingNonSerializableObjects = true override def supportsSerialization = true + + override def supportsReplayWindowSpanningDeletedPrefix = true + } diff --git a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNativeSpec.scala b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNativeSpec.scala index f03a25a7564..e535b1eefe6 100644 --- a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNativeSpec.scala +++ b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNativeSpec.scala @@ -33,4 +33,6 @@ class LeveldbJournalNativeSpec override def supportsSerialization = true + override def supportsReplayWindowSpanningDeletedPrefix = true + } diff --git a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNoAtomicPersistMultipleEventsSpec.scala b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNoAtomicPersistMultipleEventsSpec.scala index 3d77906489d..0a85570f3d5 100644 --- a/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNoAtomicPersistMultipleEventsSpec.scala +++ b/persistence-tck/src/test/scala/org/apache/pekko/persistence/journal/leveldb/LeveldbJournalNoAtomicPersistMultipleEventsSpec.scala @@ -38,4 +38,6 @@ class LeveldbJournalNoAtomicPersistMultipleEventsSpec override def supportsSerialization = true + override def supportsReplayWindowSpanningDeletedPrefix = true + } diff --git a/persistence-testkit/src/test/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKitJournalCompatSpec.scala b/persistence-testkit/src/test/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKitJournalCompatSpec.scala index a30e72ac758..a0eed033b1b 100644 --- a/persistence-testkit/src/test/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKitJournalCompatSpec.scala +++ b/persistence-testkit/src/test/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKitJournalCompatSpec.scala @@ -48,6 +48,7 @@ class PersistenceTestKitJournalCompatSpec extends JournalSpec(config = Persisten override protected def supportsRejectingNonSerializableObjects: CapabilityFlag = true override protected def supportsMetadata: CapabilityFlag = true + override protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag = true } class PersistenceTestKitSnapshotStoreCompatSpec From 697b3fc448ff40442472ca83e15aa2e4cc082b02 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 18 Jun 2026 12:25:18 +0100 Subject: [PATCH 2/2] Update CapabilityFlags.scala --- .../scala/org/apache/pekko/persistence/CapabilityFlags.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala b/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala index 5c64faeba4b..a09441740f4 100644 --- a/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala +++ b/persistence-tck/src/main/scala/org/apache/pekko/persistence/CapabilityFlags.scala @@ -72,7 +72,7 @@ trait JournalCapabilityFlags extends CapabilityFlags { * spans a deleted prefix. *

* Relates to https://github.com/apache/pekko-persistence-jdbc/pull/517. - * pekko-persistence-dynamodb doesn't yet fully support this. + * pekko-persistence-dynamodb doesn't yet fully support this. *

*/ protected def supportsReplayWindowSpanningDeletedPrefix: CapabilityFlag