Search in sources :

Example 1 with ReplicaSelection

use of com.linkedin.pinot.transport.common.ReplicaSelection in project pinot by linkedin.

the class ScatterGatherImpl method selectServicesPerPartition.

/**
   * For each segmentId in the instanceToSegmentMap, we select one (or more speculative) servers
   *
   * @param requestContext
   */
private void selectServicesPerPartition(ScatterGatherRequestContext requestContext) {
    Map<ServerInstance, SegmentIdSet> selectedServers = new HashMap<ServerInstance, SegmentIdSet>();
    ScatterGatherRequest request = requestContext.getRequest();
    Map<List<ServerInstance>, SegmentIdSet> instanceToSegmentMap = requestContext.getInvertedMap();
    ReplicaSelection selection = request.getReplicaSelection();
    for (Entry<List<ServerInstance>, SegmentIdSet> e : instanceToSegmentMap.entrySet()) {
        SegmentId firstPartition = null;
        for (SegmentId p : e.getValue().getSegments()) {
            /**
         * For selecting the server, we always use first segmentId in the group. This will provide
         * more chance for fanning out the query
         */
            if (null == firstPartition) {
                firstPartition = p;
            }
            ServerInstance s = selection.selectServer(firstPartition, e.getKey(), request.getHashKey());
            mergePartitionGroup(selectedServers, s, p);
        }
    }
    requestContext.setSelectedServers(selectedServers);
}
Also used : ReplicaSelection(com.linkedin.pinot.transport.common.ReplicaSelection) HashMap(java.util.HashMap) SegmentId(com.linkedin.pinot.transport.common.SegmentId) SegmentIdSet(com.linkedin.pinot.transport.common.SegmentIdSet) ArrayList(java.util.ArrayList) List(java.util.List) ServerInstance(com.linkedin.pinot.common.response.ServerInstance)

Example 2 with ReplicaSelection

use of com.linkedin.pinot.transport.common.ReplicaSelection in project pinot by linkedin.

the class ScatterGatherImpl method selectServicesPerPartitionGroup.

/**
   * For each segment-set in the instanceToSegmentMap, we select one (or more speculative) servers
   *
   * @param requestContext
   */
private void selectServicesPerPartitionGroup(ScatterGatherRequestContext requestContext) {
    Map<ServerInstance, SegmentIdSet> selectedServers = new HashMap<ServerInstance, SegmentIdSet>();
    ScatterGatherRequest request = requestContext.getRequest();
    Map<List<ServerInstance>, SegmentIdSet> instanceToSegmentMap = requestContext.getInvertedMap();
    //int numDuplicateRequests = request.getNumSpeculativeRequests();
    ReplicaSelection selection = request.getReplicaSelection();
    for (Entry<List<ServerInstance>, SegmentIdSet> e : instanceToSegmentMap.entrySet()) {
        ServerInstance s = selection.selectServer(e.getValue().getOneSegment(), e.getKey(), request.getHashKey());
        mergePartitionGroup(selectedServers, s, e.getValue());
    /**
       * TODO:
       * We can easily add speculative execution here. The below code will pick a distinct server
       * for the segmentId, This entry needs to be maintained in a separate container in ScatterGatherRequestContext
       * Then in sndRequest, we need to construct SelectingFuture for the pairs of Future corresponding to original
       * and speculative(duplicate) request.
       *
       int numServers = e.getKey().size();

      // Pick Unique servers for speculative request
      int numIterations = Math.min(numServers - 1, numDuplicateRequests);
      for (int i = 0, c = 0; i < numIterations; i++, c++)
      {
        ServerInstance s1 = e.getKey().get(c);
        if ( s.equals(s1))
        {
          c++;
          s1 = e.getKey().get(c);
        }
        mergePartitionGroup(selectedServers, s1, e.getValue());
        //TODO: speculative servers need to be maintained in a separate entry in ScatterGatherRequestContext
      }
       **/
    }
    requestContext.setSelectedServers(selectedServers);
}
Also used : ReplicaSelection(com.linkedin.pinot.transport.common.ReplicaSelection) HashMap(java.util.HashMap) SegmentIdSet(com.linkedin.pinot.transport.common.SegmentIdSet) ArrayList(java.util.ArrayList) List(java.util.List) ServerInstance(com.linkedin.pinot.common.response.ServerInstance)

Aggregations

ServerInstance (com.linkedin.pinot.common.response.ServerInstance)2 ReplicaSelection (com.linkedin.pinot.transport.common.ReplicaSelection)2 SegmentIdSet (com.linkedin.pinot.transport.common.SegmentIdSet)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 SegmentId (com.linkedin.pinot.transport.common.SegmentId)1