blob: c0e31c73d14ddd030acef2345e5381449bf5367b [file] [log] [blame]
/*
* 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();
}