private ResultCollector executeFunctionOnRemoteNode(InternalDistributedMember targetNode,
      final Function function, final Object object, final Set routingKeys, ResultCollector rc,
      int[] bucketArray, ServerToClientFunctionResultSender sender, AbstractExecution execution) {
    PartitionedRegionFunctionResultSender resultSender =
        new PartitionedRegionFunctionResultSender(null, this, 0, rc, sender, false, true,
            execution.isForwardExceptions(), function, bucketArray);

    PartitionedRegionFunctionResultWaiter resultReceiver =
        new PartitionedRegionFunctionResultWaiter(getSystem(), getPRId(), rc, function,
            resultSender);

    FunctionRemoteContext context = new FunctionRemoteContext(function, object, routingKeys,
        bucketArray, execution.isReExecute(), execution.isFnSerializationReqd(), getPrincipal());

    HashMap<InternalDistributedMember, FunctionRemoteContext> recipMap =
        new HashMap<>();

    recipMap.put(targetNode, context);

    return resultReceiver.getPartitionedDataFrom(recipMap, this, execution);
  }
Gets the remote object with the given key.

@param targetNode the Node hosting the key
@param bucketId the id of the bucket the key hashed into
@param key the key
@param requestingClient the client that made this request
@param clientEvent client event for carrying version information. Null if not a client
       operation
@param returnTombstones TODO
@return the value
@throws PrimaryBucketException if the peer is no longer the primary
@throws ForceReattemptException if the peer is no longer available
geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java