@VisibleForTesting static int compare(final SnapshotMetadata m1, final SnapshotMetadata m2) { return (int) (!m1.persistenceId().equals(m2.persistenceId()) ? m1.persistenceId().compareTo(m2.persistenceId()) : m1.sequenceNr() != m2.sequenceNr() ? m1.sequenceNr() - m2.sequenceNr() : m1.timestamp() != m2.timestamp() ? m1.timestamp() - m2.timestamp() : 0); } }
@Override protected void doApply(final DeleteSnapshotFailure message) { final Throwable cause = message.cause(); log.error(cause, "Deleting snapshot with sequence number <{}> for Policy <{}> failed. Cause {}: {}", message.metadata().sequenceNr(), policyId, cause.getClass().getSimpleName(), cause.getMessage()); }
@Override protected void doApply(final DeleteSnapshotFailure message) { final Throwable cause = message.cause(); log.error(cause, "Deleting snapshot with sequence number <{}> for Policy <{}> failed. Cause {}: {}", message.metadata().sequenceNr(), policyId, cause.getClass().getSimpleName(), cause.getMessage()); }
private Collection<File> getSnapshotFiles(final SnapshotMetadata metadata) { return getSnapshotFiles(metadata.persistenceId()).stream().filter(file -> { SnapshotMetadata possible = extractMetadata(file); return possible != null && possible.sequenceNr() == metadata.sequenceNr() && (metadata.timestamp() == 0L || possible.timestamp() == metadata.timestamp()); }).collect(Collectors.toList()); }
@Override protected void doApply(final DeleteSnapshotSuccess message) { log.debug("Deleting snapshot with sequence number <{}> for Policy <{}> was successful.", message.metadata().sequenceNr(), policyId); }
@Override protected void doApply(final DeleteSnapshotSuccess message) { log.debug("Deleting snapshot with sequence number <{}> for Policy <{}> was successful.", message.metadata().sequenceNr(), policyId); }
private File toSnapshotFile(final SnapshotMetadata metadata) { return new File(snapshotDir, String.format("snapshot-%s-%d-%d", encode(metadata.persistenceId()), metadata.sequenceNr(), metadata.timestamp())); }
/** * Recovers the passed in {@link SnapshotOffer} to a {@link Thing}. * * @param snapshotOffer the snapshot offer * @return the Thing restored from the snapshot offer or {@code null}. * @throws NullPointerException if {@code snapshotOffer} is {@code null}. */ @Nullable public Thing recoverThingFromSnapshotOffer(@Nonnull final SnapshotOffer snapshotOffer) { checkNotNull(snapshotOffer, "snapshot offer"); final ThingWithSnapshotTag result = snapshotAdapter.fromSnapshotStore(snapshotOffer); final SnapshotMetadata metadata = snapshotOffer.metadata(); final SnapshotTag snapshotTag = Optional.ofNullable(result) .map(ThingWithSnapshotTag::getSnapshotTag) .orElse(SnapshotTag.UNPROTECTED); snapshotterState = new SnapshotterState(false, metadata.sequenceNr(), snapshotTag, null, null); return result; }
/** * Recovers the passed in {@link SnapshotOffer} to a {@link Thing}. * * @param snapshotOffer the snapshot offer * @return the Thing restored from the snapshot offer or {@code null}. * @throws NullPointerException if {@code snapshotOffer} is {@code null}. */ @Nullable public Thing recoverThingFromSnapshotOffer(@Nonnull final SnapshotOffer snapshotOffer) { checkNotNull(snapshotOffer, "snapshot offer"); final ThingWithSnapshotTag result = snapshotAdapter.fromSnapshotStore(snapshotOffer); final SnapshotMetadata metadata = snapshotOffer.metadata(); final SnapshotTag snapshotTag = Optional.ofNullable(result) .map(ThingWithSnapshotTag::getSnapshotTag) .orElse(SnapshotTag.UNPROTECTED); snapshotterState = new SnapshotterState(false, metadata.sequenceNr(), snapshotTag, null, null); return result; }
private void onSaveSnapshotSuccess(SaveSnapshotSuccess success) { long sequenceNumber = success.metadata().sequenceNr(); log.info("{}: SaveSnapshotSuccess received for snapshot, sequenceNr: {}", context.getId(), sequenceNumber); context.getSnapshotManager().commit(sequenceNumber, success.metadata().timestamp()); }
@Override public Receive createReceiveRecover() { return ReceiveBuilder.create() // # Snapshot handling .match(SnapshotOffer.class, ss -> { final Set<String> fromSnapshotStore = snapshotAdapter.fromSnapshotStore(ss); log.info("Received SnapshotOffer containing connectionIds: <{}>", fromSnapshotStore); if (fromSnapshotStore != null) { connectionIds.clear(); connectionIds.addAll(fromSnapshotStore); } lastSnapshotSequenceNr = ss.metadata().sequenceNr(); }) .match(ConnectionCreated.class, event -> connectionIds.add(event.getConnectionId())) .match(ConnectionOpened.class, event -> connectionIds.add(event.getConnectionId())) .match(ConnectionClosed.class, event -> connectionIds.remove(event.getConnectionId())) .match(ConnectionDeleted.class, event -> connectionIds.remove(event.getConnectionId())) .match(RecoveryCompleted.class, rc -> connectionIds.forEach(this::reconnect)) .matchAny(m -> log.warning("Unknown recover message: {}", m)) .build(); }
@Override public Receive createReceiveRecover() { return ReceiveBuilder.create() .match(SnapshotOffer.class, ss -> { batchIds = snapshotAdapter.fromSnapshotStore(ss); snapshotSequenceNr = ss.metadata().sequenceNr(); }) .match(BatchExecutionStarted.class, event -> batchIds.add(event.getBatchId())) .match(BatchExecutionFinished.class, event -> batchIds.remove(event.getBatchId())) .match(RecoveryCompleted.class, rc -> { log.debug("Recovery completed"); batchIds.forEach(this::lookupBatchCoordinatorActor); }) .matchAny(m -> log.warning("Unknown recover message: {}", m)) .build(); }
private void handleSnapshotMessage(final Object message) { if (message instanceof SaveSnapshotFailure) { LOG.error("{}: failed to persist state", persistenceId(), ((SaveSnapshotFailure) message).cause()); persisting = false; self().tell(PoisonPill.getInstance(), ActorRef.noSender()); } else if (message instanceof SaveSnapshotSuccess) { LOG.debug("{}: got command: {}", persistenceId(), message); SaveSnapshotSuccess saved = (SaveSnapshotSuccess)message; deleteSnapshots(new SnapshotSelectionCriteria(saved.metadata().sequenceNr(), saved.metadata().timestamp() - 1, 0L, 0L)); persisting = false; unstash(); } else { LOG.debug("{}: stashing command {}", persistenceId(), message); stash(); } }
@Override protected void doApply(final SaveSnapshotSuccess message) { final SnapshotMetadata snapshotMetadata = message.metadata(); log.debug("Snapshot taken for Policy <{}> with metadata <{}>.", policyId, snapshotMetadata); final long newSnapShotSequenceNumber = snapshotMetadata.sequenceNr(); if (newSnapShotSequenceNumber <= lastSnapshotSequenceNr) { log.warning("Policy <{}> has been already snap-shot with a newer or equal sequence number." + " Last sequence number: <{}>, new snapshot metadata: <{}>.", policyId, lastSnapshotSequenceNr, snapshotMetadata); resetSnapshotInProgress(); } else { deleteSnapshot(lastSnapshotSequenceNr); deleteEventsOlderThan(newSnapShotSequenceNumber); lastSnapshotSequenceNr = newSnapShotSequenceNumber; resetSnapshotInProgress(); } }
@Override protected void doApply(final SaveSnapshotSuccess message) { final SnapshotMetadata snapshotMetadata = message.metadata(); log.debug("Snapshot taken for Policy <{}> with metadata <{}>.", policyId, snapshotMetadata); final long newSnapShotSequenceNumber = snapshotMetadata.sequenceNr(); if (newSnapShotSequenceNumber <= lastSnapshotSequenceNr) { log.warning("Policy <{}> has been already snap-shot with a newer or equal sequence number." + " Last sequence number: <{}>, new snapshot metadata: <{}>.", policyId, lastSnapshotSequenceNr, snapshotMetadata); resetSnapshotInProgress(); } else { deleteSnapshot(lastSnapshotSequenceNr); deleteEventsOlderThan(newSnapShotSequenceNumber); lastSnapshotSequenceNr = newSnapShotSequenceNumber; resetSnapshotInProgress(); } }
@Override AbstractClientActorBehavior<?> onReceiveCommand(final Object command) { if (command instanceof SaveSnapshotFailure) { LOG.error("{}: failed to persist state", persistenceId(), ((SaveSnapshotFailure) command).cause()); return null; } else if (command instanceof SaveSnapshotSuccess) { LOG.debug("{}: got command: {}", persistenceId(), command); SaveSnapshotSuccess saved = (SaveSnapshotSuccess)command; context().deleteSnapshots(new SnapshotSelectionCriteria(saved.metadata().sequenceNr(), saved.metadata().timestamp() - 1, 0L, 0L)); return this; } else if (command instanceof DeleteSnapshotsSuccess) { LOG.debug("{}: got command: {}", persistenceId(), command); } else if (command instanceof DeleteSnapshotsFailure) { // Not treating this as a fatal error. LOG.warn("{}: failed to delete prior snapshots", persistenceId(), ((DeleteSnapshotsFailure) command).cause()); } else { LOG.debug("{}: stashing command {}", persistenceId(), command); context().stash(); return this; } context().unstash(); return context().createBehavior(myId); } }
@Override AbstractClientActorBehavior<?> onReceiveCommand(final Object command) { if (command instanceof SaveSnapshotFailure) { LOG.error("{}: failed to persist state", persistenceId(), ((SaveSnapshotFailure) command).cause()); return null; } else if (command instanceof SaveSnapshotSuccess) { LOG.debug("{}: got command: {}", persistenceId(), command); SaveSnapshotSuccess saved = (SaveSnapshotSuccess)command; context().deleteSnapshots(new SnapshotSelectionCriteria(saved.metadata().sequenceNr(), saved.metadata().timestamp() - 1, 0L, 0L)); return this; } else if (command instanceof DeleteSnapshotsSuccess) { LOG.debug("{}: got command: {}", persistenceId(), command); } else if (command instanceof DeleteSnapshotsFailure) { // Not treating this as a fatal error. LOG.warn("{}: failed to delete prior snapshots", persistenceId(), ((DeleteSnapshotsFailure) command).cause()); } else { LOG.debug("{}: stashing command {}", persistenceId(), command); context().stash(); return this; } context().unstash(); return context().createBehavior(myId); } }
snapshotSequenceNr = ss.metadata().sequenceNr(); deleteMessages(snapshotSequenceNr - 1); })
@Override public Receive createReceiveRecover() { // defines how state is updated during recovery return handlePolicyEvents.orElse(ReceiveBuilder.create() // # Snapshot handling .match(SnapshotOffer.class, ss -> { policy = snapshotAdapter.fromSnapshotStore(ss); lastSnapshotSequenceNr = ss.metadata().sequenceNr(); }) // # Recovery handling .match(RecoveryCompleted.class, rc -> { if (policy != null) { log.debug("Policy <{}> was recovered.", policyId); if (isPolicyActive()) { becomePolicyCreatedHandler(); } else if (isPolicyDeleted()) { becomePolicyDeletedHandler(); } else { log.error("Unknown lifecycle state <{}> for Policy <{}>.", policy.getLifecycle(), policyId); } } }) // # Handle unknown .matchAny(m -> log.warning("Unknown recover message: {}", m)) .build()); }
@Override public Receive createReceiveRecover() { // defines how state is updated during recovery return handlePolicyEvents.orElse(ReceiveBuilder.create() // # Snapshot handling .match(SnapshotOffer.class, ss -> { policy = snapshotAdapter.fromSnapshotStore(ss); lastSnapshotSequenceNr = ss.metadata().sequenceNr(); }) // # Recovery handling .match(RecoveryCompleted.class, rc -> { if (policy != null) { log.debug("Policy <{}> was recovered.", policyId); if (isPolicyActive()) { becomePolicyCreatedHandler(); } else if (isPolicyDeleted()) { becomePolicyDeletedHandler(); } else { log.error("Unknown lifecycle state <{}> for Policy <{}>.", policy.getLifecycle(), policyId); } } }) // # Handle unknown .matchAny(m -> log.warning("Unknown recover message: {}", m)) .build()); }