private void populate(RollingStorage s, SegmentHandle writeHandle, int writeCount, int smallWriteSize, int largeWriteSize, ByteArrayOutputStream writeStream) throws Exception { final Random rnd = new Random(0); int offset = (int) s.getStreamSegmentInfo(writeHandle.getSegmentName()).getLength(); for (int i = 0; i < writeCount; i++) { byte[] appendData = new byte[i % 2 == 0 ? smallWriteSize : largeWriteSize]; rnd.nextBytes(appendData); s.write(writeHandle, offset, new ByteArrayInputStream(appendData), appendData.length); offset += appendData.length; if (writeStream != null) { writeStream.write(appendData); } } }
/** * 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.assertEquals("Unexpected segment length.", writtenData.length, s.getStreamSegmentInfo(SEGMENT_NAME).getLength()); int checkedLength = 0; while (checkedLength < writtenData.length) {
val rollingInfo = s.getStreamSegmentInfo(segmentName); Assert.assertTrue("Segment not sealed.", baseInfo.isSealed()); Assert.assertEquals("Unexpected Segment length.", writtenData.length, baseInfo.getLength());