blob: b8919b52e45850ba728c06c9dab548dd5f3a49bd [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.Map;
import java.util.Set;
import java.util.UUID;
/**
* A data projection of grid client. Contains various methods for cache operations and metrics retrieval.
* An instance of data projection over some remote cache is provided via
* {@link GridClient#data(String)} method.
* <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. By default
* all operations on {@code GridClientData} API will be affinity-aware unless
* such behavior is overridden by pinning one or more remote nodes
* (see {@link #pinNodes(GridClientNode, GridClientNode...)} for more information).
*/
public interface GridClientData {
/**
* Gets name of the remote cache. The cache name for this projection was specified
* via {@link GridClient#data(String)} method at the time of creation.
*
* @return Name of the remote cache.
*/
public String cacheName();
/**
* Gets client data projection which will only contact specified remote grid node. By default, remote
* node is determined based on {@link GridClientDataAffinity} provided - this method allows
* to override default behavior and use only specified server for all cache operations.
* <p>
* Use this method when there are other than {@code key-affinity} reasons why a certain
* node should be contacted.
*
* @param node Node to be contacted (optional).
* @param nodes Additional nodes (optional).
* @return Client data which will only contact server with given node ID.
* @throws GridClientException If resulting projection is empty.
*/
public GridClientData pinNodes(GridClientNode node, GridClientNode... nodes) throws GridClientException;
/**
* Gets pinned node or {@code null} if no nodes were pinned.
*
* @return Pinned node.
*/
public Collection<GridClientNode> pinnedNodes();
/**
* Puts value to cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to put in cache.
* @param val Value to put in cache.
* @return Whether value was actually put to cache.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> boolean put(K key, V val) throws GridClientException;
/**
* Asynchronously puts value to cache on remote node.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to put in cache.
* @param val Value to put in cache.
* @return Future whether value was actually put to cache.
*/
public <K, V> GridClientFuture<Boolean> putAsync(K key, V val);
/**
* Puts entries to cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param entries Entries to put in cache.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> void putAll(Map<K, V> entries) throws GridClientException;
/**
* Asynchronously puts entries to cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param entries Entries to put in cache.
* @return Future whether this operation completes.
*/
public <K, V> GridClientFuture<?> putAllAsync(Map<K, V> entries);
/**
* Gets value from cache on remote node.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to get from cache.
* @return Value for given key or {@code null} if no value was cached.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> V get(K key) throws GridClientException;
/**
* Asynchronously gets value from cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to get from cache.
* @return Future with value for given key or with {@code null} if no value was cached.
*/
public <K, V> GridClientFuture<V> getAsync(K key);
/**
* Gets entries from cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param keys Keys to get.
* @throws GridClientException In case of error.
* @return Entries retrieved from remote cache nodes.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> Map<K, V> getAll(Collection<K> keys) throws GridClientException;
/**
* Asynchronously gets entries from cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param keys Keys to get.
* @return Future with entries retrieved from remote cache nodes.
*/
public <K, V> GridClientFuture<Map<K, V>> getAllAsync(Collection<K> keys);
/**
* Removes value from cache on remote node.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to remove.
* @return Whether value was actually removed.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K> boolean remove(K key) throws GridClientException;
/**
* Asynchronously removes value from cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to remove.
* @return Future whether value was actually removed.
*/
public <K> GridClientFuture<Boolean> removeAsync(K key);
/**
* Removes entries from cache on remote node.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param keys Keys to remove.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K> void removeAll(Collection<K> keys) throws GridClientException;
/**
* Asynchronously removes entries from cache on remote grid.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote nodes on which these keys are supposed to be cached (unless
* some nodes were {@code pinned}). If entries do not map to one node, then the node
* which has most mapped entries will be contacted.
*
* @param keys Keys to remove.
* @return Future whether operation finishes.
*/
public <K> GridClientFuture<?> removeAllAsync(Collection<K> keys);
/**
* Replaces value in cache on remote grid only if there was a {@code non-null}
* value associated with this key.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to replace.
* @param val Value to replace.
* @return Whether value was actually replaced.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> boolean replace(K key, V val) throws GridClientException;
/**
* Asynchronously replaces value in cache on remote grid only if there was a {@code non-null}
* value associated with this key.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to replace.
* @param val Value to replace.
* @return Future whether value was actually replaced.
*/
public <K, V> GridClientFuture<Boolean> replaceAsync(K key, V val);
/**
* Sets entry value to {@code val1} if current value is {@code val2} with
* following conditions:
* <ul>
* <li>
* If {@code val1} is {@code null} and {@code val2} is equal to current value,
* entry is removed from cache.
* </li>
* <li>
* If {@code val2} is {@code null}, entry is created if it doesn't exist.
* </li>
* <li>
* If both {@code val1} and {@code val2} are {@code null}, entry is removed.
* </li>
* </ul>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to set.
* @param val1 Value to set.
* @param val2 Check value.
* @return Whether value of entry was changed.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public <K, V> boolean cas(K key, V val1, V val2) throws GridClientException;
/**
* Asynchronously sets entry value to {@code val1} if current value is {@code val2}
* with following conditions:
* <ul>
* <li>
* If {@code val1} is {@code null} and {@code val2} is equal to current value,
* entry is removed from cache.
* </li>
* <li>
* If {@code val2} is {@code null}, entry is created if it doesn't exist.
* </li>
* <li>
* If both {@code val1} and {@code val2} are {@code null}, entry is removed.
* </li>
* </ul>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to set.
* @param val1 Value to set.
* @param val2 Check value.
* @return Future whether value of entry was changed.
*/
public <K, V> GridClientFuture<Boolean> casAsync(K key, V val1, V val2);
/**
* Gets affinity node ID for provided key. This method will return {@code null} if no
* affinity was configured for the given cache for this client or there are no nodes in topology with
* cache enabled.
*
* @param key Key.
* @return Node ID.
* @throws GridClientException In case of error.
*/
public <K> UUID affinity(K key) throws GridClientException;
/**
* Fetches metrics for cache from remote grid.
*
* @return Cache metrics.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public GridClientDataMetrics metrics() throws GridClientException;
/**
* Asynchronously fetches metrics for cache from remote grid.
*
* @return Future with cache metrics.
*/
public GridClientFuture<GridClientDataMetrics> metricsAsync();
/**
* Tries to get metrics from local cache.
* <p>
* Local cache is updated on every {@link #metrics()} or {@link #metricsAsync()} call
* if {@link GridClientConfiguration#isEnableMetricsCache()} is enabled. If it is
* disabled then this method will always return {@code null}.
*
* @return Cached metrics or {@code null} if no cached metrics available.
* @throws GridClientException In case of error.
* @throws GridServerUnreachableException If none of the servers can be reached.
* @throws GridClientClosedException If client was closed manually.
*/
public GridClientDataMetrics cachedMetrics() throws GridClientException;
/**
* Append requested value to already cached one. This method supports work with strings, lists and maps.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to manipulate cache value for.
* @param val Value to append to the cached one.
* @return Whether value of entry was changed.
* @throws GridClientException In case of error.
*/
public <K, V> boolean append(K key, V val) throws GridClientException;
/**
* Append requested value to already cached one. This method supports work with strings, lists and maps.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to manipulate cache value for.
* @param val Value to append to the cached one.
* @return Future whether value of entry was changed.
* @throws GridClientException In case of error.
*/
public <K, V> GridClientFuture<Boolean> appendAsync(K key, V val) throws GridClientException;
/**
* Prepend requested value to already cached one. This method supports work with strings, lists and maps.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to manipulate cache value for.
* @param val Value to prepend to the cached one.
* @return Whether value of entry was changed.
* @throws GridClientException In case of error.
*/
public <K, V> boolean prepend(K key, V val) throws GridClientException;
/**
* Prepend requested value to already cached one. This method supports work with strings, lists and maps.
* <p>
* Note that this operation is affinity-aware and will immediately contact
* exactly the remote node on which this key is supposed to be cached (unless
* some nodes were {@code pinned}).
*
* @param key Key to manipulate cache value for.
* @param val Value to prepend to the cached one.
* @return Future whether value of entry was changed.
* @throws GridClientException In case of error.
*/
public <K, V> GridClientFuture<Boolean> prependAsync(K key, V val) throws GridClientException;
/**
* Gets cache flags enabled on this data projection.
*
* @return Flags for this data projection (empty set if no flags have been set).
*/
public Set<GridClientCacheFlag> flags();
/**
* Creates new client data object with enabled cache flags.
*
* @param flags Optional cache flags to be enabled.
* @return New client data object.
* @throws GridClientException In case of error.
*/
public GridClientData flagsOn(GridClientCacheFlag... flags) throws GridClientException;
/**
* Creates new client data object with disabled cache flags.
*
* @param flags Cache flags to be disabled.
* @return New client data object.
* @throws GridClientException In case of error.
*/
public GridClientData flagsOff(GridClientCacheFlag... flags) throws GridClientException;
}