/** * For all remote candidates standing behind the candidate being salvaged marks their transactions * as system invalidate and marks these candidates as owned and used. * * @param ver Version to salvage. */ public void salvageRemote(GridCacheVersion ver) { assert ver != null; GridCacheMvccCandidate cand = candidate(rmts, ver); if (cand != null) { assert rmts != null; assert !rmts.isEmpty(); for (Iterator<GridCacheMvccCandidate> iter = rmts.iterator(); iter.hasNext(); ) { GridCacheMvccCandidate rmt = iter.next(); // For salvaged candidate doneRemote will be called explicitly. if (rmt == cand) break; // Only Near and DHT remote candidates should be released. assert !rmt.nearLocal(); IgniteInternalTx tx = cctx.tm().tx(rmt.version()); if (tx != null) { tx.systemInvalidate(true); rmt.setOwner(); rmt.setUsed(); } else iter.remove(); } } }
/** * @param tx Cache transaction. * @param reads Read entries. * @param writes Write entries. * @param grpLockKey Group lock key. * @param partLock {@code True} if preparing group-lock transaction with partition lock. * @param txNodes Transaction nodes mapping. * @param onePhaseCommit One phase commit flag. */ public GridDistributedTxPrepareRequest( IgniteInternalTx tx, @Nullable Collection<IgniteTxEntry> reads, Collection<IgniteTxEntry> writes, IgniteTxKey grpLockKey, boolean partLock, Map<UUID, Collection<UUID>> txNodes, boolean onePhaseCommit) { super(tx.xidVersion(), 0); writeVer = tx.writeVersion(); threadId = tx.threadId(); concurrency = tx.concurrency(); isolation = tx.isolation(); timeout = tx.timeout(); invalidate = tx.isInvalidate(); txSize = tx.size(); sys = tx.system(); plc = tx.ioPolicy(); this.reads = reads; this.writes = writes; this.grpLockKey = grpLockKey; this.partLock = partLock; this.txNodes = txNodes; this.onePhaseCommit = onePhaseCommit; }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public boolean addAll(final Collection<? extends T> items) { A.notNull(items, "items"); try { boolean retVal; int cnt = 0; while (true) { try (IgniteInternalTx tx = cache.txStartEx(PESSIMISTIC, REPEATABLE_READ)) { Long idx = (Long) cache.invoke(queueKey, new AddProcessor(id, items.size())).get(); if (idx != null) { checkRemoved(idx); Map<GridCacheQueueItemKey, T> putMap = new HashMap<>(); for (T item : items) { putMap.put(itemKey(idx), item); idx++; } cache.putAll(putMap); retVal = true; } else retVal = false; tx.commit(); break; } catch (ClusterTopologyCheckedException e) { if (e instanceof ClusterGroupEmptyCheckedException) throw e; if (cnt++ == MAX_UPDATE_RETRIES) throw e; else { U.warn(log, "Failed to add item, will retry [err=" + e + ']'); U.sleep(RETRY_DELAY); } } } return retVal; } catch (IgniteCheckedException e) { throw U.convertException(e); } }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public boolean offer(final T item) throws IgniteException { A.notNull(item, "item"); try { boolean retVal; int cnt = 0; while (true) { try { try (IgniteInternalTx tx = cache.txStartEx(PESSIMISTIC, REPEATABLE_READ)) { Long idx = (Long) cache.invoke(queueKey, new AddProcessor(id, 1)).get(); if (idx != null) { checkRemoved(idx); cache.getAndPut(itemKey(idx), item); retVal = true; } else retVal = false; tx.commit(); break; } } catch (ClusterTopologyCheckedException e) { if (e instanceof ClusterGroupEmptyCheckedException) throw e; if (cnt++ == MAX_UPDATE_RETRIES) throw e; else { U.warn(log, "Failed to add item, will retry [err=" + e + ']'); U.sleep(RETRY_DELAY); } } } return retVal; } catch (IgniteCheckedException e) { throw U.convertException(e); } }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Nullable @Override public T poll() throws IgniteException { try { int cnt = 0; T retVal; while (true) { try (IgniteInternalTx tx = cache.txStartEx(PESSIMISTIC, REPEATABLE_READ)) { Long idx = (Long) cache.invoke(queueKey, new PollProcessor(id)).get(); if (idx != null) { checkRemoved(idx); retVal = (T) cache.getAndRemove(itemKey(idx)); assert retVal != null : idx; } else retVal = null; tx.commit(); break; } catch (ClusterTopologyCheckedException e) { if (e instanceof ClusterGroupEmptyCheckedException) throw e; if (cnt++ == MAX_UPDATE_RETRIES) throw e; else { U.warn(log, "Failed to add item, will retry [err=" + e + ']'); U.sleep(RETRY_DELAY); } } } return retVal; } catch (IgniteCheckedException e) { throw U.convertException(e); } }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override protected void removeItem(final long rmvIdx) throws IgniteCheckedException { try { int cnt = 0; while (true) { try (IgniteInternalTx tx = cache.txStartEx(PESSIMISTIC, REPEATABLE_READ)) { Long idx = (Long) cache.invoke(queueKey, new RemoveProcessor(id, rmvIdx)).get(); if (idx != null) { checkRemoved(idx); boolean rmv = cache.remove(itemKey(idx)); assert rmv : idx; } tx.commit(); break; } catch (ClusterTopologyCheckedException e) { if (e instanceof ClusterGroupEmptyCheckedException) throw e; if (cnt++ == MAX_UPDATE_RETRIES) throw e; else { U.warn(log, "Failed to add item, will retry [err=" + e + ']'); U.sleep(RETRY_DELAY); } } } } catch (IgniteCheckedException e) { throw U.convertException(e); } }