Skip to content

Commit 38e7217

Browse files
He-PinCopilot
andauthored
Only one retention cycle in progress at a time (#2797)
* fix: Only one retention cycle in progress at a time Track retention lifecycle steps with mutable retentionInProgress state in BehaviorSetup. Key changes: - Add retentionInProgress flag and 6 progress tracking methods with detailed debug logging to BehaviorSetup. - Skip new retention cycle when previous one has not completed yet, logging at INFO level. Next retention will cover skipped retention. - Simplify internalDeleteSnapshots to always use minSequenceNr=0, preventing leftover snapshots when retention is skipped. - Remove now-unnecessary deleteLowerSequenceNr from SnapshotCountRetentionCriteriaImpl. - Fix upstream logging placeholder mismatch bug in retentionProgressDeleteEventsEnded (2 placeholders, 1 argument). The retention process for SnapshotCountRetentionCriteria: 1. Save snapshot when shouldSnapshotAfterPersist returns SnapshotWithRetention. 2. Delete events (when deleteEventsOnSnapshot=true), in background. 3. Delete snapshots (when isOnlyOneSnapshot=false), in background. Upstream: akka/akka-core@57b750a3dc Cherry-picked from akka/akka-core v2.8.0, which is now Apache licensed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review feedback: format long line, use DEBUG log level, add rationale comments - Reformat RetentionCriteriaSpec expected list to multi-line for readability - Change 'Skipping retention' log level from INFO to DEBUG to avoid log noise - Add design rationale comment explaining why snapshot+retention are skipped together (prevents orphaned snapshots that would never be cleaned up) - Add Scaladoc explaining why minSequenceNr=0L is used (simplifies logic, safe for built-in snapshot stores) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: remaining two-arg expectDeleteSnapshotCompleted calls in retention spec Lines 292 and 298 still used the old two-argument form after the API change to single-argument expectDeleteSnapshotCompleted(Long). --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 49e74d3 commit 38e7217

8 files changed

Lines changed: 193 additions & 68 deletions

File tree

persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorRetentionSpec.scala

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,12 @@ object EventSourcedBehaviorRetentionSpec extends Matchers {
114114
completed
115115
}
116116

117-
def expectDeleteSnapshotCompleted(maxSequenceNr: Long, minSequenceNr: Long): DeleteSnapshotsCompleted = {
117+
def expectDeleteSnapshotCompleted(maxSequenceNr: Long): DeleteSnapshotsCompleted = {
118118
val wrapped = probe.expectMessageType[WrappedSignal]
119119
wrapped.signal shouldBe a[DeleteSnapshotsCompleted]
120120
val signal = wrapped.signal.asInstanceOf[DeleteSnapshotsCompleted]
121121
signal.target should ===(
122-
DeletionTarget.Criteria(
123-
SnapshotSelectionCriteria.latest.withMaxSequenceNr(maxSequenceNr).withMinSequenceNr(minSequenceNr)))
122+
DeletionTarget.Criteria(SnapshotSelectionCriteria.latest.withMaxSequenceNr(maxSequenceNr)))
124123
signal
125124
}
126125
}
@@ -284,25 +283,25 @@ class EventSourcedBehaviorRetentionSpec
284283
snapshotSignalProbe.expectSnapshotCompleted(3)
285284
snapshotSignalProbe.expectSnapshotCompleted(6)
286285
snapshotSignalProbe.expectSnapshotCompleted(9)
287-
snapshotSignalProbe.expectDeleteSnapshotCompleted(3, 0)
286+
snapshotSignalProbe.expectDeleteSnapshotCompleted(3)
288287

289288
(1 to 3).foreach(_ => persistentActor ! Increment)
290289
persistentActor ! GetValue(replyProbe.ref)
291290
replyProbe.expectMessage(State(13, (0 until 13).toVector))
292291
snapshotSignalProbe.expectSnapshotCompleted(12)
293-
snapshotSignalProbe.expectDeleteSnapshotCompleted(6, 0)
292+
snapshotSignalProbe.expectDeleteSnapshotCompleted(6)
294293

295294
(1 to 3).foreach(_ => persistentActor ! Increment)
296295
persistentActor ! GetValue(replyProbe.ref)
297296
replyProbe.expectMessage(State(16, (0 until 16).toVector))
298297
snapshotSignalProbe.expectSnapshotCompleted(15)
299-
snapshotSignalProbe.expectDeleteSnapshotCompleted(9, 3)
298+
snapshotSignalProbe.expectDeleteSnapshotCompleted(9)
300299

