/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.internal.client; import java.util.Collection; import java.util.List; import java.util.UUID; import org.apache.ignite.internal.client.balancer.GridClientLoadBalancer; import org.jetbrains.annotations.Nullable; /** * A compute projection of grid client. Contains various methods for task execution, full and partial (per node) * topology refresh, and log viewing. An initial instance of compute projection over the whole remote grid is * provided via {@link GridClient#compute()} method. Further sub-projections may be created via * any of the {@code projection(...)} methods on this API. * <p> * You can create custom client projections based on any user-defined filtering. For example you can create * a projection over a certain group of nodes, or over all nodes that have a certain attribute. Once projection * is created, only nodes that belong to this projection will be contacted on remote grid for any operation. * This essentially allows users to create virtual subgrids for remote task execution. * <p> * Use any of the {@code execute(...)} methods to execute tasks on remote grid. Note that tasks need * to be deployed to remote grid first prior to execution. You can also use any of the * {@code affinityExecute(...)} methods to execute tasks on node that have affinity with some data key. * This way you can collocate your computation with the data cached on remote nodes. * <p> * You can also use any of the {@code refreshNode(...)} or {@code refreshTopology(...)} methods * to eagerly refresh metrics or attributes on remote nodes (note that attributes are static, * so it is sufficient to fetch and cache them only once). Metrics and attributes will be * cached in {@link GridClientNode} instances automatically if {@link GridClientConfiguration#isEnableMetricsCache()} * or {@link GridClientConfiguration#isEnableAttributesCache()} property is set to {@code true}. * <p> * Compute client also allows fetching contents of remote log files (including backwards mode) via any of * the provided {@code log(...)} methods. * <h1 class="header">Affinity Awareness</h1> * One of the unique properties of the Ignite remote clients is that they are * affinity aware. In other words, both compute and data APIs will optionally * contact exactly the node where the data is cached based on some affinity key. * This allows for collocation of computations and data and avoids extra network * hops that would be necessary if non-affinity nodes were contacted. Use * {@link #affinityExecute(String, String, Object, Object)} and * {@link #affinityExecuteAsync(String, String, Object, Object)} to synchronously * or asynchronously execute remote tasks on affinity nodes based on provided * affinity keys. */ public interface GridClientCompute { /** * Creates a projection that will communicate only with specified remote node. * <p> * If current projection is dynamic projection, then this method will check is passed node is in topology. * If any filters were specified in current topology, this method will check if passed node is accepted by * the filter. If current projection was restricted to any subset of nodes, this method will check if * passed node is in that subset. If any of the checks fails an exception will be thrown. * * @param node Single node to which this projection will be restricted. * @return Resulting static projection that is bound to a given node. * @throws GridClientException If resulting projection is empty. */ public GridClientCompute projection(GridClientNode node) throws GridClientException; /** * Creates a projection that will communicate only with nodes that are accepted by the passed filter. * <p> * If current projection is dynamic projection, then filter will be applied to the most relevant * topology snapshot every time a node to communicate is selected. If current projection is a static projection, * then resulting projection will only be restricted to nodes that were in parent projection and were * accepted by the passed filter. If any of the checks fails an exception will be thrown. * * @param filter Filter that will select nodes for projection. If {@code null}, * then no filter would be applied to nodes in projection. * @return Resulting projection (static or dynamic, depending in parent projection type). * @throws GridClientException If resulting projection is empty. */ public GridClientCompute projection(GridClientPredicate<? super GridClientNode> filter) throws GridClientException; /** * Creates a projection that will communicate only with specified remote nodes. For any particular call * a node to communicate will be selected with balancer of this projection. * <p> * If current projection is dynamic projection, then this method will check is passed nodes are in topology. * If any filters were specified in current topology, this method will check if passed nodes are accepted by * the filter. If current projection was restricted to any subset of nodes, this method will check if * passed nodes are in that subset (i.e. calculate the intersection of two collections). * If any of the checks fails an exception will be thrown. * * @param nodes Collection of nodes to which this projection will be restricted. If {@code null}, * created projection is dynamic and will take nodes from topology. * @return Resulting static projection that is bound to a given nodes. * @throws GridClientException If resulting projection is empty. */ public GridClientCompute projection(Collection<GridClientNode> nodes) throws GridClientException; /** * Creates a projection that will communicate only with nodes that are accepted by the passed filter. The * balancer passed will override default balancer specified in configuration. * <p> * If current projection is dynamic projection, then filter will be applied to the most relevant * topology snapshot every time a node to communicate is selected. If current projection is a static projection, * then resulting projection will only be restricted to nodes that were in parent projection and were * accepted by the passed filter. If any of the checks fails an exception will be thrown. * * @param filter Filter that will select nodes for projection. If {@code null}, * then no filter would be applied to nodes in projection. * @param balancer Balancer that will select balanced node in resulting projection. If {@code null}, * then balancer which was specified while projection construction will be used. * @return Resulting projection (static or dynamic, depending in parent projection type). * @throws GridClientException If resulting projection is empty. */ public GridClientCompute projection(GridClientPredicate<? super GridClientNode> filter, GridClientLoadBalancer balancer) throws GridClientException; /** * Creates a projection that will communicate only with specified remote nodes. For any particular call * a node to communicate will be selected with passed balancer.. * <p> * If current projection is dynamic projection, then this method will check is passed nodes are in topology. * If any filters were specified in current topology, this method will check if passed nodes are accepted by * the filter. If current projection was restricted to any subset of nodes, this method will check if * passed nodes are in that subset (i.e. calculate the intersection of two collections). * If any of the checks fails an exception will be thrown. * * @param nodes Collection of nodes to which this projection will be restricted. If {@code null}, * then no filter would be applied to nodes in projection. * @param balancer Balancer that will select nodes in resulting projection. If {@code null}, * then balancer which was specified while projection construction will be used. * @return Resulting static projection that is bound to a given nodes. * @throws GridClientException If resulting projection is empty. */ public GridClientCompute projection(Collection<GridClientNode> nodes, GridClientLoadBalancer balancer) throws GridClientException; /** * Gets load balancer used by this projection. By default, the balancer specified * in {@link GridClientConfiguration#getBalancer()} property is used. User can * provide custom balancers for different projections via * {@link #projection(GridClientPredicate, GridClientLoadBalancer)} method. * * @return Instance of {@link GridClientLoadBalancer} used by this projection. */ public GridClientLoadBalancer balancer(); /** * Executes task on remote grid. Only nodes included into this projection will * be contacted. Note that task must be deployed on remote grid prior to the * execution. * * @param taskName Task name or task class name. * @param taskArg Optional task argument. * @return Task execution result. * @throws GridClientException In case of error. * @throws GridServerUnreachableException If none of the servers can be reached. * @throws GridClientClosedException If client was closed manually. */ public <R> R execute(String taskName, Object taskArg) throws GridClientException; /** * Asynchronously executes task on remote grid. Only nodes included into this projection will * be contacted. Note that task must be deployed on remote grid prior to the * execution. * * @param taskName Task name or task class name. * @param taskArg Optional task argument. * @return Future for remote execution. */ public <R> GridClientFuture<R> executeAsync(String taskName, Object taskArg); /** * Executes task using cache affinity key for routing. This way the task will start executing * exactly on the node where this affinity key is cached hence allowing for * collocation of computations and data. * * @param taskName Task name or task class name. * @param cacheName Name of the cache on which affinity should be calculated. If {@code null}, * then default cache will be used. * @param affKey Affinity key. * @param taskArg Optional task argument. * @return Task execution result. * @throws GridClientException In case of error. * @throws GridServerUnreachableException If none of the servers can be reached. * @throws GridClientClosedException If client was closed manually. */ public <R> R affinityExecute(String taskName, String cacheName, Object affKey, Object taskArg) throws GridClientException; /** * Asynchronously executes task using cache affinity key for routing. This way * the task will start executing exactly on the node where this affinity key is cached * hence allowing for collocation of computations and data. * * @param taskName Task name or task class name. * @param cacheName Name of the cache on which affinity should be calculated. If {@code null}, * then balancer which was specified while projection construction will be used. * @param affKey Affinity key. * @param taskArg Optional task argument. * @return Future for the remote execution. */ public <R> GridClientFuture<R> affinityExecuteAsync(String taskName, String cacheName, Object affKey, Object taskArg); /** * Gets most recently refreshed topology (only non-daemon nodes included). * If this compute instance is a projection, then only nodes that * satisfy projection criteria will be returned. * * @return Most recently refreshed topology. * @throws GridClientException If client doesn't have an actual topology version. */ public Collection<GridClientNode> nodes() throws GridClientException; /** * Gets cached node with given id from most recently refreshed topology. * * @param id Node ID. * @return Node for given ID or {@code null} if node with given id was not found. * @throws GridClientException If client doesn't have an actual topology version. */ public GridClientNode node(UUID id) throws GridClientException; /** * Gets cached nodes for the given IDs based on most recently refreshed topology. * If this compute instance is a projection, then only nodes that passes projection * criteria will be returned. * * @param ids Node IDs. * @return Collection of nodes for provided IDs. * @throws GridClientException If client doesn't have an actual topology version. */ public Collection<GridClientNode> nodes(Collection<UUID> ids) throws GridClientException; /** * Gets all cached nodes that pass the filter. If this compute instance is a projection, then only * nodes that passes projection criteria will be passed to the filter. * * @param filter Node filter. * @return Collection of nodes that satisfy provided filter. * @throws GridClientException If client doesn't have an actual topology version. */ public Collection<GridClientNode> nodes(GridClientPredicate<GridClientNode> filter) throws GridClientException; /** * Gets most recently refreshed set of daemon nodes. If this compute instance is a projection, * then only nodes that satisfy projection criteria will be returned. * * @return Daemon nodes in most recently refreshed topology. * @throws GridClientException If client doesn't have an actual topology version. */ public Collection<GridClientNode> daemonNodes() throws GridClientException; /** * Refreshes and returns node by its ID from remote grid. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()} parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to true. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param id Node ID. * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Node descriptor or {@code null} if node doesn't exist. * @throws GridClientException In case request failed. * @throws GridServerUnreachableException If none of the servers can be reached. * @throws GridClientClosedException If client was closed manually. */ public GridClientNode refreshNode(UUID id, boolean includeAttrs, boolean includeMetrics) throws GridClientException; /** * Asynchronously refreshes and returns node by its ID from remote grid. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()} parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to true. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param id Node ID. * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Future for the refresh */ public GridClientFuture<GridClientNode> refreshNodeAsync(UUID id, boolean includeAttrs, boolean includeMetrics); /** * Refreshes and returns node by its IP address from remote grid. All possible IP addresses * of a node will be checked. If there is more than one node for given IP address, then * first found node will be refreshed. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()} parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to true. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param ip IP address. * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Node descriptor or {@code null} if node doesn't exist. * @throws GridClientException In case of error. * @throws GridServerUnreachableException If none of the servers can be reached. * @throws GridClientClosedException If client was closed manually. */ @Nullable public GridClientNode refreshNode(String ip, boolean includeAttrs, boolean includeMetrics) throws GridClientException; /** * Asynchronously refreshes and returns node by its IP address from remote grid. All possible IP addresses * of a node will be checked. If there is more than one node for given IP address, then * first found node will be refreshed. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()} parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to true. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param ip IP address. * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Future for the refresh operation. */ public GridClientFuture<GridClientNode> refreshNodeAsync(String ip, boolean includeAttrs, boolean includeMetrics); /** * Refreshes and returns all nodes within topology. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()} parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to {@code true}. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Node descriptors. * @throws GridClientException In case of error. * @throws GridServerUnreachableException If none of the servers can be reached. * @throws GridClientClosedException If client was closed manually. */ public List<GridClientNode> refreshTopology(boolean includeAttrs, boolean includeMetrics) throws GridClientException; /** * Asynchronously refreshes and returns all nodes within topology. Use {@code includeAttrs} and * {@code includeMetrics} parameters to automatically fetch remote node attributes and * metrics. * <p> * Note that fetched attributes and metrics may or may note be cached in {@link GridClientNode} * based on {@link GridClientConfiguration#isEnableMetricsCache()} and * {@link GridClientConfiguration#isEnableAttributesCache()}parameters. Even though topology * is refreshed automatically every {@link GridClientConfiguration#getTopologyRefreshFrequency()} * interval, node metrics and attributes will be fetched in background only if * {@link GridClientConfiguration#isAutoFetchMetrics()} or * {@link GridClientConfiguration#isAutoFetchAttributes()} set to {@code true}. * <p> * Also note that node attributes are static and, if cached, there is no need * to refresh them again. * * @param includeAttrs Whether to include node attributes. * @param includeMetrics Whether to include node metrics. * @return Future. */ public GridClientFuture<List<GridClientNode>> refreshTopologyAsync(boolean includeAttrs, boolean includeMetrics); /** * Sets keep binary flag for the next task execution in the current thread. */ public GridClientCompute withKeepBinaries(); }