@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()); }
@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); } }
@Nullable private static SnapshotMetadata extractMetadata(final File file) { String name = file.getName(); int sequenceNumberEndIndex = name.lastIndexOf('-'); int persistenceIdEndIndex = name.lastIndexOf('-', sequenceNumberEndIndex - 1); if (PERSISTENCE_ID_START_INDEX >= persistenceIdEndIndex) { return null; } try { // Since the persistenceId is url encoded in the filename, we need // to decode relevant filename's part to obtain persistenceId back String persistenceId = decode(name.substring(PERSISTENCE_ID_START_INDEX, persistenceIdEndIndex)); long sequenceNumber = Long.parseLong(name.substring(persistenceIdEndIndex + 1, sequenceNumberEndIndex)); long timestamp = Long.parseLong(name.substring(sequenceNumberEndIndex + 1)); return new SnapshotMetadata(persistenceId, sequenceNumber, timestamp); } catch (NumberFormatException e) { return null; } }
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()); }
@Nullable @Override public ConnectionData fromSnapshotStore(final SelectedSnapshot selectedSnapshot) { final String persistenceId = selectedSnapshot.metadata().persistenceId(); final Object snapshotEntity = selectedSnapshot.snapshot(); return createConnectionDataFromSnapshot(persistenceId, snapshotEntity); }
private void onSaveSnapshotSuccess (SaveSnapshotSuccess successMessage) { LOG.debug ("{} saved ShardManager snapshot successfully. Deleting the prev snapshot if available", persistenceId()); deleteSnapshots(new SnapshotSelectionCriteria(scala.Long.MaxValue(), successMessage.metadata().timestamp() - 1, 0, 0)); }
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(); } }
@Nullable @Override public Set<String> fromSnapshotStore(final SnapshotOffer snapshotOffer) { final String persistenceId = snapshotOffer.metadata().persistenceId(); final Object snapshotEntity = snapshotOffer.snapshot(); return createSetFromSnapshot(persistenceId, snapshotEntity); }
@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 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); } }
@Nullable @Override public Set<String> fromSnapshotStore(final SnapshotOffer snapshotOffer) { final String persistenceId = snapshotOffer.metadata().persistenceId(); final Object snapshotEntity = snapshotOffer.snapshot(); return createSetFromSnapshot(persistenceId, snapshotEntity); }
@Test public void testDoLoadAsyncWithAkkaSerializedSnapshot() throws IOException { SnapshotSerializer snapshotSerializer = new SnapshotSerializer((ExtendedActorSystem) system); String name = toSnapshotName(PERSISTENCE_ID, 1, 1000); try (FileOutputStream fos = new FileOutputStream(new File(SNAPSHOT_DIR, name))) { fos.write(snapshotSerializer.toBinary(new Snapshot("one"))); } SnapshotMetadata metadata = new SnapshotMetadata(PERSISTENCE_ID, 1, 1000); TestKit probe = new TestKit(system); snapshotStore.tell(new LoadSnapshot(PERSISTENCE_ID, SnapshotSelectionCriteria.latest(), Long.MAX_VALUE), probe.getRef()); LoadSnapshotResult result = probe.expectMsgClass(LoadSnapshotResult.class); Option<SelectedSnapshot> possibleSnapshot = result.snapshot(); assertEquals("SelectedSnapshot present", TRUE, possibleSnapshot.nonEmpty()); assertEquals("SelectedSnapshot metadata", metadata, possibleSnapshot.get().metadata()); assertEquals("SelectedSnapshot snapshot", "one", possibleSnapshot.get().snapshot()); }
@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())); }
@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); } }
@Nullable @Override public ConnectionData fromSnapshotStore(final SnapshotOffer snapshotOffer) { final String persistenceId = snapshotOffer.metadata().persistenceId(); final Object snapshotEntity = snapshotOffer.snapshot(); return createConnectionDataFromSnapshot(persistenceId, snapshotEntity); }
@Test public void testDoLoadAsyncWithRetry() throws IOException { createSnapshotFile(PERSISTENCE_ID, "one", 0, 1000); createSnapshotFile(PERSISTENCE_ID, null, 1, 2000); SnapshotMetadata metadata = new SnapshotMetadata(PERSISTENCE_ID, 0, 1000); TestKit probe = new TestKit(system); snapshotStore.tell(new LoadSnapshot(PERSISTENCE_ID, SnapshotSelectionCriteria.latest(), Long.MAX_VALUE), probe.getRef()); LoadSnapshotResult result = probe.expectMsgClass(LoadSnapshotResult.class); Option<SelectedSnapshot> possibleSnapshot = result.snapshot(); assertEquals("SelectedSnapshot present", TRUE, possibleSnapshot.nonEmpty()); assertEquals("SelectedSnapshot metadata", metadata, possibleSnapshot.get().metadata()); assertEquals("SelectedSnapshot snapshot", "one", possibleSnapshot.get().snapshot()); }
@Override protected void doApply(final DeleteSnapshotSuccess message) { log.debug("Deleting snapshot with sequence number <{}> for Policy <{}> was successful.", message.metadata().sequenceNr(), policyId); }
@Nullable @Override public Set<String> fromSnapshotStore(final SelectedSnapshot selectedSnapshot) { final String persistenceId = selectedSnapshot.metadata().persistenceId(); final Object snapshotEntity = selectedSnapshot.snapshot(); return createSetFromSnapshot(persistenceId, snapshotEntity); }