boolean testStorageAvailability() {
    if (!isStarted()) {
      return false;
    }
    BlobReadOptions readOptions = index.getRandomPutEntryReadOptions();
    if (readOptions == null) {
      // There is no put entry in this blob store, then we don't determine if this storage is still available,
      // just assume it's available and return true.
      logger.info("Failed to get a random put entry from store {}", dataDir);
      return true;
    }
    // Read the same chunk for several times, The first time would load data from disk to page cache, and if it does,
    // we can return true right away. If there is any error, the following reads would try again until the blob store
    // is shut down.
    // It's possible that data is already in page cache. We should either invalidate the page cache before reading
    // or read the data using direct io.
    for (int i = 0; i < config.storeIoErrorCountToTriggerShutdown; i++) {
      if (!isStarted()) {
        break;
      }
      try {
        // TODO: avoid page cache when testing storage availability
        readOptions.doPrefetch(0, readOptions.getMessageInfo().getSize());
        readOptions.getPrefetchedData().release();
        onSuccess("EXAMINE");
        // close read option to release the reference to the log segment
        readOptions.close();
        return true;
      } catch (Exception e) {
        if (e.getMessage().contains("Input/output error")) {
          tryOnError();
        } else {
          logger.error("Failed to prefetch PUT data from read options: {}", readOptions, e);
        }
      }
    }
    // close read option to release the reference to the log segment
    readOptions.close();
    return false;
  }
Test if the storage for this blob is still available or not. This test would be triggered after a blob store
on the same disk, encounters an io error. If this io error is indeed caused by disk error, we would want to
shut down all the blob stores on this disk as soon as possible, so we can move all the replicas on this disk
to a different place.

In order to test underlying storage's availability, this method would try read one chunk of data from disk
to memory for several times. If any of those read works, this method would return true.
@return
ambry-store/src/main/java/com/github/ambry/store/BlobStore.java