@Override public long fetchTailOffset() { return meta.fetchCurrentSegmentLength(); }
@Override public long fetchTailOffset() { return meta.fetchCurrentSegmentLength(); }
@Override public Revision fetchLatestRevision() { synchronized (lock) { long streamLength = meta.fetchCurrentSegmentLength(); return new RevisionImpl(segment, streamLength, 0); } }
private long getRemainingBytes(SegmentMetadataClientFactory metaFactory, StreamCut fromStreamCut, StreamCut toStreamCut) { long totalLength = 0; //fetch StreamSegmentSuccessors final CompletableFuture<StreamSegmentSuccessors> unread; final Map<Segment, Long> endPositions; if (toStreamCut.equals(StreamCut.UNBOUNDED)) { unread = controller.getSuccessors(fromStreamCut); endPositions = Collections.emptyMap(); } else { unread = controller.getSegments(fromStreamCut, toStreamCut); endPositions = toStreamCut.asImpl().getPositions(); } StreamSegmentSuccessors unreadVal = Futures.getAndHandleExceptions(unread, RuntimeException::new); //compute remaining bytes. for (Segment s : unreadVal.getSegments()) { if (endPositions.containsKey(s)) { totalLength += endPositions.get(s); } else { @Cleanup SegmentMetadataClient metadataClient = metaFactory.createSegmentMetadataClient(s, unreadVal.getDelegationToken()); totalLength += metadataClient.fetchCurrentSegmentLength(); } } for (long bytesRead : fromStreamCut.asImpl().getPositions().values()) { totalLength -= bytesRead; } log.debug("Remaining bytes from position: {} to position: {} is {}", fromStreamCut, toStreamCut, totalLength); return totalLength; }
ack2.get(5, TimeUnit.SECONDS); SegmentMetadataClient metadataClient = new SegmentMetadataClientFactoryImpl(controller, clientCF).createSegmentMetadataClient(segment, ""); assertEquals(payload.length * 2, metadataClient.fetchCurrentSegmentLength());
ByteBuffer buffer2 = writeInt(stream, 2); ByteBuffer buffer3 = writeInt(stream, 3); long length = metadataClient.fetchCurrentSegmentLength(); assertEquals(0, length % 3); EventRead<byte[]> event1 = reader.readNextEvent(0);
SegmentMetadataClient metadataClient = new SegmentMetadataClientFactoryImpl(controller, clientCF).createSegmentMetadataClient(segment, ""); assertEquals((payload.length + WireCommands.TYPE_PLUS_LENGTH_SIZE) * 2, metadataClient.fetchCurrentSegmentLength());
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());
@Test(timeout = 5000) public void testTruncate() { MockSegmentStreamFactory factory = new MockSegmentStreamFactory(); Segment segment = new Segment("Scope", "Stream", 1); EventWriterConfig config = EventWriterConfig.builder().build(); SegmentOutputStream outputStream = factory.createOutputStreamForSegment(segment, c -> { }, config, ""); sendData("1", outputStream); sendData("2", outputStream); sendData("3", outputStream); SegmentMetadataClient metadataClient = factory.createSegmentMetadataClient(segment, ""); long length = metadataClient.getSegmentInfo().getWriteOffset(); @Cleanup SegmentIteratorImpl<String> iter = new SegmentIteratorImpl<>(factory, segment, stringSerializer, 0, length); assertEquals("1", iter.next()); long segmentLength = metadataClient.fetchCurrentSegmentLength(); assertEquals(0, segmentLength % 3); metadataClient.truncateSegment(segmentLength * 2 / 3); AssertExtensions.assertThrows(TruncatedDataException.class, () -> iter.next()); @Cleanup SegmentIteratorImpl<String> iter2 = new SegmentIteratorImpl<>(factory, segment, stringSerializer, segmentLength * 2 / 3, length); assertTrue(iter2.hasNext()); assertEquals("3", iter2.next()); assertFalse(iter.hasNext()); }