public SegmentIteratorImpl(SegmentInputStreamFactory factory, Segment segment, Serializer<T> deserializer, long startingOffset, long endingOffset) { this.segment = segment; this.deserializer = deserializer; this.startingOffset = startingOffset; this.endingOffset = endingOffset; input = factory.createEventReaderForSegment(segment); input.setOffset(startingOffset); }
@GuardedBy("readers") private void acquireSegmentsIfNeeded() throws ReaderNotInReaderGroupException { Map<Segment, Long> newSegments = groupState.acquireNewSegmentsIfNeeded(getLag()); if (!newSegments.isEmpty()) { log.info("{} acquiring segments {}", this, newSegments); for (Entry<Segment, Long> newSegment : newSegments.entrySet()) { final EventSegmentReader in = inputStreamFactory.createEventReaderForSegment(newSegment.getKey(), groupState.getEndOffsetForSegment(newSegment.getKey())); in.setOffset(newSegment.getValue()); readers.add(in); } } }
private void handleSegmentTruncated(EventSegmentReader segmentReader) throws ReaderNotInReaderGroupException, TruncatedDataException { Segment segmentId = segmentReader.getSegmentId(); log.info("{} encountered truncation for segment {} ", this, segmentId); String delegationToken = groupState.getOrRefreshDelegationTokenFor(segmentId); @Cleanup SegmentMetadataClient metadataClient = metadataClientFactory.createSegmentMetadataClient(segmentId, delegationToken); try { long startingOffset = metadataClient.getSegmentInfo().getStartingOffset(); segmentReader.setOffset(startingOffset); } catch (NoSuchSegmentException e) { handleEndOfSegment(segmentReader, true); } throw new TruncatedDataException(); }
@Override public Type fetchEvent(EventPointer pointer) throws NoSuchEventException { Preconditions.checkNotNull(pointer); // Create SegmentInputStream @Cleanup EventSegmentReader inputStream = inputStreamFactory.createEventReaderForSegment(pointer.asImpl().getSegment(), pointer.asImpl().getEventLength()); inputStream.setOffset(pointer.asImpl().getEventStartOffset()); // Read event try { ByteBuffer buffer = inputStream.read(); Type result = deserializer.deserialize(buffer); return result; } catch (EndOfSegmentException e) { throw new NoSuchEventException(e.getMessage()); } catch (NoSuchSegmentException | SegmentTruncatedException e) { throw new NoSuchEventException("Event no longer exists."); } }