/** checks for corrupt blocks and fixes them (if any) */
  void checkAndFixBlocks() throws IOException, InterruptedException, ClassNotFoundException {
    checkJobs();

    if (jobIndex.size() >= maxPendingJobs) {
      LOG.info("Waiting for " + jobIndex.size() + " pending jobs");
      return;
    }

    Map<String, Integer> corruptFiles = getCorruptFiles();
    FileSystem fs = new Path("/").getFileSystem(getConf());
    Map<String, Integer> corruptFilePriority = computePriorities(fs, corruptFiles);

    int totalCorruptFiles = corruptFilePriority.size() + fileIndex.size();
    RaidNodeMetrics.getInstance().numFilesToFix.set(totalCorruptFiles);

    String startTimeStr = dateFormat.format(new Date());

    LOG.info("Found " + corruptFilePriority.size() + " corrupt files");

    if (corruptFilePriority.size() > 0) {
      for (int pri = 1; pri >= 0; pri--) {
        String jobName = "blockfixer." + jobCounter + ".pri" + pri + "." + startTimeStr;
        jobCounter++;
        startJob(jobName, corruptFilePriority, pri);
      }
    }
  }