301300
(1 to 4).foreach(_ => persistentActor ! Increment)
302301
persistentActor ! GetValue(replyProbe.ref)
303302
replyProbe.expectMessage(State(20, (0 until 20).toVector))
304303
snapshotSignalProbe.expectSnapshotCompleted(18)
305-
snapshotSignalProbe.expectDeleteSnapshotCompleted(12, 6)
304+
snapshotSignalProbe.expectDeleteSnapshotCompleted(12)
306305

307306
snapshotSignalProbe.expectNoMessage()
308307
}
@@ -331,31 +330,31 @@ class EventSourcedBehaviorRetentionSpec
331330
// The reason for -1 is that a snapshot at the exact toSequenceNr is still useful and the events
332331
// after that can be replayed after that snapshot, but replaying the events after toSequenceNr without
333332
// starting at the snapshot at toSequenceNr would be invalid.
334-
snapshotSignalProbe.expectDeleteSnapshotCompleted(2, 0)
333+
snapshotSignalProbe.expectDeleteSnapshotCompleted(2)
335334

336335
// one at a time since snapshotting+event-deletion switches to running state before deleting snapshot so ordering
337336
// if sending many commands in one go is not deterministic
338337
persistentActor ! Increment // 11
339338
persistentActor ! Increment // 12
340339
snapshotSignalProbe.expectSnapshotCompleted(12)
341340
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 6
342-
snapshotSignalProbe.expectDeleteSnapshotCompleted(5, 0)
341+
snapshotSignalProbe.expectDeleteSnapshotCompleted(5)
343342

344343
persistentActor ! Increment // 13
345344
persistentActor ! Increment // 14
346345
persistentActor ! Increment // 11
347346
persistentActor ! Increment // 15
348347
snapshotSignalProbe.expectSnapshotCompleted(15)
349348
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 9
350-
snapshotSignalProbe.expectDeleteSnapshotCompleted(8, 2)
349+
snapshotSignalProbe.expectDeleteSnapshotCompleted(8)
351350

352351
persistentActor ! Increment // 16
353352
persistentActor ! Increment // 17
354353
persistentActor ! Increment // 18
355354
snapshotSignalProbe.expectSnapshotCompleted(18)
356355

357356
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 12
358-
snapshotSignalProbe.expectDeleteSnapshotCompleted(11, 5)
357+
snapshotSignalProbe.expectDeleteSnapshotCompleted(11)
359358

360359
eventProbe.expectNoMessage()
361360
snapshotSignalProbe.expectNoMessage()
@@ -381,7 +380,7 @@ class EventSourcedBehaviorRetentionSpec
381380
(4 to 10).foreach(_ => persistentActor ! Increment)
382381
snapshotSignalProbe.expectSnapshotCompleted(5)
383382
snapshotSignalProbe.expectSnapshotCompleted(10)
384-
snapshotSignalProbe.expectDeleteSnapshotCompleted(5, 0)
383+
snapshotSignalProbe.expectDeleteSnapshotCompleted(5)
385384

