in hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/UpgradeContainerSchema.java [211:329]
public CompletableFuture<VolumeUpgradeResult> getUpgradeFuture() {
final File lockFile = UpgradeUtils.getVolumeUpgradeLockFile(hddsVolume);
return CompletableFuture.supplyAsync(() -> {
final VolumeUpgradeResult result =
new VolumeUpgradeResult(hddsVolume);
List<ContainerUpgradeResult> resultList = new ArrayList<>();
final File hddsVolumeRootDir = hddsVolume.getHddsRootDir();
Preconditions.checkNotNull(hddsVolumeRootDir, "hddsVolumeRootDir" +
"cannot be null");
// check CID directory and current file
File clusterIDDir = new File(hddsVolume.getStorageDir(),
hddsVolume.getClusterID());
if (!clusterIDDir.exists() || !clusterIDDir.isDirectory()) {
result.fail(new Exception("Volume " + hddsVolumeRootDir +
" is in an inconsistent state. Expected " +
"clusterID directory " + clusterIDDir +
" is not found or not a directory."));
return result;
}
File currentDir = new File(clusterIDDir, Storage.STORAGE_DIR_CURRENT);
if (!currentDir.exists() || !currentDir.isDirectory()) {
result.fail(new Exception(
"Current dir " + currentDir + " is not found or not a directory,"
+ " skip upgrade."));
return result;
}
try {
// create lock file
if (!lockFile.createNewFile()) {
result.fail(new Exception("Upgrade lock file already exists " +
lockFile.getAbsolutePath() + ", skip upgrade."));
return result;
}
} catch (IOException e) {
result.fail(new Exception("Failed to create upgrade lock file " +
lockFile.getAbsolutePath() + ", skip upgrade."));
return result;
}
// check complete file again
final File completeFile =
UpgradeUtils.getVolumeUpgradeCompleteFile(hddsVolume);
if (completeFile.exists()) {
result.fail(new Exception("Upgrade complete file already exists " +
completeFile.getAbsolutePath() + ", skip upgrade."));
if (!lockFile.delete()) {
error("Failed to delete upgrade lock file %s.", lockFile);
}
return result;
}
// backup DB directory
final File volumeDBPath;
try {
volumeDBPath = getVolumeDBPath();
dbBackup(volumeDBPath);
} catch (IOException e) {
result.fail(new Exception(e.getMessage() + ", skip upgrade."));
return result;
}
// load DB store
try {
hddsVolume.loadDbStore(isDryRun());
RawDB db = DatanodeStoreCache.getInstance().getDB(
volumeDBPath.getAbsolutePath(), config);
dataStore = (DatanodeStoreSchemaThreeImpl) db.getStore();
result.setStore(dataStore);
} catch (IOException e) {
result.fail(new Exception(
"Failed to load db for volume " + hddsVolume.getVolumeRootDir() +
" for " + e.getMessage() + ", skip upgrade."));
return result;
}
info("Start to upgrade containers on volume %s",
hddsVolume.getVolumeRootDir());
File[] containerTopDirs = currentDir.listFiles();
if (containerTopDirs != null) {
for (File containerTopDir : containerTopDirs) {
try {
final List<ContainerUpgradeResult> results =
upgradeSubContainerDir(containerTopDir);
resultList.addAll(results);
} catch (IOException e) {
result.fail(e);
return result;
}
}
}
result.setResultList(resultList);
result.success();
return result;
}).whenComplete((r, e) -> {
final File file =
UpgradeUtils.getVolumeUpgradeCompleteFile(r.getHddsVolume());
// create a flag file
if (e == null && r.isSuccess()) {
try {
UpgradeUtils.createFile(file);
} catch (IOException ioe) {
error(ioe, "Failed to create upgrade complete file %s.", file);
}
}
if (lockFile.exists()) {
boolean deleted = lockFile.delete();
if (!deleted) {
error("Failed to delete upgrade lock file %s.", file);
}
}
});
}