code: func (h *HTTPExtender) ProcessPreemption(
  	pod *v1.Pod,
  	nodeToVictims map[*v1.Node]*schedulerapi.Victims,
  	nodeNameToInfo map[string]*schedulernodeinfo.NodeInfo,
  ) (map[*v1.Node]*schedulerapi.Victims, error) {
  	var (
  		result schedulerapi.ExtenderPreemptionResult
  		args   *schedulerapi.ExtenderPreemptionArgs
  	)
  
  	if !h.SupportsPreemption() {
  		return nil, fmt.Errorf("preempt verb is not defined for extender %v but run into ProcessPreemption", h.extenderURL)
  	}
  
  	if h.nodeCacheCapable {
  		// If extender has cached node info, pass NodeNameToMetaVictims in args.
  		nodeNameToMetaVictims := convertToNodeNameToMetaVictims(nodeToVictims)
  		args = &schedulerapi.ExtenderPreemptionArgs{
  			Pod:                   pod,
  			NodeNameToMetaVictims: nodeNameToMetaVictims,
  		}
  	} else {
  		nodeNameToVictims := convertToNodeNameToVictims(nodeToVictims)
  		args = &schedulerapi.ExtenderPreemptionArgs{
  			Pod:               pod,
  			NodeNameToVictims: nodeNameToVictims,
  		}
  	}
  
  	if err := h.send(h.preemptVerb, args, &result); err != nil {
  		return nil, err
  	}
  
  	// Extender will always return NodeNameToMetaVictims.
  	// So let's convert it to NodeToVictims by using NodeNameToInfo.
  	newNodeToVictims, err := h.convertToNodeToVictims(result.NodeNameToMetaVictims, nodeNameToInfo)
  	if err != nil {
  		return nil, err
  	}
  	// Do not override nodeToVictims
  	return newNodeToVictims, nil
  }
docs: // ProcessPreemption returns filtered candidate nodes and victims after running preemption logic in extender.