code: boolean reconstructFile(Path srcPath, Context context)
        throws IOException, InterruptedException {
      Progressable progress = context;
      if (progress == null) {
        progress = RaidUtils.NULL_PROGRESSABLE;
      }
      
      FileSystem fs = srcPath.getFileSystem(getConf());
      FileStatus srcStat = null;
      try {
        srcStat = fs.getFileStatus(srcPath);
      } catch (FileNotFoundException ex) {
        return false;
      }
  
      if (RaidNode.isParityHarPartFile(srcPath)) {
        return processParityHarPartFile(srcPath, progress);
      }
  
      // Reconstruct parity file
      for (Codec codec : Codec.getCodecs()) {
        if (isParityFile(srcPath, codec)) {
          Decoder decoder = new Decoder(getConf(), codec);
          decoder.connectToStore(srcPath);
          return processParityFile(srcPath, 
              decoder, context);
        }
      }
  
      // Reconstruct source file without connecting to stripe store 
      for (Codec codec : Codec.getCodecs()) {
        ParityFilePair ppair = ParityFilePair.getParityFile(
            codec, srcStat, getConf());
        if (ppair != null) {
          Decoder decoder = new Decoder(getConf(), codec);
          decoder.connectToStore(srcPath);
          return processFile(srcPath, ppair, decoder, false, context);
        }
      }
      // Reconstruct source file through stripe store
      for (Codec codec : Codec.getCodecs()) {
        if (!codec.isDirRaid) {
          continue;
        }
        try {
          // try to fix through the stripe store.
          Decoder decoder = new Decoder(getConf(), codec);
          decoder.connectToStore(srcPath);
          if (processFile(srcPath, null, decoder, true, context)) {
            return true;
          }
        } catch (Exception ex) {
          LogUtils.logRaidReconstructionMetrics(LOGRESULTS.FAILURE, 0,
              codec, srcPath, -1, LOGTYPES.OFFLINE_RECONSTRUCTION_USE_STRIPE,
              fs, ex, context);
        }
      }
      
      return false;    
    }
docs: Fix a file, report progess.
  
  @return true if file was reconstructed, false if no reconstruction
  was necessary or possible.