386385
(11 to 13).foreach(_ => persistentActor ! Increment)
387386
snapshotSignalProbe.expectSnapshotCompleted(13)
@@ -395,7 +394,7 @@ class EventSourcedBehaviorRetentionSpec
395394
persistentActor ! GetValue(replyProbe.ref)
396395
replyProbe.expectMessage(State(16, (0 until 16).toVector))
397396
snapshotSignalProbe.expectSnapshotCompleted(15)
398-
snapshotSignalProbe.expectDeleteSnapshotCompleted(10, 5)
397+
snapshotSignalProbe.expectDeleteSnapshotCompleted(10)
399398
eventProbe.within(3.seconds) {
400399
eventProbe.expectNoMessage()
401400
snapshotSignalProbe.expectNoMessage()
@@ -438,18 +437,18 @@ class EventSourcedBehaviorRetentionSpec
438437
snapshotSignalProbe.expectSnapshotCompleted(8) // every-2 through criteria
439438
// triggers delete up to snapshot no 2
440439
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 2
441-
snapshotSignalProbe.expectDeleteSnapshotCompleted(1, 0) // then delete oldest snapshot
440+
snapshotSignalProbe.expectDeleteSnapshotCompleted(1) // then delete oldest snapshot
442441

443442
persistentActor ! Increment // 9
444443
persistentActor ! Increment // 10
445444
snapshotSignalProbe.expectSnapshotCompleted(10) // every-2 through criteria
446-
snapshotSignalProbe.expectDeleteSnapshotCompleted(3, 0)
445+
snapshotSignalProbe.expectDeleteSnapshotCompleted(3)
447446
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 4
448447

449448
persistentActor ! Increment // 11
450449
persistentActor ! Increment // 12
451450
snapshotSignalProbe.expectSnapshotCompleted(12) // every-2 through criteria
452-
snapshotSignalProbe.expectDeleteSnapshotCompleted(5, 0)
451+
snapshotSignalProbe.expectDeleteSnapshotCompleted(5)
453452
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 6
454453

455454
persistentActor ! Increment // 13
@@ -463,13 +462,13 @@ class EventSourcedBehaviorRetentionSpec
463462
persistentActor ! Increment // 14
464463
snapshotSignalProbe.expectSnapshotCompleted(14) // every-2 through criteria
465464
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 8
466-
snapshotSignalProbe.expectDeleteSnapshotCompleted(7, 1)
465+
snapshotSignalProbe.expectDeleteSnapshotCompleted(7)
467466

468467
persistentActor ! Increment // 15
469468
persistentActor ! Increment // 16
470469
snapshotSignalProbe.expectSnapshotCompleted(16) // every-2 through criteria
471470
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 10
472-
snapshotSignalProbe.expectDeleteSnapshotCompleted(9, 3)
471+
snapshotSignalProbe.expectDeleteSnapshotCompleted(9)
473472

474473
eventProbe.within(3.seconds) {
475474
eventProbe.expectNoMessage()
@@ -501,31 +500,31 @@ class EventSourcedBehaviorRetentionSpec
501500
snapshotSignalProbe.expectSnapshotCompleted(2)
502501
snapshotSignalProbe.expectSnapshotCompleted(3)
503502
snapshotSignalProbe.expectSnapshotCompleted(4)
504-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(1, 0)
503+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(1)
505504

506505
persistentActor ! Increment
507506
snapshotSignalProbe.expectSnapshotCompleted(5)
508-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(2, 0)
507+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(2)
509508

510509
persistentActor ! Increment
511510
snapshotSignalProbe.expectSnapshotCompleted(6)
512-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(3, 0)
511+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(3)
513512

514513
persistentActor ! Increment
515514
snapshotSignalProbe.expectSnapshotCompleted(7)
516-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(4, 1)
515+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(4)
517516

518517
persistentActor ! Increment
519518
snapshotSignalProbe.expectSnapshotCompleted(8)
520-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(5, 2)
519+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(5)
521520

522521
persistentActor ! Increment
523522
snapshotSignalProbe.expectSnapshotCompleted(9)
524-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(6, 3)
523+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(6)
525524

526525
persistentActor ! Increment
527526
snapshotSignalProbe.expectSnapshotCompleted(10)
528-
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(7, 4)
527+
deleteSnapshotSignalProbe.expectDeleteSnapshotCompleted(7)
529528

530529
persistentActor ! GetValue(replyProbe.ref)
531530
replyProbe.expectMessage(State(10, (0 until 10).toVector))
@@ -554,32 +553,32 @@ class EventSourcedBehaviorRetentionSpec
554553
persistentActor ! Increment // 5
555554
snapshotSignalProbe.expectSnapshotCompleted(5)
556555
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 2
557-
snapshotSignalProbe.expectDeleteSnapshotCompleted(1, 0)
556+
snapshotSignalProbe.expectDeleteSnapshotCompleted(1)
558557

559558
persistentActor ! Increment // 6
560559
snapshotSignalProbe.expectSnapshotCompleted(6)
561560
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 3
562-
snapshotSignalProbe.expectDeleteSnapshotCompleted(2, 0)
561+
snapshotSignalProbe.expectDeleteSnapshotCompleted(2)
563562

564563
persistentActor ! Increment // 7
565564
snapshotSignalProbe.expectSnapshotCompleted(7)
566565
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 4
567-
snapshotSignalProbe.expectDeleteSnapshotCompleted(3, 0)
566+
snapshotSignalProbe.expectDeleteSnapshotCompleted(3)
568567

569568
persistentActor ! Increment // 8
570569
snapshotSignalProbe.expectSnapshotCompleted(8)
571570
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 5
572-
snapshotSignalProbe.expectDeleteSnapshotCompleted(4, 1)
571+
snapshotSignalProbe.expectDeleteSnapshotCompleted(4)
573572

574573
persistentActor ! Increment // 9
575574
snapshotSignalProbe.expectSnapshotCompleted(9)
576575
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 6
577-
snapshotSignalProbe.expectDeleteSnapshotCompleted(5, 2)
576+
snapshotSignalProbe.expectDeleteSnapshotCompleted(5)
578577

579578
persistentActor ! Increment // 10
580579
snapshotSignalProbe.expectSnapshotCompleted(10)
581580
eventProbe.expectMessageType[Success[DeleteEventsCompleted]].value.toSequenceNr shouldEqual 7
582-
snapshotSignalProbe.expectDeleteSnapshotCompleted(6, 3)
581+
snapshotSignalProbe.expectDeleteSnapshotCompleted(6)
583582
}
584583

585584
"snapshot on recovery if expected snapshot is missing" in {

persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorWatchSpec.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ class EventSourcedBehaviorWatchSpec
8787
stashState = new StashState(context.asInstanceOf[ActorContext[InternalProtocol]], settings),
8888
replication = None,
8989
publishEvents = false,
90-
internalLoggerFactory = () => logger)
90+
internalLoggerFactory = () => logger,
91+
retentionInProgress = false)
9192

