private void checkConcatResult(RollingStorage s, RollingSegmentHandle targetHandle, String sourceSegmentName, int expectedChunkCount, int expectedLength) throws Exception { Assert.assertFalse("Expecting the source segment to not exist anymore.", s.exists(sourceSegmentName)); Assert.assertEquals("Unexpected number of SegmentChunks in target.", expectedChunkCount, targetHandle.chunks().size()); Assert.assertEquals("Unexpected target length.", expectedLength, targetHandle.length()); // Reload the handle and verify nothing strange happened in Storage. val targetHandle2 = (RollingSegmentHandle) s.openWrite(SEGMENT_NAME); Assert.assertEquals("Unexpected number of SegmentChunks in reloaded target handle.", expectedChunkCount, targetHandle2.chunks().size()); Assert.assertEquals("Unexpected reloaded target length.", targetHandle.length(), targetHandle2.length()); }
ex -> ex instanceof IntentionalException); Assert.assertTrue("Not expecting segment to be deleted yet.", s.exists(SEGMENT_NAME)); Assert.assertFalse("Expected first SegmentChunk to be marked as deleted.", writeHandle.chunks().get(failAtIndex - 1).exists()); Assert.assertTrue("Expected failed-to-delete SegmentChunk to not be marked as deleted.", writeHandle.chunks().get(failAtIndex).exists()); baseStorage.delete(baseStorage.openRead(failOnDelete)); s.delete(writeHandle); Assert.assertFalse("Expecting the segment to be deleted.", s.exists(SEGMENT_NAME)); Assert.assertTrue("Expected the handle to be marked as deleted.", writeHandle.isDeleted()); Assert.assertFalse("Expected all SegmentChunks to be marked as deleted.", writeHandle.chunks().stream().anyMatch(SegmentChunk::exists));
/** * Tests the case when Create was interrupted after it created the Header file but before populating it. */ @Test public void testCreateRecovery() throws Exception { @Cleanup val baseStorage = new TestStorage(); @Cleanup val s = new RollingStorage(baseStorage, DEFAULT_ROLLING_POLICY); s.initialize(1); // Create an empty header file. This simulates a create() operation that failed mid-way. baseStorage.create(StreamSegmentNameUtils.getHeaderSegmentName(SEGMENT_NAME)); Assert.assertFalse("Not expecting Segment to exist.", s.exists(SEGMENT_NAME)); AssertExtensions.assertThrows( "Not expecting Segment to exist (getStreamSegmentInfo).", () -> s.getStreamSegmentInfo(SEGMENT_NAME), ex -> ex instanceof StreamSegmentNotExistsException); AssertExtensions.assertThrows( "Not expecting Segment to exist (openHandle).", () -> s.openRead(SEGMENT_NAME), ex -> ex instanceof StreamSegmentNotExistsException); // Retry the operation and verify everything is in place. s.create(SEGMENT_NAME); val si = s.getStreamSegmentInfo(SEGMENT_NAME); Assert.assertEquals("Expected the Segment to have been created.", 0, si.getLength()); }
Assert.assertTrue("Unexpected result from exists() when called on a non-header Segment.", s.exists(segmentName)); val nonHeaderHandle = s.openWrite(nonHeaderName); s.concat(nonHeaderHandle, 0, segmentName); Assert.assertFalse("NonHeader source still exists after concat to NonHeader Segment.", s.exists(segmentName)); checkWrittenData(writtenData, s.openRead(nonHeaderName), s); val withHeaderHandle = s.openWrite(withHeaderName); s.concat(withHeaderHandle, 0, nonHeaderName); Assert.assertFalse("NonHeader source still exists after concat to Header Segment.", s.exists(nonHeaderName)); val h1 = (RollingSegmentHandle) s.openRead(withHeaderName); checkWrittenData(writtenData, h1, s); Assert.assertFalse("NonHeader source still exists after concat to Header Segment.", s.exists(withHeaderName)); val h2 = (RollingSegmentHandle) s.openRead(nonHeaderName); checkWrittenData(writtenData, h2, s); populate(s, s.openWrite(segmentName), new ByteArrayOutputStream()); s.delete(s.openWrite(segmentName)); Assert.assertFalse("Segment still exists after deletion.", s.exists(segmentName)); Assert.assertFalse("Segment still exists after deletion.", baseStorage.exists(segmentName));