public CompletableFuture getUpgradeFuture()

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);
          }
        }
      });
    }