fix race condition in Running.storingSnapshot, #26601

* When storing a snapshot, and waiting for the response, it received a
  response from a previous/concurrent delete snapshot (DeleteSnapshotSuccess)
  which it handled as a response for the save snapshot, i.e. tryUnstashOne, applySideEffects,
  and changing phase to HandlingCommands. Thereby missing the SaveSnapshotSuccess.
This commit is contained in:
Patrik Nordwall 2019-03-25 10:21:33 +01:00
parent 03897dd6e0
commit af2ac0aac8

View file

@ -321,11 +321,11 @@ private[akka] object Running {
Behaviors.unhandled Behaviors.unhandled
} else { } else {
stashUser(cmd) stashUser(cmd)
storingSnapshot(state, sideEffects) Behaviors.same
} }
} }
def onSnapshotterResponse(response: SnapshotProtocol.Response): Unit = { def onSaveSnapshotResponse(response: SnapshotProtocol.Response): Unit = {
val signal = response match { val signal = response match {
case e @ SaveSnapshotSuccess(meta) => case e @ SaveSnapshotSuccess(meta) =>
// # 24698 The deletion of old events are automatic, snapshots are triggered by the SaveSnapshotSuccess. // # 24698 The deletion of old events are automatic, snapshots are triggered by the SaveSnapshotSuccess.
@ -342,7 +342,6 @@ private[akka] object Running {
Some(SnapshotFailed(SnapshotMetadata.fromUntyped(meta), error)) Some(SnapshotFailed(SnapshotMetadata.fromUntyped(meta), error))
case _ => case _ =>
onDeleteSnapshotResponse(response)
None None
} }
@ -356,9 +355,14 @@ private[akka] object Running {
onCommand(cmd) onCommand(cmd)
case JournalResponse(r) => case JournalResponse(r) =>
onDeleteEventsJournalResponse(r) onDeleteEventsJournalResponse(r)
case SnapshotterResponse(r) => case SnapshotterResponse(response) =>
onSnapshotterResponse(r) response match {
case _: SaveSnapshotSuccess | _: SaveSnapshotFailure =>
onSaveSnapshotResponse(response)
tryUnstashOne(applySideEffects(sideEffects, state)) tryUnstashOne(applySideEffects(sideEffects, state))
case _ =>
onDeleteSnapshotResponse(response)
}
case _ => case _ =>
Behaviors.unhandled Behaviors.unhandled
} }