code: protected synchronized long popFirstAvailableHole(final int iRecordSize) throws IOException {
      if (maxHoleSize > -1 && iRecordSize + ODataLocal.RECORD_FIX_SIZE + 50 > maxHoleSize)
        // DON'T BROWSE: NO ONE HOLE WITH THIS SIZE IS AVAILABLE
        return -1;
  
      final long timer = OProfiler.getInstance().startChrono();
  
      if (!availableHolesBySize.isEmpty()) {
        cursor.size = iRecordSize;
  
        // SEARCH THE HOLE WITH THE SAME SIZE
        ODataHoleInfo hole = availableHolesBySize.get(cursor);
        if (hole != null && hole.size == iRecordSize) {
          // PERFECT MATCH: DELETE THE HOLE
          OProfiler.getInstance().stopChrono(PROFILER_DATA_RECYCLED_COMPLETE, timer);
          final long pos = hole.dataOffset;
          deleteHole(hole.holeOffset);
          return pos;
        }
  
        // TRY WITH THE BIGGEST HOLE
        hole = availableHolesBySize.lastKey();
        if (hole.size > iRecordSize + ODataLocal.RECORD_FIX_SIZE + 50) {
          // GOOD MATCH SINCE THE HOLE IS BIG ENOUGH ALSO FOR ANOTHER RECORD: UPDATE THE HOLE WITH THE DIFFERENCE
          final long pos = hole.dataOffset;
          OProfiler.getInstance().stopChrono(PROFILER_DATA_RECYCLED_PARTIAL, timer);
          updateHole(hole, hole.dataOffset + iRecordSize, hole.size - iRecordSize);
          return pos;
        }
      }
  
      OProfiler.getInstance().stopChrono(PROFILER_DATA_RECYCLED_NOTFOUND, timer);
  
      return -1;
    }
docs: Returns the first available hole (at least iRecordSize length) to be reused.
  
  @return
  
  @throws IOException