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; }
private void reprocessNextEvent() { try { if (logStreamReader.hasNext()) { currentEvent = logStreamReader.next(); if (currentEvent.getPosition() > lastSourceEventPosition) { throw new IllegalStateException( String.format( ERROR_MESSAGE_REPROCESSING_NO_SOURCE_EVENT, getName(), lastSourceEventPosition)); } reprocessEvent(currentEvent); } else { throw new IllegalStateException( String.format( ERROR_MESSAGE_REPROCESSING_NO_SOURCE_EVENT, getName(), lastSourceEventPosition)); } } catch (final RuntimeException e) { onFailure(); throw e; } }
private void reprocessNextEvent() { try { if (logStreamReader.hasNext()) { currentEvent = logStreamReader.next(); if (currentEvent.getPosition() > lastSourceEventPosition) { throw new IllegalStateException( String.format( ERROR_MESSAGE_REPROCESSING_NO_SOURCE_EVENT, getName(), lastSourceEventPosition)); } reprocessEvent(currentEvent); } else { throw new IllegalStateException( String.format( ERROR_MESSAGE_REPROCESSING_NO_SOURCE_EVENT, getName(), lastSourceEventPosition)); } } catch (final RuntimeException e) { onFailure(); throw e; } }
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; }
public static void printRecords(final LogStream logStream) { final StringBuilder sb = new StringBuilder(); sb.append("Records on partition "); sb.append(logStream.getPartitionId()); sb.append(":\n"); try (final LogStreamReader streamReader = new BufferedLogStreamReader(logStream)) { streamReader.seekToFirstEvent(); while (streamReader.hasNext()) { final LoggedEvent event = streamReader.next(); writeRecord(event, sb); } } LOGGER.info(sb.toString()); }
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; }
public static void printRecords(final LogStream logStream) { final StringBuilder sb = new StringBuilder(); sb.append("Records on partition "); sb.append(logStream.getPartitionId()); sb.append(":\n"); try (final LogStreamReader streamReader = new BufferedLogStreamReader(logStream)) { streamReader.seekToFirstEvent(); while (streamReader.hasNext()) { final LoggedEvent event = streamReader.next(); writeRecord(event, sb); } } LOGGER.info(sb.toString()); }
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; }
@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 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); } } }
private void readNextEvent() { if (isOpened() && !isSuspended() && logStreamReader.hasNext() && eventProcessor == null) { currentEvent = logStreamReader.next(); if (eventFilter == null || eventFilter.applies(currentEvent)) { processEvent(currentEvent); } else { // continue with the next event actor.submit(readNextEvent); metrics.incrementEventsSkippedCount(); } } }
private void readNextEvent() { if (isOpened() && !isSuspended() && logStreamReader.hasNext() && eventProcessor == null) { currentEvent = logStreamReader.next(); if (eventFilter == null || eventFilter.applies(currentEvent)) { processEvent(currentEvent); } else { // continue with the next event actor.submit(readNextEvent); metrics.incrementEventsSkippedCount(); } } }
/** * 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); } }