private static List constructAndGetPutAllTasks(Region region, final Map map,
      final EventID eventId,
      boolean skipCallbacks, final Map<ServerLocation, Set> serverToFilterMap,
      final InternalPool pool, Object callbackArg) {
    final List<SingleHopOperationCallable> tasks = new ArrayList<>();
    List<ServerLocation> servers = new ArrayList<>(serverToFilterMap.keySet());

    if (logger.isDebugEnabled()) {
      logger.debug("Constructing tasks for the servers {}", servers);
    }
    for (ServerLocation server : servers) {
      Set filterSet = serverToFilterMap.get(server);
      Map newKeysValuesMap = new LinkedHashMap();
      // iterator 1: for single hop, both iterator filterSet and newKeysValuesMap
      for (Object key : filterSet) {
        newKeysValuesMap.put(key, map.get(key));
      }
      AbstractOp putAllOp =
          new PutAllOpImpl(region, newKeysValuesMap, eventId, true, skipCallbacks, callbackArg);

      SingleHopOperationCallable task =
          new SingleHopOperationCallable(new ServerLocation(server.getHostName(), server.getPort()),
              pool, putAllOp, UserAttributes.userAttributes.get());
      tasks.add(task);
    }
    return tasks;
  }
Does a region put on a server using connections from the given pool to communicate with the
server.

@param pool the pool to use to communicate with the server.
@param region the name of the region to do the putAll on
@param map the Map of keys and values to put
@param eventId the event id for this putAll
geode-core/src/main/java/org/apache/geode/cache/client/internal/PutAllOp.java