public synchronized C reopen() throws E, IOException, IllegalStateException {
    if (storage == null || isClosedPredicate.test(storage)) {
      storage = storageOpener.compute();
      return storage;
    }

    String message = storageName + " is already created and !closed yet -- close the existing storage before re-opening it again";
    if (failIfNotClosed) {
      throw new IllegalStateException(message);
    }

    LOG.warn(message);

    //TODO RC: if we don't throw exception -- we should close storage here, otherwise this is not logically-consistent
    //         behavior
    if (CLOSE_BEFORE_REOPEN) {
      storage.close();
    }

    storage = storageOpener.compute();
    return storage;
  }
public synchronized C reopen()