@Override
  public void close() throws IOException {
    if (isClosed()) {
      return;
    }
    //RC: let's do here as much of closing as we could: scan all pages and move all USABLE to
    //    ABOUT_TO_UNMAP, etc. By that we lower pressure on the housekeeper thread -- it will have
    //    some work to do anyway, but much less. This seems to be a good tradeoff, since thread
    //    invoking .close() usually not in a hurry -- and if it does hurry, it could use .closeAsync()
    pageCache.tryToReclaimAll(pages);

    final Future<?> future = closeAsync();
    try {//MAYBE pageCache.wakeupHousekeeper()?
      future.get();
    }
    catch (ExecutionException e) {
      final Throwable cause = e.getCause();
      if (cause instanceof IOException) {
        throw (IOException)cause;
      }
      else {
        throw new IOException("Can't close storage for " + file, cause);
      }
    }
    catch (InterruptedException e) {
      //RC: storage.close() method throwing InterruptedException is a lot of pain, because in many places only IO
      //    exceptions are expected, and there is no better way to deal with IE other then rethrow it as some kind
      //    of IO exception. So finally I decided to do it right here, instead of repeating it in 10s places around
      //    the codebase:
      final InterruptedIOException ioEx = new InterruptedIOException("Closing storage for " + file + " was interrupted");
      ioEx.addSuppressed(e);
      throw ioEx;
    }
  }
@Override
  public void close()