Object doNetLoad() throws CacheLoaderException, TimeoutException {
    if (netLoadDone) {
      return null;
    }
    netLoadDone = true;
    if (advisor != null) {
      Set loadCandidatesSet = advisor.adviseNetLoad();
      if (loadCandidatesSet.isEmpty()) {
        return null;
      }
      CachePerfStats stats = region.getCachePerfStats();
      long start = stats.startNetload();
      ArrayList list = new ArrayList(loadCandidatesSet);
      Collections.shuffle(list);
      InternalDistributedMember[] loadCandidates =
          (InternalDistributedMember[]) list.toArray(new InternalDistributedMember[0]);
      initRemainingTimeout();

      RegionAttributes attrs = region.getAttributes();
      int index = 0;
      boolean stayInLoop = false; // never set to true!
      remoteLoadInProgress = true;
      try {
        do { // the only time this loop repeats is when continue is called
          InternalDistributedMember next = loadCandidates[index++];
          setSelectedNode(next);
          lastNotifySpot = 0;
          requestInProgress = true;
          if (remainingTimeout <= 0) { // @todo this looks wrong; why not a timeout exception?
            break;
          }
          remoteException = null;
          NetLoadRequestMessage.sendMessage(this, regionName, key, aCallbackArgument,
              next, remainingTimeout, attrs.getEntryTimeToLive().getTimeout(),
              attrs.getEntryIdleTimeout().getTimeout());
          waitForObject2(remainingTimeout);
          if (remoteException == null) {
            if (!requestInProgress) {
              // note even if result is null we are done; see bug 39738
              localLoad = false;
              if (result != null) {
                netLoad = true;
              }
              return result;
            } else {
              // Why does the following test for selectedNodeDead?
              // Seems like this will cause us to quit trying netLoad
              // even if we don't have a result yet and have not tried everyone.
              if ((selectedNodeDead) && (index < loadCandidates.length)) {
                continue;
              }
              // otherwise we are done
            }
          } else {
            Throwable cause;
            if (remoteException instanceof TryAgainException) {
              if (index < loadCandidates.length) {
                continue;
              } else {
                break;
              }
            }
            if (remoteException instanceof CacheLoaderException) {
              cause = remoteException.getCause();
            } else {
              cause = remoteException;
            }
            throw new CacheLoaderException(
                String.format("While invoking a remote netLoad: %s",
                    cause),
                cause);
          }

        } while (stayInLoop);
      } finally {
        stats.endNetload(start);
      }

    }
    return null;
  }
perform a net-search, setting this.result to the object found in the search
geode-core/src/main/java/org/apache/geode/internal/cache/SearchLoadAndWriteProcessor.java