public static <U extends RecordValue> RecordImpl<U> ofLoggedEvent( final ExporterObjectMapper objectMapper, final LoggedEvent event, final RecordMetadataImpl metadata, final U value) { return new RecordImpl<>( objectMapper, event.getKey(), event.getPosition(), Instant.ofEpochMilli(event.getTimestamp()), event.getRaftTerm(), event.getProducerId(), event.getSourceEventPosition(), metadata, value); }
CopiedTypedEvent(LoggedEvent event, UnpackedObject object) { this.value = object; this.key = event.getKey(); this.position = event.getPosition(); this.sourcePosition = event.getSourceEventPosition(); this.metadata = new RecordMetadata(); event.readMetadata(metadata); }
public void wrap(final LoggedEvent event) { event.readValue(record); }
private void setPreviousEvent(final LoggedEvent previousEvent) { discardBufferedEvent(); if (previousEvent != null) { previousPosition = previousEvent.getPosition(); previousTerm = previousEvent.getRaftTerm(); } else { previousPosition = previousEventPositionNullValue(); previousTerm = previousEventTermNullValue(); } }
public long getPosition() { return rawEvent.getPosition(); }
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; }
@Override public EventProcessor onEvent(final LoggedEvent event) { final long position = event.getPosition(); metadata.reset(); event.readMetadata(metadata); final TypedRecordProcessor<?> currentProcessor = recordProcessors.get( metadata.getRecordType(), metadata.getValueType(), metadata.getIntent().value()); if (currentProcessor != null) { final UnpackedObject value = eventCache.get(metadata.getValueType()); value.reset(); event.readValue(value); typedEvent.wrap(event, metadata, value); eventProcessorWrapper.wrap(currentProcessor, typedEvent, position); return eventProcessorWrapper; } else { return null; } }
@Test public void shouldHandleCommandRequest() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final byte[] valueBuffer = new byte[JOB_EVENT.length]; loggedEvent .getValueBuffer() .getBytes(loggedEvent.getValueOffset(), valueBuffer, 0, loggedEvent.getValueLength()); assertThat(loggedEvent.getValueLength()).isEqualTo(JOB_EVENT.length); assertThat(valueBuffer).isEqualTo(JOB_EVENT); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getRequestId()).isEqualTo(REQUEST_ID); assertThat(eventMetadata.getRequestStreamId()).isEqualTo(DEFAULT_ADDRESS.getStreamId()); }
@Override public boolean applies(LoggedEvent event) { event.readMetadata(metadata); return metadataFilter.applies(metadata); } }
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; }
@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; }
public long getSourceEventPosition() { return rawEvent.getSourceEventPosition(); }
@Override public long getKey() { return rawEvent.getKey(); }
private void setPreviousEvent(final LoggedEvent previousEvent) { discardBufferedEvent(); if (previousEvent != null) { previousPosition = previousEvent.getPosition(); previousTerm = previousEvent.getRaftTerm(); } else { previousPosition = previousEventPositionNullValue(); previousTerm = previousEventTermNullValue(); } }
public long getPosition() { return rawEvent.getPosition(); }
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; }
@Override public EventProcessor onEvent(final LoggedEvent event) { final long position = event.getPosition(); metadata.reset(); event.readMetadata(metadata); final TypedRecordProcessor<?> currentProcessor = recordProcessors.get( metadata.getRecordType(), metadata.getValueType(), metadata.getIntent().value()); if (currentProcessor != null) { final UnpackedObject value = eventCache.get(metadata.getValueType()); value.reset(); event.readValue(value); typedEvent.wrap(event, metadata, value); eventProcessorWrapper.wrap(currentProcessor, typedEvent, position); return eventProcessorWrapper; } else { return null; } }
@Test public void shouldHandleCommandRequest() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final byte[] valueBuffer = new byte[JOB_EVENT.length]; loggedEvent .getValueBuffer() .getBytes(loggedEvent.getValueOffset(), valueBuffer, 0, loggedEvent.getValueLength()); assertThat(loggedEvent.getValueLength()).isEqualTo(JOB_EVENT.length); assertThat(valueBuffer).isEqualTo(JOB_EVENT); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getRequestId()).isEqualTo(REQUEST_ID); assertThat(eventMetadata.getRequestStreamId()).isEqualTo(DEFAULT_ADDRESS.getStreamId()); }
@Override public boolean applies(LoggedEvent event) { event.readMetadata(metadata); return metadataFilter.applies(metadata); } }
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; }