@Override public Revision fetchOldestRevision() { long startingOffset = meta.getSegmentInfo().getStartingOffset(); return new RevisionImpl(segment, startingOffset, 0); }
@Override public Iterator<Entry<Revision, T>> readFrom(Revision start) { synchronized (lock) { long startOffset = start.asImpl().getOffsetInSegment(); SegmentInfo segmentInfo = meta.getSegmentInfo(); long endOffset = segmentInfo.getWriteOffset(); if (startOffset < segmentInfo.getStartingOffset()) { throw new TruncatedDataException("Data at the supplied revision has been truncated."); } log.trace("Creating iterator from {} until {}", startOffset, endOffset); return new StreamIterator(startOffset, endOffset); } }
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(); }
private SegmentRange getSegmentRange(final Segment segment, final StreamCut startStreamCut, final StreamCut endStreamCut) { SegmentRangeImpl.SegmentRangeImplBuilder segmentRangeBuilder = SegmentRangeImpl.builder() .segment(segment); if (startStreamCut.asImpl().getPositions().containsKey(segment) && endStreamCut.asImpl().getPositions().containsKey(segment)) { //use the meta data present in startStreamCut and endStreamCuts. segmentRangeBuilder.startOffset(startStreamCut.asImpl().getPositions().get(segment)) .endOffset(endStreamCut.asImpl().getPositions().get(segment)); } else { //use segment meta data client to fetch the segment offsets. SegmentInfo r = segmentToInfo(segment); segmentRangeBuilder.startOffset(startStreamCut.asImpl().getPositions().getOrDefault(segment, r.getStartingOffset())) .endOffset(endStreamCut.asImpl().getPositions().getOrDefault(segment, r.getWriteOffset())); } return segmentRangeBuilder.build(); }
Segment segment = new Segment(scope, streamName, 0); SegmentMetadataClient metadataClient = metadataClientFactory.createSegmentMetadataClient(segment, ""); assertEquals(0, metadataClient.getSegmentInfo().getStartingOffset()); long writeOffset = metadataClient.getSegmentInfo().getWriteOffset(); assertEquals(writeOffset, metadataClient.fetchCurrentSegmentLength()); assertTrue(metadataClient.getSegmentInfo().getWriteOffset() > testString.length()); metadataClient.truncateSegment(writeOffset); assertEquals(writeOffset, metadataClient.getSegmentInfo().getStartingOffset()); assertEquals(writeOffset, metadataClient.getSegmentInfo().getWriteOffset()); assertEquals(writeOffset, metadataClient.fetchCurrentSegmentLength());