@Test public void testConvert() throws Exception { SegmentMetadataImpl beforeConversionMeta = new SegmentMetadataImpl(_segmentDirectory); SegmentV1V2ToV3FormatConverter converter = new SegmentV1V2ToV3FormatConverter(); converter.convert(_segmentDirectory); File v3Location = SegmentDirectoryPaths.segmentDirectoryFor(_segmentDirectory, SegmentVersion.v3); Assert.assertTrue(v3Location.exists()); Assert.assertTrue(v3Location.isDirectory()); SegmentMetadataImpl metadata = new SegmentMetadataImpl(v3Location); Assert.assertEquals(metadata.getVersion(), SegmentVersion.v3.toString()); Assert.assertTrue(new File(v3Location, V1Constants.SEGMENT_CREATION_META).exists()); FileTime afterConversionTime = Files.getLastModifiedTime(v3Location.toPath()); IndexSegment indexSegment = ImmutableSegmentLoader.load(_segmentDirectory, _v3IndexLoadingConfig); Assert.assertNotNull(indexSegment); Assert.assertEquals(indexSegment.getSegmentName(), metadata.getName()); Assert.assertEquals(SegmentVersion.v3, SegmentVersion.valueOf(indexSegment.getSegmentMetadata().getVersion())); FileTime afterLoadTime = Files.getLastModifiedTime(v3Location.toPath()); Assert.assertEquals(afterConversionTime, afterLoadTime); Assert.assertFalse(new File(_segmentDirectory, V1Constants.MetadataKeys.METADATA_FILE_NAME).exists()); SegmentMetadataImpl metaAfterConversion = new SegmentMetadataImpl(_segmentDirectory); Assert.assertNotNull(metaAfterConversion); Assert.assertFalse(metaAfterConversion.getCrc().equalsIgnoreCase(String.valueOf(Long.MIN_VALUE))); Assert.assertEquals(metaAfterConversion.getCrc(), beforeConversionMeta.getCrc()); Assert.assertTrue(metaAfterConversion.getIndexCreationTime() != Long.MIN_VALUE); Assert.assertEquals(metaAfterConversion.getIndexCreationTime(), beforeConversionMeta.getIndexCreationTime()); }
@Override public void convert(File v2SegmentDirectory) throws Exception { Preconditions.checkNotNull(v2SegmentDirectory, "Segment directory should not be null"); Preconditions.checkState(v2SegmentDirectory.exists() && v2SegmentDirectory.isDirectory(), "Segment directory: " + v2SegmentDirectory.toString() + " must exist and should be a directory"); LOGGER.info("Converting segment: {} to v3 format", v2SegmentDirectory); SegmentMetadataImpl v2Metadata = new SegmentMetadataImpl(v2SegmentDirectory); SegmentVersion oldVersion = SegmentVersion.valueOf(v2Metadata.getVersion()); Preconditions.checkState(oldVersion != SegmentVersion.v3, "Segment {} is already in v3 format but at wrong path", v2Metadata.getName()); Preconditions.checkArgument(oldVersion == SegmentVersion.v1 || oldVersion == SegmentVersion.v2, "Can not convert segment version: {} at path: {} ", oldVersion, v2SegmentDirectory); deleteStaleConversionDirectories(v2SegmentDirectory); File v3TempDirectory = v3ConversionTempDirectory(v2SegmentDirectory); setDirectoryPermissions(v3TempDirectory); createMetadataFile(v2SegmentDirectory, v3TempDirectory); copyCreationMetadataIfExists(v2SegmentDirectory, v3TempDirectory); copyLuceneTextIndexIfExists(v2SegmentDirectory, v3TempDirectory); copyIndexData(v2SegmentDirectory, v2Metadata, v3TempDirectory); File newLocation = SegmentDirectoryPaths.segmentDirectoryFor(v2SegmentDirectory, SegmentVersion.v3); LOGGER.info("v3 segment location for segment: {} is {}", v2Metadata.getName(), newLocation); v3TempDirectory.renameTo(newLocation); deleteV2Files(v2SegmentDirectory); }
SegmentV1V2ToV3FormatConverter implements SegmentFormatConverter { @Override public void convert(File v2SegmentDirectory) throws Exception { Preconditions.checkNotNull(v2SegmentDirectory, "Segment directory should not be null"); Preconditions.checkState(v2SegmentDirectory.exists() && v2SegmentDirectory.isDirectory(), "Segment directory: " + v2SegmentDirectory.toString() + " must exist and should be a directory"); LOGGER.info("Converting segment: {} to v3 format", v2SegmentDirectory); SegmentMetadataImpl v2Metadata = new SegmentMetadataImpl(v2SegmentDirectory); SegmentVersion oldVersion = SegmentVersion.valueOf(v2Metadata.getVersion()); Preconditions.checkState(oldVersion != SegmentVersion.v3, "Segment {} is already in v3 format but at wrong path", v2Metadata.getName()); Preconditions.checkArgument(oldVersion == SegmentVersion.v1 || oldVersion == SegmentVersion.v2, "Can not convert segment version: {} at path: {} ", oldVersion, v2SegmentDirectory); deleteStaleConversionDirectories(v2SegmentDirectory); File v3TempDirectory = v3ConversionTempDirectory(v2SegmentDirectory); setDirectoryPermissions(v3TempDirectory); createMetadataFile(v2SegmentDirectory, v3TempDirectory); copyCreationMetadataIfExists(v2SegmentDirectory, v3TempDirectory); copyLuceneTextIndexIfExists(v2SegmentDirectory, v3TempDirectory); copyIndexData(v2SegmentDirectory, v2Metadata, v3TempDirectory); File newLocation = SegmentDirectoryPaths.segmentDirectoryFor(v2SegmentDirectory, SegmentVersion.v3); LOGGER.info("v3 segment location for segment: {} is {}", v2Metadata.getName(), newLocation); v3TempDirectory.renameTo(newLocation); deleteV2Files(v2SegmentDirectory); } }
SegmentV1V2ToV3FormatConverter implements SegmentFormatConverter { @Override public void convert(File v2SegmentDirectory) throws Exception { Preconditions.checkNotNull(v2SegmentDirectory, "Segment directory should not be null"); Preconditions.checkState(v2SegmentDirectory.exists() && v2SegmentDirectory.isDirectory(), "Segment directory: " + v2SegmentDirectory.toString() + " must exist and should be a directory"); LOGGER.info("Converting segment: {} to v3 format", v2SegmentDirectory); SegmentMetadataImpl v2Metadata = new SegmentMetadataImpl(v2SegmentDirectory); SegmentVersion oldVersion = SegmentVersion.valueOf(v2Metadata.getVersion()); Preconditions.checkState(oldVersion != SegmentVersion.v3, "Segment {} is already in v3 format but at wrong path", v2Metadata.getName()); Preconditions.checkArgument(oldVersion == SegmentVersion.v1 || oldVersion == SegmentVersion.v2, "Can not convert segment version: {} at path: {} ", oldVersion, v2SegmentDirectory); deleteStaleConversionDirectories(v2SegmentDirectory); File v3TempDirectory = v3ConversionTempDirectory(v2SegmentDirectory); setDirectoryPermissions(v3TempDirectory); createMetadataFile(v2SegmentDirectory, v3TempDirectory); copyCreationMetadataIfExists(v2SegmentDirectory, v3TempDirectory); copyLuceneTextIndexIfExists(v2SegmentDirectory, v3TempDirectory); copyIndexData(v2SegmentDirectory, v2Metadata, v3TempDirectory); File newLocation = SegmentDirectoryPaths.segmentDirectoryFor(v2SegmentDirectory, SegmentVersion.v3); LOGGER.info("v3 segment location for segment: {} is {}", v2Metadata.getName(), newLocation); v3TempDirectory.renameTo(newLocation); deleteV2Files(v2SegmentDirectory); }  }
SegmentV1V2ToV3FormatConverter implements SegmentFormatConverter { @Override public void convert(File v2SegmentDirectory) throws Exception { Preconditions.checkNotNull(v2SegmentDirectory, "Segment directory should not be null"); Preconditions.checkState(v2SegmentDirectory.exists() && v2SegmentDirectory.isDirectory(), "Segment directory: " + v2SegmentDirectory.toString() + " must exist and should be a directory"); LOGGER.info("Converting segment: {} to v3 format", v2SegmentDirectory); SegmentMetadataImpl v2Metadata = new SegmentMetadataImpl(v2SegmentDirectory); SegmentVersion oldVersion = SegmentVersion.valueOf(v2Metadata.getVersion()); Preconditions.checkState(oldVersion != SegmentVersion.v3, "Segment {} is already in v3 format but at wrong path", v2Metadata.getName()); Preconditions.checkArgument(oldVersion == SegmentVersion.v1 || oldVersion == SegmentVersion.v2, "Can not convert segment version: {} at path: {} ", oldVersion, v2SegmentDirectory); deleteStaleConversionDirectories(v2SegmentDirectory); File v3TempDirectory = v3ConversionTempDirectory(v2SegmentDirectory); setDirectoryPermissions(v3TempDirectory); createMetadataFile(v2SegmentDirectory, v3TempDirectory); copyCreationMetadataIfExists(v2SegmentDirectory, v3TempDirectory); copyLuceneTextIndexIfExists(v2SegmentDirectory, v3TempDirectory); copyIndexData(v2SegmentDirectory, v2Metadata, v3TempDirectory); File newLocation = SegmentDirectoryPaths.segmentDirectoryFor(v2SegmentDirectory, SegmentVersion.v3); LOGGER.info("v3 segment location for segment: {} is {}", v2Metadata.getName(), newLocation); v3TempDirectory.renameTo(newLocation); deleteV2Files(v2SegmentDirectory); }  @Override void convert(File v2SegmentDirectory); @VisibleForTesting File v3ConversionTempDirectory(File v2SegmentDirectory); static void main(String[] args); }
SegmentV1V2ToV3FormatConverter implements SegmentFormatConverter { @Override public void convert(File v2SegmentDirectory) throws Exception { Preconditions.checkNotNull(v2SegmentDirectory, "Segment directory should not be null"); Preconditions.checkState(v2SegmentDirectory.exists() && v2SegmentDirectory.isDirectory(), "Segment directory: " + v2SegmentDirectory.toString() + " must exist and should be a directory"); LOGGER.info("Converting segment: {} to v3 format", v2SegmentDirectory); SegmentMetadataImpl v2Metadata = new SegmentMetadataImpl(v2SegmentDirectory); SegmentVersion oldVersion = SegmentVersion.valueOf(v2Metadata.getVersion()); Preconditions.checkState(oldVersion != SegmentVersion.v3, "Segment {} is already in v3 format but at wrong path", v2Metadata.getName()); Preconditions.checkArgument(oldVersion == SegmentVersion.v1 || oldVersion == SegmentVersion.v2, "Can not convert segment version: {} at path: {} ", oldVersion, v2SegmentDirectory); deleteStaleConversionDirectories(v2SegmentDirectory); File v3TempDirectory = v3ConversionTempDirectory(v2SegmentDirectory); setDirectoryPermissions(v3TempDirectory); createMetadataFile(v2SegmentDirectory, v3TempDirectory); copyCreationMetadataIfExists(v2SegmentDirectory, v3TempDirectory); copyLuceneTextIndexIfExists(v2SegmentDirectory, v3TempDirectory); copyIndexData(v2SegmentDirectory, v2Metadata, v3TempDirectory); File newLocation = SegmentDirectoryPaths.segmentDirectoryFor(v2SegmentDirectory, SegmentVersion.v3); LOGGER.info("v3 segment location for segment: {} is {}", v2Metadata.getName(), newLocation); v3TempDirectory.renameTo(newLocation); deleteV2Files(v2SegmentDirectory); }  @Override void convert(File v2SegmentDirectory); @VisibleForTesting File v3ConversionTempDirectory(File v2SegmentDirectory); static void main(String[] args);  }