public void scheduleGetPRMetaData(final InternalRegion region, final boolean isRecursive) {
    if (nonPRs.contains(region.getFullPath())) {
      return;
    }
    setMetadataStable(false);
    if (isRecursive) {
      try {
        getClientPRMetadata(region);
      } catch (VirtualMachineError e) {
        SystemFailure.initiateFailure(e);
        throw e;
      } catch (Throwable e) {
        SystemFailure.checkFailure();
        if (logger.isDebugEnabled()) {
          logger.debug("An exception occurred while fetching metadata", e);
        }
      }
    } else {
      synchronized (fetchTaskCountLock) {
        refreshTaskCount++;
        totalRefreshTaskCount++;
      }
      Runnable fetchTask = () -> {
        try {
          getClientPRMetadata(region);
        } catch (VirtualMachineError e) {
          SystemFailure.initiateFailure(e);
          throw e;
        } catch (Throwable e) {
          SystemFailure.checkFailure();
          if (logger.isDebugEnabled()) {
            logger.debug("An exception occurred while fetching metadata", e);
          }
        } finally {
          synchronized (fetchTaskCountLock) {
            refreshTaskCount--;
          }
        }
      };
      SingleHopClientExecutor.submitTask(fetchTask);
    }
  }
This function should make a map of server to buckets it is hosting. If for some bucket servers
are not available due to mismatch in metadata it should fill up a random server for it.
geode-core/src/main/java/org/apache/geode/cache/client/internal/ClientMetadataService.java