void onBlobStoreIOError() {
    if (storeConfig.storeProactivelyTestStorageAvailability && ioErrorCheckerScheduled.compareAndSet(false, true)) {
      // Schedule the ioError checker to go over all the blob stores on this disk
      logger.info("Submitting a task to test storage availability on disk {}", disk.getMountPath());
      scheduler.schedule(() -> {
        List<BlobStore> storesToCheck = new ArrayList<>(stores.values());
        for (BlobStore store : storesToCheck) {
          logger.info("Testing storage availability for blob store {} on disk {}", store.getDataDir(),
              disk.getMountPath());
          if (store.isStarted()) {
            // if any of the store has its underlying storage available, we stop the test on other
            // blob stores since we know it's not a disk error.
            if (store.testStorageAvailability()) {
              logger.info("Blob store {} on disk {} is still available", store.getDataDir(), disk.getMountPath());
              break;
            } else {
              logger.info("Blob store {} on disk {} become unavailable", store.getDataDir(), disk.getMountPath());
            }
          } else {
            logger.info("Blob store {} on disk {} is not started", store.getDataDir(), disk.getMountPath());
          }
        }
        ioErrorCheckerScheduled.set(false);
      }, storeConfig.storeProactiveTestDelayInSeconds, TimeUnit.SECONDS);
    }
  }
A callback to invoke when a blob store encountered several io error and shut down itself. In this case,
we should test all blob stores on this disk. If it's indeed a disk error, all blob stores would be forced
to shut down themselves and enter ERROR state. Later disk failure handler would pick it up and move all
the replica out to a different place in FULL AUTO.
ambry-store/src/main/java/com/github/ambry/store/DiskManager.java