class MappingServiceImpl extends AbstractService implements MappingService {
    /** */
    private GridDiscoveryManager discoveryManager;

    /**
     * @param ctx Kernal.
     */
    public MappingServiceImpl(GridKernalContext ctx) {
        super(ctx);
    }

    /**
     * @param discoveryManager Discovery manager.
     */
    public void discoveryManager(GridDiscoveryManager discoveryManager) {
        this.discoveryManager = discoveryManager;
    }

    /** {@inheritDoc} */
    @Override public void onStart(GridKernalContext ctx) {
        discoveryManager(ctx.discovery());
    }

    /** {@inheritDoc} */
    @Override public List<UUID> executionNodes(@NotNull AffinityTopologyVersion topVer, boolean single,
        @Nullable Predicate<ClusterNode> nodeFilter) {<FILL_FUNCTION_BODY>}
}

        List<ClusterNode> nodes = new ArrayList<>(discoveryManager.discoCache(topVer).serverNodes());

        if (nodeFilter != null)
            nodes = nodes.stream().filter(nodeFilter).collect(Collectors.toList());

        if (single && nodes.size() > 1)
            nodes = F.asList(nodes.get(ThreadLocalRandom.current().nextInt(nodes.size())));

        if (F.isEmpty(nodes))
            throw new IllegalStateException("failed to map query to execution nodes. Nodes list is empty.");

        return Commons.transform(nodes, ClusterNode::id);
    
<methods>public void onStart(org.apache.ignite.internal.GridKernalContext) ,public void onStop() <variables>protected final non-sealed org.apache.ignite.IgniteLogger log