9293
"A typed persistent parent actor watching a child" must {
9394

persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/BehaviorSetup.scala

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import pekko.actor.{ ActorRef => ClassicActorRef }
2222
import pekko.actor.Cancellable
2323
import pekko.actor.typed.Signal
2424
import pekko.actor.typed.scaladsl.ActorContext
25+
import pekko.actor.typed.scaladsl.LoggerOps
2526
import pekko.annotation.InternalApi
2627
import pekko.persistence._
2728
import pekko.persistence.typed.EventAdapter
@@ -71,7 +72,8 @@ private[pekko] final class BehaviorSetup[C, E, S](
7172
val stashState: StashState,
7273
val replication: Option[ReplicationSetup],
7374
val publishEvents: Boolean,
74-
private val internalLoggerFactory: () => Logger) {
75+
private val internalLoggerFactory: () => Logger,
76+
private var retentionInProgress: Boolean) {
7577

7678
import BehaviorSetup._
7779
import InternalProtocol.RecoveryTickEvent
@@ -197,6 +199,110 @@ private[pekko] final class BehaviorSetup[C, E, S](
197199
}
198200
}
199201

202+
// The retention process for SnapshotCountRetentionCriteria looks like this:
203+
// 1. Save snapshot after persisting events when shouldSnapshotAfterPersist returned SnapshotWithRetention.
204+
// 2. Delete events (when deleteEventsOnSnapshot=true), runs in background.
205+
// 3. Delete snapshots (when isOnlyOneSnapshot=false), runs in background.
206+
207+
def isRetentionInProgress(): Boolean =
208+
retentionInProgress
209+
210+
def retentionProgressSaveSnapshotStarted(sequenceNr: Long): Unit = {
211+
retention match {
212+
case SnapshotCountRetentionCriteriaImpl(_, _, _) =>
213+
internalLogger.debug("Starting retention at seqNr [{}], saving snapshot.", sequenceNr)
214+
retentionInProgress = true
215+
case _ =>
216+
}
217+
}
218+
219+
def retentionProgressSaveSnapshotEnded(sequenceNr: Long, success: Boolean): Unit = {
220+
retention match {
221+
case SnapshotCountRetentionCriteriaImpl(_, _, deleteEvents) if retentionInProgress =>
222+
if (!success) {
223+
internalLogger.debug("Retention at seqNr [{}] is completed, saving snapshot failed.", sequenceNr)
224+
retentionInProgress = false
225+
} else if (deleteEvents) {
226+
internalLogger.debug("Retention at seqNr [{}], saving snapshot was successful.", sequenceNr)
227+
} else if (isOnlyOneSnapshot) {
228+
// no delete of events and no delete of snapshots => done
229+
internalLogger.debug("Retention at seqNr [{}] is completed, saving snapshot was successful.", sequenceNr)
230+
retentionInProgress = false
231+
} else {
232+
internalLogger.debug("Retention at seqNr [{}], saving snapshot was successful.", sequenceNr)
233+
}
234+
case _ =>
235+
}
236+
}
237+
238+
def retentionProgressDeleteEventsStarted(sequenceNr: Long, deleteToSequenceNr: Long): Unit = {
239+
retention match {
240+
case SnapshotCountRetentionCriteriaImpl(_, _, true) if retentionInProgress =>
241+
if (deleteToSequenceNr > 0) {
242+
internalLogger.debug2(
243+
"Retention at seqNr [{}], deleting events to seqNr [{}].",
244+
sequenceNr,
245+
deleteToSequenceNr)
246+
} else {
247+
internalLogger.debug("Retention is completed, no events to delete.")
248+
retentionInProgress = false
249+
}
250+
case _ =>
251+
}
252+
}
253+
254+
def retentionProgressDeleteEventsEnded(deleteToSequenceNr: Long, success: Boolean): Unit = {
255+
retention match {
256+
case SnapshotCountRetentionCriteriaImpl(_, _, true) if retentionInProgress =>
257+
if (!success) {
258+
internalLogger.debug(
259+
"Retention is completed, deleting events to seqNr [{}] failed.",
260+
deleteToSequenceNr)
261+
retentionInProgress = false
262+
} else if (isOnlyOneSnapshot) {
263+
// no delete of snapshots => done
264+
internalLogger.debug(
265+
"Retention is completed, deleting events to seqNr [{}] was successful.",
266+
deleteToSequenceNr)
267+
retentionInProgress = false
268+
} else {
269+
internalLogger.debug("Retention, deleting events to seqNr [{}] was successful.", deleteToSequenceNr)
270+
}
271+
case _ =>
272+
}
273+
}
274+
275+
def retentionProgressDeleteSnapshotsStarted(deleteToSequenceNr: Long): Unit = {
276+
retention match {
277+
case SnapshotCountRetentionCriteriaImpl(_, _, _) if retentionInProgress =>
278+
if (deleteToSequenceNr > 0) {
279+
internalLogger.debug("Retention, deleting snapshots to seqNr [{}].", deleteToSequenceNr)
280+
} else {
281+
internalLogger.debug("Retention is completed, no snapshots to delete.")
282+
retentionInProgress = false
283+
}
284+
case _ =>
285+
}
286+
}
287+
288+
def retentionProgressDeleteSnapshotsEnded(deleteToSequenceNr: Long, success: Boolean): Unit = {
289+
retention match {
290+
case SnapshotCountRetentionCriteriaImpl(_, _, _) if retentionInProgress =>
291+
if (success) {
292+
// delete snapshot is last step => done
293+
internalLogger.debug(
294+
"Retention is completed, deleting snapshots to seqNr [{}] was successful.",
295+
deleteToSequenceNr)
296+
retentionInProgress = false
297+
} else {
298+
internalLogger.debug("Retention is completed, deleting snapshots to seqNr [{}] failed.", deleteToSequenceNr)
299+
retentionInProgress = false
300+
}
301+
302+
case _ =>
303+
}
304+
}
305+
200306
}
201307

