@Override public void onRecovered() { long lowestPosition = -1; for (final ExporterContainer container : containers) { container.exporter.open(container); container.position = state.getPosition(container.getId()); if (lowestPosition == -1 || lowestPosition > container.position) { lowestPosition = container.position; } } // in case the lowest known position is not found, start from the // beginning again if (lowestPosition <= 0 || !logStreamReader.seek(lowestPosition)) { logStreamReader.seekToFirstEvent(); } else { if (logStreamReader.hasNext()) { logStreamReader.seek(lowestPosition + 1); } } }
@Override @SuppressWarnings({"unchecked"}) public <T extends UnpackedObject> TypedRecord<T> readValue(long position, Class<T> eventClass) { final boolean success = reader.seek(position); if (!success) { throw new RuntimeException("Could not find an event at position " + position); } final LoggedEvent rawEvent = reader.next(); metadata.reset(); rawEvent.readMetadata(metadata); final UnpackedObject value = eventCache.get(eventClass); value.reset(); rawEvent.readValue(value); event.wrap(rawEvent, metadata, value); return event; }
@Override public void onRecovered() { long lowestPosition = -1; for (final ExporterContainer container : containers) { container.exporter.open(container); container.position = state.getPosition(container.getId()); if (lowestPosition == -1 || lowestPosition > container.position) { lowestPosition = container.position; } } // in case the lowest known position is not found, start from the // beginning again if (lowestPosition <= 0 || !logStreamReader.seek(lowestPosition)) { logStreamReader.seekToFirstEvent(); } else { if (logStreamReader.hasNext()) { logStreamReader.seek(lowestPosition + 1); } } }
@Override @SuppressWarnings({"unchecked"}) public <T extends UnpackedObject> TypedRecord<T> readValue(long position, Class<T> eventClass) { final boolean success = reader.seek(position); if (!success) { throw new RuntimeException("Could not find an event at position " + position); } final LoggedEvent rawEvent = reader.next(); metadata.reset(); rawEvent.readMetadata(metadata); final UnpackedObject value = eventCache.get(eventClass); value.reset(); rawEvent.readValue(value); event.wrap(rawEvent, metadata, value); return event; }
private long recoverFromSnapshot(final long commitPosition, final int term) throws Exception { final StateSnapshotMetadata recovered = snapshotController.recover(commitPosition, term, this::validateSnapshot); final long snapshotPosition = recovered.getLastSuccessfulProcessedEventPosition(); logStreamReader.seekToFirstEvent(); // reset seek position if (!recovered.isInitial()) { final boolean found = logStreamReader.seek(snapshotPosition); if (found && logStreamReader.hasNext()) { logStreamReader.seek(snapshotPosition + 1); } else { throw new IllegalStateException( String.format(ERROR_MESSAGE_RECOVER_FROM_SNAPSHOT_FAILED, getName())); } snapshotController.purgeAllExcept(recovered); } return snapshotPosition; }
private boolean validateSnapshot(final StateSnapshotMetadata metadata) { final boolean wasFound = logStreamReader.seek(metadata.getLastWrittenEventPosition()); boolean isValid = false; if (wasFound && logStreamReader.hasNext()) { final LoggedEvent event = logStreamReader.next(); isValid = event.getRaftTerm() == metadata.getLastWrittenEventTerm(); } return isValid; }
private long recoverFromSnapshot(final long commitPosition, final int term) throws Exception { final StateSnapshotMetadata recovered = snapshotController.recover(commitPosition, term, this::validateSnapshot); final long snapshotPosition = recovered.getLastSuccessfulProcessedEventPosition(); logStreamReader.seekToFirstEvent(); // reset seek position if (!recovered.isInitial()) { final boolean found = logStreamReader.seek(snapshotPosition); if (found && logStreamReader.hasNext()) { logStreamReader.seek(snapshotPosition + 1); } else { throw new IllegalStateException( String.format(ERROR_MESSAGE_RECOVER_FROM_SNAPSHOT_FAILED, getName())); } snapshotController.purgeAllExcept(recovered); } return snapshotPosition; }
private boolean validateSnapshot(final StateSnapshotMetadata metadata) { final boolean wasFound = logStreamReader.seek(metadata.getLastWrittenEventPosition()); boolean isValid = false; if (wasFound && logStreamReader.hasNext()) { final LoggedEvent event = logStreamReader.next(); isValid = event.getRaftTerm() == metadata.getLastWrittenEventTerm(); } return isValid; }
private long seekFromSnapshotPositionToLastSourceEvent() { long lastSourceEventPosition = -1L; if (!isReadOnlyProcessor && logStreamReader.hasNext()) { lastSourceEventPosition = snapshotPosition; while (logStreamReader.hasNext()) { final LoggedEvent newEvent = logStreamReader.next(); // ignore events from other producers if (newEvent.getProducerId() == streamProcessorContext.getId()) { final long sourceEventPosition = newEvent.getSourceEventPosition(); if (sourceEventPosition > 0 && sourceEventPosition > lastSourceEventPosition) { lastSourceEventPosition = sourceEventPosition; } } } // reset position logStreamReader.seek(snapshotPosition + 1); } return lastSourceEventPosition; }
private long seekFromSnapshotPositionToLastSourceEvent() { long lastSourceEventPosition = -1L; if (!isReadOnlyProcessor && logStreamReader.hasNext()) { lastSourceEventPosition = snapshotPosition; while (logStreamReader.hasNext()) { final LoggedEvent newEvent = logStreamReader.next(); // ignore events from other producers if (newEvent.getProducerId() == streamProcessorContext.getId()) { final long sourceEventPosition = newEvent.getSourceEventPosition(); if (sourceEventPosition > 0 && sourceEventPosition > lastSourceEventPosition) { lastSourceEventPosition = sourceEventPosition; } } } // reset position logStreamReader.seek(snapshotPosition + 1); } return lastSourceEventPosition; }
/** * Truncates events with getPosition greater than the argument. Includes committed events. Resets * commit getPosition to the argument getPosition. * * @param position exclusive (unlike {@link LogStream#truncate(long)}!) */ public void truncate(final String stream, final long position) { final LogStream logStream = getLogStream(stream); try (final LogStreamReader reader = new BufferedLogStreamReader(logStream)) { logStream.closeAppender().get(); reader.seek(position + 1); logStream.setCommitPosition(position); if (reader.hasNext()) { logStream.truncate(reader.next().getPosition()); } logStream.setCommitPosition(Long.MAX_VALUE); logStream.openAppender().get(); } catch (final Exception e) { throw new RuntimeException("Could not truncate log stream " + stream, e); } }
/** * Truncates events with getPosition greater than the argument. Includes committed events. Resets * commit getPosition to the argument getPosition. * * @param position exclusive (unlike {@link LogStream#truncate(long)}!) */ public void truncate(final String stream, final long position) { final LogStream logStream = getLogStream(stream); try (final LogStreamReader reader = new BufferedLogStreamReader(logStream)) { logStream.closeAppender().get(); reader.seek(position + 1); logStream.setCommitPosition(position); if (reader.hasNext()) { logStream.truncate(reader.next().getPosition()); } logStream.setCommitPosition(Long.MAX_VALUE); logStream.openAppender().get(); } catch (final Exception e) { throw new RuntimeException("Could not truncate log stream " + stream, e); } }