private void netSearchForBlob() throws TimeoutException {
    if (netSearchDone) {
      return;
    }
    netSearchDone = true;
    CachePerfStats stats = region.getCachePerfStats();
    long start = 0;
    Set sendSet = null;

    result = null;
    RegionAttributes attrs = region.getAttributes();
    // Object aCallbackArgument = null;
    requestInProgress = true;
    selectedNodeDead = false;
    initRemainingTimeout();
    start = stats.startNetsearch();
    try {
      List<InternalDistributedMember> replicates =
          new ArrayList(advisor.adviseInitializedReplicates());
      if (replicates.size() > 1) {
        Collections.shuffle(replicates);
      }
      for (InternalDistributedMember replicate : replicates) {
        synchronized (pendingResponders) {
          pendingResponders.clear();
        }

        synchronized (this) {
          requestInProgress = true;
          remoteGetInProgress = true;
          setSelectedNode(replicate);
          lastNotifySpot = 0;

          sendValueRequest(replicate);
          waitForObject2(remainingTimeout);

          if (authorative) {
            if (result != null) {
              netSearch = true;
            }
            return;
          } else {
            // clear anything that might have been set by our query.
            selectedNode = null;
            selectedNodeDead = false;
            lastNotifySpot = 0;
            result = null;
          }
        }
      }
      synchronized (membersLock) {
        Set recipients = advisor.adviseNetSearch();
        if (recipients.isEmpty()) {
          return;
        }
        ArrayList list = new ArrayList(recipients);
        Collections.shuffle(list);
        sendSet = new HashSet(list);
        synchronized (pendingResponders) {
          pendingResponders.clear();
          pendingResponders.addAll(list);
        }
      }

      boolean useMulticast = region.getMulticastEnabled() && (region instanceof DistributedRegion)
          && region.getSystem().getConfig().getMcastPort() != 0;

      // moved outside the sync to fix bug 39458
      QueryMessage.sendMessage(this, regionName, key, useMulticast, sendSet,
          remainingTimeout, attrs.getEntryTimeToLive().getTimeout(),
          attrs.getEntryIdleTimeout().getTimeout());

      synchronized (this) {
        // moved this send back into sync to fix bug 37132
        // QueryMessage.sendMessage(this, this.regionName,this.key,useMulticast,
        // sendSet,this.remainingTimeout ,
        // attrs.getEntryTimeToLive().getTimeout(),
        // attrs.getEntryIdleTimeout().getTimeout());
        boolean done = false;
        do {
          waitForObject2(remainingTimeout);
          if (selectedNodeDead && remoteGetInProgress) {
            sendNetSearchRequest();
          } else {
            done = true;
          }
        } while (!done);

        if (result != null) {
          netSearch = true;
        }
        return;
      }
    } finally {
      stats.endNetsearch(start);
    }
  }
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