202308
/**

persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedBehaviorImpl.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ private[pekko] final case class EventSourcedBehaviorImpl[Command, Event, State](
209209
stashState = stashState,
210210
replication = replication,
211211
publishEvents = publishEvents,
212-
internalLoggerFactory = () => internalLogger())
212+
internalLoggerFactory = () => internalLogger(),
213+
retentionInProgress = false)
213214

214215
// needs to accept Any since we also can get messages from the journal
215216
// not part of the user facing Command protocol

persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ExternalInteractions.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,15 @@ private[pekko] trait SnapshotInteractions[C, E, S] {
223223
}
224224
}
225225

226-
/** Deletes the snapshots up to and including the `sequenceNr`. */
227-
protected def internalDeleteSnapshots(fromSequenceNr: Long, toSequenceNr: Long): Unit = {
226+
/**
227+
* Deletes the snapshots up to and including the `sequenceNr`.
228+
* Uses `minSequenceNr = 0L` to always delete from the beginning, which simplifies
229+
* the retention bookkeeping by removing the need to track a separate lower bound.
230+
*/
231+
protected def internalDeleteSnapshots(toSequenceNr: Long): Unit = {
228232
if (toSequenceNr > 0) {
229-
val snapshotCriteria = SnapshotSelectionCriteria(minSequenceNr = fromSequenceNr, maxSequenceNr = toSequenceNr)
230-
setup.internalLogger.debug2("Deleting snapshots from sequenceNr [{}] to [{}]", fromSequenceNr, toSequenceNr)
233+
val snapshotCriteria = SnapshotSelectionCriteria(minSequenceNr = 0L, maxSequenceNr = toSequenceNr)
234+
setup.internalLogger.debug("Deleting snapshots to sequenceNr [{}]", toSequenceNr)
231235
setup.snapshotStore
232236
.tell(SnapshotProtocol.DeleteSnapshots(setup.persistenceId.id, snapshotCriteria), setup.selfClassic)
233237
}

0 commit comments

Comments
 (0)