@VisibleForTesting
  protected <V> V catchCorruption(ThrowableComputable<V, IOException> operation) throws IOException {
    if (isCorrupted()) {
      throw new CorruptedException("PersistentEnumerator storage corrupted " + myFile);
    }

    try {
      // try to repair a storage
      try {
        return operation.compute();
      }
      catch (Throwable th) {
        if (th instanceof NoDataException || !trySelfHeal()) {
          throw th;
        }
      }

      // and try one more time to execute an operation
      return operation.compute();
    }
    catch (NoDataException e) {
      return null;
    }
    catch (ClosedStorageException e) {
      throw e;
    }
    catch (IOException io) {
      LOG.error(io);
      markCorrupted();
      throw io;
    }
    catch (Throwable e) {
      LOG.error(e);
      markCorrupted();
      throw new RuntimeException(e);
    }
  }
@VisibleForTesting
  protected <V> V catchCorruption(ThrowableComputable<V, IOException> operation)