/** * @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()); } } } }
/** @param keyMap Key map to register. */ void addKeyMapping(Map<GridRichNode, Collection<K>> keyMap) { for (Map.Entry<GridRichNode, Collection<K>> mapping : keyMap.entrySet()) { GridRichNode n = mapping.getKey(); for (K key : mapping.getValue()) { GridCacheTxEntry<K, V> txEntry = txMap.get(key); assert txEntry != null; GridDistributedTxMapping<K, V> m = mappings.get(n.id()); if (m == null) mappings.put(n.id(), m = new GridDistributedTxMapping<K, V>(n)); txEntry.nodeId(n.id()); m.add(txEntry); } } if (log.isDebugEnabled()) log.debug( "Added mappings to transaction [locId=" + cctx.nodeId() + ", mappings=" + keyMap + ", tx=" + this + ']'); }
/** * @param nodeId Node ID. * @param dhtVer DHT version. */ void addDhtVersion(UUID nodeId, GridCacheVersion dhtVer) { // This step is very important as near and DHT versions grow separately. cctx.versions().onReceived(nodeId, dhtVer); GridDistributedTxMapping<K, V> m = mappings.get(nodeId); if (m != null) m.dhtVersion(dhtVer); }
/** * @param nodeId Node ID to mark with explicit lock. * @return {@code True} if mapping was found. */ boolean markExplicit(UUID nodeId) { GridDistributedTxMapping<K, V> m = mappings.get(nodeId); if (m != null) { m.markExplicitLock(); return true; } return false; }
/** * @param nodeId Node ID. * @param key Key. */ public void removeMapping(UUID nodeId, K key) { GridDistributedTxMapping<K, V> m = mappings.get(nodeId); if (m != null) { GridCacheTxEntry<K, V> txEntry = txMap.get(key); if (txEntry != null) m.removeEntry(txEntry); if (m.empty()) mappings.remove(nodeId); } }