Provide minSequenceNr for snapshot deletion (#25590)

* Provide minSequenceNr for snapshot deletion

Journals can use this to make the bulk deletion more efficient

Use keepNrBatches to delete the last few snapshots in case previous
deletes failed.
This commit is contained in:
Christopher Batey 2018-09-25 13:38:18 +01:00 committed by GitHub
parent d7c463e033
commit 23b9266fca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 20 deletions

View file

@ -14,8 +14,8 @@ import akka.actor.Props
import akka.actor.Terminated
import akka.cluster.sharding.Shard.ShardCommand
import akka.actor.Actor
import akka.util.MessageBufferMap
import scala.concurrent.Future
import scala.concurrent.duration.FiniteDuration
import akka.cluster.Cluster
@ -23,16 +23,7 @@ import akka.cluster.ddata.ORSet
import akka.cluster.ddata.ORSetKey
import akka.cluster.ddata.Replicator._
import akka.actor.Stash
import akka.persistence.PersistentActor
import akka.persistence.SnapshotOffer
import akka.persistence.SaveSnapshotSuccess
import akka.persistence.DeleteSnapshotsFailure
import akka.persistence.DeleteMessagesSuccess
import akka.persistence.SaveSnapshotFailure
import akka.persistence.DeleteMessagesFailure
import akka.persistence.DeleteSnapshotsSuccess
import akka.persistence.SnapshotSelectionCriteria
import akka.persistence.RecoveryCompleted
import akka.persistence._
import akka.actor.NoSerializationVerificationNeeded
/**
@ -531,7 +522,7 @@ private[akka] class PersistentShard(
/*
* delete old events but keep the latest around because
*
* it's not safe to delete all events immediate because snapshots are typically stored with a weaker consistency
* it's not safe to delete all events immediately because snapshots are typically stored with a weaker consistency
* level which means that a replay might "see" the deleted events before it sees the stored snapshot,
* i.e. it will use an older snapshot and then not replay the full sequence of events
*
@ -543,20 +534,25 @@ private[akka] class PersistentShard(
}
case SaveSnapshotFailure(_, reason)
log.warning("PersistentShard snapshot failure: {}", reason.getMessage)
log.warning("PersistentShard snapshot failure: [{}]", reason.getMessage)
case DeleteMessagesSuccess(toSequenceNr)
log.debug("PersistentShard messages to {} deleted successfully", toSequenceNr)
deleteSnapshots(SnapshotSelectionCriteria(maxSequenceNr = toSequenceNr - 1))
val deleteTo = toSequenceNr - 1
val deleteFrom = math.max(0, deleteTo - (keepNrOfBatches * snapshotAfter))
log.debug("PersistentShard messages to [{}] deleted successfully. Deleting snapshots from [{}] to [{}]", toSequenceNr, deleteFrom, deleteTo)
deleteSnapshots(SnapshotSelectionCriteria(
minSequenceNr = deleteFrom,
maxSequenceNr = deleteTo
))
case DeleteMessagesFailure(reason, toSequenceNr)
log.warning("PersistentShard messages to {} deletion failure: {}", toSequenceNr, reason.getMessage)
log.warning("PersistentShard messages to [{}] deletion failure: [{}]", toSequenceNr, reason.getMessage)
case DeleteSnapshotsSuccess(m)
log.debug("PersistentShard snapshots matching {} deleted successfully", m)
log.debug("PersistentShard snapshots matching [{}] deleted successfully", m)
case DeleteSnapshotsFailure(m, reason)
log.warning("PersistentShard snapshots matching {} deletion failure: {}", m, reason.getMessage)
log.warning("PersistentShard snapshots matching [{}] deletion failure: [{}]", m, reason.getMessage)
}: Receive).orElse(super.receiveCommand)

View file

@ -40,7 +40,7 @@ object RemoveInternalClusterShardingDataSpec {
akka.persistence.snapshot-store.local.dir = "target/snapshots-RemoveInternalClusterShardingDataSpec"
akka.cluster.sharding.snapshot-after = 5
akka.cluster.sharding.state-store-mode = persistence
|akka.cluster.sharding.keep-nr-of-batches = 0
akka.cluster.sharding.keep-nr-of-batches = 0
"""
val extractEntityId: ShardRegion.ExtractEntityId = {

View file

@ -693,7 +693,9 @@ A persistent actor can delete individual snapshots by calling the `deleteSnapsho
when the snapshot was taken.
To bulk-delete a range of snapshots matching `SnapshotSelectionCriteria`,
persistent actors should use the `deleteSnapshots` method.
persistent actors should use the `deleteSnapshots` method. Depending on the journal used this might be inefficient. It is
best practice to do specific deletes with `deleteSnapshot` or to include a `minSequenceNr` as well as a `maxSequenceNr`
for the `SnapshotSelectionCriteria`.
### Snapshot status handling