private MobCell readCell(List<Path> locations, String fileName, ExtendedCell search,
    boolean cacheMobBlocks, long readPt, boolean readEmptyValueOnMobCellMiss) throws IOException {
    FileSystem fs = getFileSystem();
    IOException ioe = null;
    for (Path location : locations) {
      MobFile file = null;
      Path path = new Path(location, fileName);
      try {
        file = mobFileCache.openFile(fs, path, getCacheConfig(), this.getStoreContext());
        return readPt != -1
          ? file.readCell(search, cacheMobBlocks, readPt)
          : file.readCell(search, cacheMobBlocks);
      } catch (IOException e) {
        mobFileCache.evictFile(fileName);
        ioe = e;
        if (
          (e instanceof FileNotFoundException) || (e.getCause() instanceof FileNotFoundException)
        ) {
          LOG.debug("Fail to read the cell, the mob file " + path + " doesn't exist", e);
        } else if (e instanceof CorruptHFileException) {
          LOG.error("The mob file " + path + " is corrupt", e);
          break;
        } else {
          throw e;
        }
      } finally {
        if (file != null) {
          mobFileCache.closeFile(file);
        }
      }
    }
    LOG.error("The mob file " + fileName + " could not be found in the locations " + locations
      + " or it is corrupt");
    if (readEmptyValueOnMobCellMiss) {
      return null;
    } else if (
      (ioe instanceof FileNotFoundException) || (ioe.getCause() instanceof FileNotFoundException)
    ) {
      // The region is re-opened when FileNotFoundException is thrown.
      // This is not necessary when MOB files cannot be found, because the store files
      // in a region only contain the references to MOB files and a re-open on a region
      // doesn't help fix the lost MOB files.
      throw new DoNotRetryIOException(ioe);
    } else {
      throw ioe;
    }
  }
Reads the cell from a mob file. The mob file might be located in different directories. 1. The
working directory. 2. The archive directory. Reads the cell from the files located in both of
the above directories.
@param locations                   The possible locations where the mob files are saved.
@param fileName                    The file to be read.
@param search                      The cell to be searched.
@param cacheMobBlocks              Whether the scanner should cache blocks.
@param readPt                      the read point.
@param readEmptyValueOnMobCellMiss Whether return null value when the mob file is missing or
                                   corrupt.
@return The found cell. Null if there's no such a cell.
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HMobStore.java