/** {@inheritDoc} */ @Override public Map<K, V> peekAll( @Nullable Collection<? extends K> keys, @Nullable GridPredicate<? super GridCacheEntry<K, V>>[] filter) { if (keys == null || keys.isEmpty()) return emptyMap(); final Collection<K> skipped = new GridLeanSet<K>(); final Map<K, V> map = peekAll0(keys, filter, skipped); if (map.size() + skipped.size() != keys.size()) { map.putAll( dht.peekAll( F.view( keys, new P1<K>() { @Override public boolean apply(K k) { return !map.containsKey(k) && !skipped.contains(k); } }), filter)); } return map; }
/** {@inheritDoc} */ @Override public void stopListenAsync(@Nullable GridInClosure<? super GridFuture<R>>... lsnr) { if (F.isEmpty(lsnr)) synchronized (mux) { lsnrs.clear(); } else synchronized (mux) { lsnrs.removeAll(F.asList(lsnr)); } }
/** * Creates signature for data. * * @param alg Algorithm. * @param prv Provider. * @param key Private key. * @param data Data. * @return Signature. * @throws GeneralSecurityException If any exception occurs while signature creation. */ public static byte[] createSignature(String alg, String prv, PrivateKey key, byte[] data) throws GeneralSecurityException { assert !F.isEmpty(alg); assert !F.isEmpty(prv); assert key != null; assert data != null; Signature sign = Signature.getInstance(alg, prv); sign.initSign(key); sign.update(data); return sign.sign(); }
/** {@inheritDoc} */ @Override public GridDeployment getDeployment(final GridUuid ldrId) { synchronized (mux) { return F.find( F.flat(cache.values()), null, new P1<SharedDeployment>() { @Override public boolean apply(SharedDeployment d) { return d.classLoaderId().equals(ldrId); } }); } }
/** * Executes example. * * @param args Command line arguments, none required. */ public static void main(String[] args) { // Typedefs: // --------- // G -> GridFactory // CI1 -> GridInClosure // CO -> GridOutClosure // CA -> GridAbsClosure // F -> GridFunc // Data initialisation. Random rand = new Random(); final int size = 20; Collection<Integer> nums = new ArrayList<Integer>(size); // Generate list of random integers. for (int i = 0; i < size; i++) { nums.add(rand.nextInt(size)); } // Print generated list. X.println("Generated list:"); F.forEach(nums, F.<Integer>print("", " ")); // Get new unmodifiable collection with elements which value low than half generated list size. Collection<Integer> view = F.view( nums, new P1<Integer>() { @Override public boolean apply(Integer i) { return i < size / 2; } }); // Print result. X.println("\nResult list:"); F.forEach(view, F.<Integer>print("", " ")); // Check for read only. try { view.add(12); } catch (Exception ignored) { X.println("\nView is read only."); } }
/** * Prints a phrase on the grid nodes running anonymous closure objects and calculating total * number of letters. * * @param phrase Phrase to print on of the grid nodes. * @throws GridException If failed. */ private static void countLettersClosure(String phrase) throws GridException { X.println(">>> Starting countLettersClosure() example..."); // Explicitly execute the collection of callable objects and receive a result. Collection<Integer> results = G.grid() .call( SPREAD, new GridClosure<String, Integer>() { // Create executable logic. @Override public Integer apply(String word) { // Print out a given word, just so we can // see which node is doing what. X.println(">>> Executing word: " + word); // Return the length of a given word, i.e. number of letters. return word.length(); } }, Arrays.asList(phrase.split(" "))); // Collection of arguments for closures. // Add up all results using convenience 'sum()' method. int letterCnt = F.sum(results); X.println(">>>"); X.println(">>> Finished execution of counting letters with closure based on GridGain 3.0 API."); X.println(">>> You should see the phrase '" + phrase + "' printed out on the nodes."); X.println(">>> Total number of letters in the phrase is '" + letterCnt + "'."); X.println(">>> Check all nodes for output (this node is also part of the grid)."); X.println(">>>"); }
/** * Prints a phrase on the grid nodes running anonymous callable objects and calculating total * number of letters. * * @param phrase Phrase to print on of the grid nodes. * @throws GridException If failed. */ private static void countLettersCallable(String phrase) throws GridException { X.println(">>> Starting countLettersCallable() example..."); Collection<Callable<Integer>> calls = new HashSet<Callable<Integer>>(); for (final String word : phrase.split(" ")) calls.add( new GridCallable<Integer>() { // Create executable logic. @Override public Integer call() throws Exception { // Print out a given word, just so we can // see which node is doing what. X.println(">>> Executing word: " + word); // Return the length of a given word, i.e. number of letters. return word.length(); } }); // Explicitly execute the collection of callable objects and receive a result. Collection<Integer> results = G.grid().call(SPREAD, calls); // Add up all results using convenience 'sum()' method on GridFunc class. int letterCnt = F.sum(results); X.println(">>>"); X.println( ">>> Finished execution of counting letters with callables based on GridGain 3.0 API."); X.println(">>> You should see the phrase '" + phrase + "' printed out on the nodes."); X.println(">>> Total number of letters in the phrase is '" + letterCnt + "'."); X.println(">>> Check all nodes for output (this node is also part of the grid)."); X.println(">>>"); }
/** * Prints every word a phrase on different nodes. * * @param phrase Phrase from which to print words on different nodes. * @throws GridException If failed. */ private static void spreadWordsClosure(String phrase) throws GridException { X.println(">>> Starting spreadWordsClosure() example..."); // Splits the passed in phrase into words and prints every word // on a individual grid node. If there are more words than nodes - // some nodes will print more than one word. G.grid() .run( SPREAD, F.yield( phrase.split(" "), new GridInClosure<String>() { @Override public void apply(String word) { X.println(word); } })); // NOTE: // // Alternatively, you can use existing closure 'F.println()' to // print any yield result in 'F.yield()' like so: // // G.grid().run(SPREAD, F.yield(phrase.split(" "), F.println())); // X.println(">>>"); X.println( ">>> Finished printing individual words on different nodes based on GridGain 3.0 API."); X.println(">>> Check all nodes for output (this node is also part of the grid)."); X.println(">>>"); }
/** {@inheritDoc} */ @Override public Map<K, V> peekAll( @Nullable Collection<? extends K> keys, @Nullable Collection<GridCachePeekMode> modes) throws GridException { if (keys == null || keys.isEmpty()) return emptyMap(); final Collection<K> skipped = new GridLeanSet<K>(); final Map<K, V> map = !modes.contains(PARTITIONED_ONLY) ? peekAll0(keys, modes, ctx.tm().localTxx(), skipped) : new GridLeanMap<K, V>(0); if (map.size() != keys.size() && !modes.contains(NEAR_ONLY)) { map.putAll( dht.peekAll( F.view( keys, new P1<K>() { @Override public boolean apply(K k) { return !map.containsKey(k) && !skipped.contains(k); } }), modes)); } return map; }
/** {@inheritDoc} */ @Override public V unswap(K key) throws GridException { ctx.denyOnFlags(F.asList(READ, SKIP_SWAP)); // Unswap only from DHT. Near cache does not have swap storage. return dht.unswap(key); }
/** {@inheritDoc} */ @Override public boolean apply(@Nullable T1 t1, @Nullable T2 t2) { lazyCompile(); if (expr != null) { JexlContext ctx = new MapContext(); ctx.set(var1, t1); ctx.set(var2, t2); for (Map.Entry<String, Object> e : map.entrySet()) { ctx.set(e.getKey(), e.getValue()); } try { Object obj = expr.evaluate(ctx); if (obj instanceof Boolean) { return (Boolean) obj; } } catch (Exception ex) { throw F.wrap(ex); } } return false; }
/** * @param mapping Mapping to order. * @param committedVers Committed versions. * @param rolledbackVers Rolled back versions. */ void orderCompleted( GridDistributedTxMapping<K, V> mapping, Collection<GridCacheVersion> committedVers, Collection<GridCacheVersion> rolledbackVers) { for (GridCacheTxEntry<K, V> txEntry : F.concat(false, mapping.reads(), mapping.writes())) { while (true) { GridDistributedCacheEntry<K, V> entry = (GridDistributedCacheEntry<K, V>) txEntry.cached(); try { // Handle explicit locks. GridCacheVersion base = txEntry.explicitVersion() != null ? txEntry.explicitVersion() : xidVer; entry.doneRemote(xidVer, base, committedVers, rolledbackVers); if (ec()) entry.recheck(); break; } catch (GridCacheEntryRemovedException ignored) { assert entry.obsoleteVersion() != null; if (log.isDebugEnabled()) log.debug( "Replacing obsolete entry in remote transaction [entry=" + entry + ", tx=" + this + ']'); // Replace the entry. txEntry.cached(cctx.cache().entryEx(txEntry.key()), entry.keyBytes()); } } } }
/** * Verifies signature for data. * * @param alg Algorithm. * @param prv Provider. * @param key Public key. * @param data Data. * @param sign Signature. * @return {@code true} if signature was verified, {@code false} - otherwise. * @throws GeneralSecurityException If any exception occurs while verifying. */ public static boolean verifySignature( String alg, String prv, PublicKey key, byte[] data, byte[] sign) throws GeneralSecurityException { assert !F.isEmpty(alg); assert !F.isEmpty(prv); assert key != null; assert data != null; assert sign != null; Signature sign0 = Signature.getInstance(alg, prv); sign0.initVerify(key); sign0.update(data); return sign0.verify(sign); }
/** {@inheritDoc} */ @Override public <T> T affinityKey() { try { return (T) job.getDeployment().annotatedValue(job.getJob(), GridCacheAffinityMapped.class); } catch (GridException e) { throw F.wrap(e); } }
/** {@inheritDoc} */ @Override public String cacheName() { try { return (String) job.getDeployment().annotatedValue(job.getJob(), GridCacheName.class); } catch (GridException e) { throw F.wrap(e); } }
/** {@inheritDoc} */ @Override public R apply() { try { return applyx(); } catch (GridException e) { throw F.wrap(e); } }
/** {@inheritDoc} */ @Override public boolean apply() { try { return applyx(); } catch (GridException ex) { throw F.wrap(ex); } }
/** * @param id ID. * @param name Name. * @param age Age. * @param orgId Organization ID. */ private Person(int id, String name, int age, int orgId) { assert !F.isEmpty(name); assert age > 0; assert orgId > 0; this.id = id; this.name = name; this.age = age; this.orgId = orgId; }
/** * @param keys Keys. * @param timeout Timeout. * @param tx Transaction. * @param filter Filter. * @return Future. */ public GridFuture<Boolean> lockAllAsync( Collection<? extends K> keys, long timeout, @Nullable GridCacheTxLocalEx<K, V> tx, GridPredicate<? super GridCacheEntry<K, V>>[] filter) { if (F.isEmpty(keys)) { return new GridFinishedFuture<Boolean>(ctx.kernalContext(), true); } GridLocalLockFuture<K, V> fut = new GridLocalLockFuture<K, V>(ctx, keys, tx, this, timeout, filter); try { for (K key : keys) { while (true) { GridLocalCacheEntry<K, V> entry = null; try { entry = entryExx(key); if (!ctx.isAll(entry, filter)) { fut.onFailed(); return fut; } // Removed exception may be thrown here. GridCacheMvccCandidate<K> cand = fut.addEntry(entry); if (cand == null && fut.isDone()) { return fut; } break; } catch (GridCacheEntryRemovedException ignored) { if (log().isDebugEnabled()) { log().debug("Got removed entry in lockAsync(..) method (will retry): " + entry); } } } } if (!ctx.mvcc().addFuture(fut)) fut.onError(new GridException("Duplicate future ID (internal error): " + fut)); // Must have future added prior to checking locks. fut.checkLocks(); return fut; } catch (GridException e) { fut.onError(e); return fut; } }
/** * Executes example. * * @param args Command line arguments, none required. */ public static void main(String[] args) { // Typedefs: // --------- // G -> GridFactory // CI1 -> GridInClosure // CO -> GridOutClosure // CA -> GridAbsClosure // F -> GridFunc // Data initialisation. Random rand = new Random(); final int size = 20; Collection<Integer> nums = new ArrayList<Integer>(size); // Generate list of random integers. for (int i = 0; i < size; i++) { nums.add(rand.nextInt(size)); } // Print generated list. X.println("Generated list:"); F.forEach(nums, F.<Integer>print("", " ")); // Retain all elements which value low than half generated list size. Collection<Integer> res = F.retain( nums, true, new P1<Integer>() { @Override public boolean apply(Integer i) { return i < size / 2; } }); // Print result. X.println("\nResult list:"); F.forEach(res, F.<Integer>print("", " ")); // Retain first half of result list. F.retain(res, false, res.size() / 2); // Print result. X.println("\nResult list:"); F.forEach(res, F.<Integer>print("", " ")); }
/** {@inheritDoc} */ @Override public Iterator<GridCacheEntry<K, V>> iterator() { return new EntryIterator( nearSet.iterator(), F.iterator0( dhtSet, false, new P1<GridCacheEntry<K, V>>() { @Override public boolean apply(GridCacheEntry<K, V> e) { return !GridNearCache.super.containsKey(e.getKey(), null); } })); }
/** @return Involved nodes. */ @Override public Collection<? extends GridNode> nodes() { return F.viewReadOnly( futures(), new GridClosure<GridFuture<?>, GridRichNode>() { @Nullable @Override public GridRichNode apply(GridFuture<?> f) { if (isMini(f)) return ((MiniFuture) f).node(); return cctx.rich().rich(cctx.discovery().localNode()); } }); }
/** @param mappings Mappings. */ void addEntryMapping(@Nullable Map<UUID, GridDistributedTxMapping<K, V>> mappings) { if (!F.isEmpty(mappings)) { this.mappings.putAll(mappings); if (log.isDebugEnabled()) log.debug( "Added mappings to transaction [locId=" + cctx.nodeId() + ", mappings=" + mappings + ", tx=" + this + ']'); } }
/** {@inheritDoc} */ @Override public GridFuture<Map<K, V>> getAllAsync( @Nullable Collection<? extends K> keys, @Nullable GridPredicate<? super GridCacheEntry<K, V>>[] filter) { ctx.denyOnFlag(LOCAL); if (F.isEmpty(keys)) return new GridFinishedFuture<Map<K, V>>(ctx.kernalContext(), Collections.<K, V>emptyMap()); GridCacheTxLocalAdapter<K, V> tx = ctx.tm().threadLocalTx(); if (tx != null && !tx.implicit()) return ctx.wrapCloneMap(tx.getAllAsync(keys, filter)); return loadAsync(keys, false, filter); }
/** * @param ldr Loader. * @param nodeId Sender node ID. * @param req Request. * @return Remote transaction. * @throws GridException If failed. */ @Nullable public GridNearTxRemote<K, V> startRemoteTx( ClassLoader ldr, UUID nodeId, GridDhtTxPrepareRequest<K, V> req) throws GridException { if (!F.isEmpty(req.nearWrites())) { GridNearTxRemote<K, V> tx = new GridNearTxRemote<K, V>( ldr, nodeId, req.nearNodeId(), req.threadId(), req.version(), req.commitVersion(), req.concurrency(), req.isolation(), req.isInvalidate(), req.timeout(), req.nearWrites(), ctx); if (!tx.empty()) { tx = ctx.tm().onCreated(tx); if (tx == null || !ctx.tm().onStarted(tx)) throw new GridCacheTxRollbackException("Attempt to start a completed transaction: " + tx); // Prepare prior to reordering, so the pending locks added // in prepare phase will get properly ordered as well. tx.prepare(); // Add remote candidates and reorder completed and uncompleted versions. tx.addRemoteCandidates( req.candidatesByKey(), req.committedVersions(), req.rolledbackVersions()); if (req.concurrency() == EVENTUALLY_CONSISTENT) { if (log.isDebugEnabled()) log.debug("Committing transaction during remote prepare: " + tx); tx.commit(); if (log.isDebugEnabled()) log.debug("Committed transaction during remote prepare: " + tx); } } return tx; } return null; }
/** * @param keys Keys to load. * @param reload Reload flag. * @param filter Filter. * @return Loaded values. */ public GridFuture<Map<K, V>> loadAsync( @Nullable Collection<? extends K> keys, boolean reload, @Nullable GridPredicate<? super GridCacheEntry<K, V>>[] filter) { if (F.isEmpty(keys)) return new GridFinishedFuture<Map<K, V>>(ctx.kernalContext(), Collections.<K, V>emptyMap()); GridNearGetFuture<K, V> fut = new GridNearGetFuture<K, V>(ctx, keys, reload, null, filter); // Register future for responses. ctx.mvcc().addFuture(fut); fut.init(); return ctx.wrapCloneMap(fut); }
/** * @param cctx Context. * @param tx Transaction. * @param commit Commit flag. */ public GridNearTxFinishFuture( GridCacheContext<K, V> cctx, GridNearTxLocal<K, V> tx, boolean commit) { super(cctx.kernalContext(), F.<GridCacheTx>identityReducer(tx)); assert cctx != null; this.cctx = cctx; this.tx = tx; this.commit = commit; mappings = tx.mappings(); futId = GridUuid.randomUuid(); log = U.logger(ctx, logRef, GridNearTxFinishFuture.class); }
/** * @param keyBytes Key to remove. * @return {@code true} if value was actually removed, {@code false} otherwise. * @throws GridException If failed. */ @SuppressWarnings({"unchecked"}) @Nullable GridCacheSwapEntry<V> readAndRemove(byte[] keyBytes) throws GridException { if (!enabled) return null; final GridTuple<GridSwapByteArray> t = F.t1(); swapMgr.remove( spaceName, new GridSwapByteArray(keyBytes), new CI1<GridSwapByteArray>() { @Override public void apply(GridSwapByteArray removed) { t.set(removed); } }); if (t.get() == null) return null; // To unmarshal swap entry itself local class loader will be enough. return recreateEntry((GridCacheSwapEntry<V>) unmarshal(t.get(), cctx.deploy().localLoader())); }
/** * Removes locks regardless of whether they are owned or not for given version and keys. * * @param ver Lock version. * @param keys Keys. */ @SuppressWarnings({"unchecked"}) public void removeLocks(GridCacheVersion ver, Collection<? extends K> keys) { if (keys.isEmpty()) return; try { Collection<GridRichNode> affNodes = null; int keyCnt = -1; Map<GridNode, GridNearUnlockRequest<K, V>> map = null; for (K key : keys) { // Send request to remove from remote nodes. GridNearUnlockRequest<K, V> req = null; while (true) { GridDistributedCacheEntry<K, V> entry = peekExx(key); try { if (entry != null) { GridCacheMvccCandidate<K> cand = entry.candidate(ver); if (cand != null) { if (affNodes == null) { affNodes = CU.allNodes(ctx, cand.topologyVersion()); keyCnt = (int) Math.ceil((double) keys.size() / affNodes.size()); map = new HashMap<GridNode, GridNearUnlockRequest<K, V>>(affNodes.size()); } GridRichNode primary = CU.primary0(ctx.affinity(key, affNodes)); if (!primary.isLocal()) { req = map.get(primary); if (req == null) { map.put(primary, req = new GridNearUnlockRequest<K, V>(keyCnt)); req.version(ver); } } // Remove candidate from local node first. if (entry.removeLock(cand.version())) { if (primary.isLocal()) { dht.removeLocks(primary.id(), ver, F.asList(key), true); assert req == null; continue; } req.addKey(entry.key(), entry.getOrMarshalKeyBytes(), ctx); } } } break; } catch (GridCacheEntryRemovedException ignored) { if (log.isDebugEnabled()) log.debug( "Attempted to remove lock from removed entry (will retry) [rmvVer=" + ver + ", entry=" + entry + ']'); } } } if (map == null || map.isEmpty()) return; Collection<GridCacheVersion> committed = ctx.tm().committedVersions(ver); Collection<GridCacheVersion> rolledback = ctx.tm().rolledbackVersions(ver); for (Map.Entry<GridNode, GridNearUnlockRequest<K, V>> mapping : map.entrySet()) { GridNode n = mapping.getKey(); GridDistributedUnlockRequest<K, V> req = mapping.getValue(); if (!req.keyBytes().isEmpty()) { req.completedVersions(committed, rolledback); // We don't wait for reply to this message. ctx.io().send(n, req); } } } catch (GridException ex) { U.error(log, "Failed to unlock the lock for keys: " + keys, ex); } }
/** * @param e Transaction entry. * @return {@code True} if entry is locally mapped as a primary or back up node. */ protected boolean isNearLocallyMapped(GridCacheEntryEx<K, V> e) { return F.contains(ctx.affinity(e.key(), CU.allNodes(ctx)), ctx.localNode()); }