/* * In case of rolling-upgrade, we try to read all the formats and build * the snapshot with the latest format. */ private void convertToV2SingleManifest() throws IOException { // Try to load v1 and v2 regions List<SnapshotRegionManifest> v1Regions, v2Regions; ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader"); try { v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc); v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, fs, workingDir, desc); } finally { tpool.shutdown(); } SnapshotDataManifest.Builder dataManifestBuilder = SnapshotDataManifest.newBuilder(); dataManifestBuilder.setTableSchema(ProtobufUtil.convertToTableSchema(htd)); if (v1Regions != null && v1Regions.size() > 0) { dataManifestBuilder.addAllRegionManifests(v1Regions); } if (v2Regions != null && v2Regions.size() > 0) { dataManifestBuilder.addAllRegionManifests(v2Regions); } // Write the v2 Data Manifest. // Once the data-manifest is written, the snapshot can be considered complete. // Currently snapshots are written in a "temporary" directory and later // moved to the "complated" snapshot directory. SnapshotDataManifest dataManifest = dataManifestBuilder.build(); writeDataManifest(dataManifest); this.regionManifests = dataManifest.getRegionManifestsList(); // Remove the region manifests. Everything is now in the data-manifest. // The delete operation is "relaxed", unless we get an exception we keep going. // The extra files in the snapshot directory will not give any problem, // since they have the same content as the data manifest, and even by re-reading // them we will get the same information. if (v1Regions != null && v1Regions.size() > 0) { for (SnapshotRegionManifest regionManifest : v1Regions) { SnapshotManifestV1.deleteRegionManifest(fs, workingDir, regionManifest); } } if (v2Regions != null && v2Regions.size() > 0) { for (SnapshotRegionManifest regionManifest : v2Regions) { SnapshotManifestV2.deleteRegionManifest(fs, workingDir, regionManifest); } } }