/** * @param node Node. * @param part Partition number to check. * @param topVer Topology version. * @return {@code true} if given partition belongs to specified node. */ public boolean partitionBelongs(ClusterNode node, int part, AffinityTopologyVersion topVer) { assert node != null; assert part >= 0 : "Invalid partition: " + part; return nodesByPartition(part, topVer).contains(node); }
/** * @param part Partition. * @param topVer Topology version. * @return Primary node for given key. */ @Nullable public ClusterNode primaryByPartition(int part, AffinityTopologyVersion topVer) { List<ClusterNode> nodes = nodesByPartition(part, topVer); if (nodes.isEmpty()) return null; return nodes.get(0); }
/** * @param n Node to check. * @param part Partition. * @param topVer Topology version. * @return {@code True} if checked node is a backup node for given partition. */ public boolean backupByPartition(ClusterNode n, int part, AffinityTopologyVersion topVer) { List<ClusterNode> nodes = nodesByPartition(part, topVer); assert !F.isEmpty(nodes); return nodes.indexOf(n) > 0; }
/** * @param key Key. * @param topVer Topology version. * @return Affinity nodes. */ public List<ClusterNode> nodesByKey(Object key, AffinityTopologyVersion topVer) { return nodesByPartition(partition(key), topVer); }
/** * @param part Partition number to check. * @param topVer Topology version. * @return {@code true} if given partition belongs to local node. */ public boolean partitionLocalNode(int part, AffinityTopologyVersion topVer) { assert part >= 0 : "Invalid partition: " + part; return nodesByPartition(part, topVer).contains(cctx.localNode()); }
/** * @param part Partition. * @param topVer Topology version. * @return Backup nodes. */ private Collection<ClusterNode> backupsByPartition(int part, AffinityTopologyVersion topVer) { List<ClusterNode> nodes = nodesByPartition(part, topVer); assert !F.isEmpty(nodes); if (nodes.size() == 1) return Collections.emptyList(); return F.view(nodes, F.notEqualTo(nodes.get(0))); }
/** {@inheritDoc} */ @Override public Collection<ClusterNode> mapKeyToPrimaryAndBackups(K key) { A.notNull(key, "key"); return cctx.affinity().nodesByPartition(partition(key), topologyVersion()); }
/** {@inheritDoc} */ @Override public Collection<ClusterNode> mapPartitionToPrimaryAndBackups(int part) { A.ensure(part >= 0 && part < partitions(), "part >= 0 && part < total partitions"); return cctx.affinity().nodesByPartition(part, topologyVersion()); }
/** {@inheritDoc} */ @Override public int[] allPartitions(ClusterNode n) { A.notNull(n, "p"); Collection<Integer> parts = new HashSet<>(); AffinityTopologyVersion topVer = topologyVersion(); for (int partsCnt = partitions(), part = 0; part < partsCnt; part++) { for (ClusterNode affNode : cctx.affinity().nodesByPartition(part, topVer)) { if (n.id().equals(affNode.id())) { parts.add(part); break; } } } return U.toIntArray(parts); }
for (ClusterNode node : aff.nodesByPartition(partId, topVer)) { Map<Integer, T2<Long, Long>> map = initUpdCntrsPerNode.get(node.id());
/** {@inheritDoc} */ @Override public ClusterNode mapPartitionToNode(int part) { A.ensure(part >= 0 && part < partitions(), "part >= 0 && part < total partitions"); return F.first(cctx.affinity().nodesByPartition(part, topologyVersion())); }
/** * @param topVer Topology version. * @return Nodes where set data request should be sent. * @throws IgniteCheckedException If all cache nodes left grid. */ private Collection<ClusterNode> dataNodes(AffinityTopologyVersion topVer) throws IgniteCheckedException { assert ctx.isPartitioned() || collocated : "Non-collocated mode is supported only for PARTITIONED caches."; if (ctx.isLocal() || (ctx.isReplicated() && ctx.affinityNode())) return Collections.singleton(ctx.localNode()); Collection<ClusterNode> nodes; if (collocated) { List<ClusterNode> nodes0 = ctx.affinity().nodesByPartition(hdrPart, topVer); nodes = !nodes0.isEmpty() ? Collections.singleton(nodes0.contains(ctx.localNode()) ? ctx.localNode() : F.first(nodes0)) : nodes0; } else nodes = CU.affinityNodes(ctx, topVer); if (nodes.isEmpty()) throw new IgniteCheckedException("Failed to get set data, all cache nodes left grid."); return nodes; }
/** * @param topVer Topology version. * @return Primary node or {@code null} if future was completed. */ @Nullable private ClusterNode mapKeyToNode(AffinityTopologyVersion topVer) { int part = cctx.affinity().partition(key); List<ClusterNode> affNodes = cctx.affinity().nodesByPartition(part, topVer); // Failed if none affinity node found by assigment. if (affNodes.isEmpty()) { onDone(serverNotFoundError(part, topVer)); return null; } // Try to read key localy if we can. if (tryLocalGet(key, part, topVer, affNodes)) return null; ClusterNode affNode = cctx.selectAffinityNodeBalanced(affNodes, getInvalidNodes(), part, canRemap); // Failed if none balanced node found. if (affNode == null) { onDone(serverNotFoundError(part, topVer)); return null; } return affNode; }
int part = cctx.affinity().partition(key); List<ClusterNode> affNodes = cctx.affinity().nodesByPartition(part, topVer);
int part = cctx.affinity().partition(key); List<ClusterNode> affNodes = cctx.affinity().nodesByPartition(part, topVer);
/** * @param e Transaction entry. * @param primaryOnly Flag to include backups into check or not. * @return {@code True} if entry is locally mapped as a primary or back up node. */ protected boolean isNearLocallyMapped(IgniteTxEntry e, boolean primaryOnly) { GridCacheContext cacheCtx = e.context(); if (!cacheCtx.isNear()) return false; // Try to take either entry-recorded primary node ID, // or transaction node ID from near-local transactions. UUID nodeId = e.nodeId() == null ? local() ? this.nodeId : null : e.nodeId(); if (nodeId != null && nodeId.equals(cctx.localNodeId())) return true; GridCacheEntryEx cached = e.cached(); int part = cached != null ? cached.partition() : cacheCtx.affinity().partition(e.key()); List<ClusterNode> affNodes = cacheCtx.affinity().nodesByPartition(part, topologyVersion()); e.locallyMapped(F.contains(affNodes, cctx.localNode())); if (primaryOnly) { ClusterNode primary = F.first(affNodes); if (primary == null && !cacheCtx.affinityNode()) return false; assert primary != null : "Primary node is null for affinity nodes: " + affNodes; return primary.isLocal(); } else return e.locallyMapped(); }
/** * @param node Node. * @param part Partition number to check. * @param topVer Topology version. * @return {@code true} if given partition belongs to specified node. */ public boolean partitionBelongs(ClusterNode node, int part, AffinityTopologyVersion topVer) { assert node != null; assert part >= 0 : "Invalid partition: " + part; return nodesByPartition(part, topVer).contains(node); }
/** * @param part Partition number to check. * @param topVer Topology version. * @return {@code true} if given partition belongs to local node. */ public boolean partitionLocalNode(int part, AffinityTopologyVersion topVer) { assert part >= 0 : "Invalid partition: " + part; return nodesByPartition(part, topVer).contains(cctx.localNode()); }
/** {@inheritDoc} */ @Override public Collection<ClusterNode> mapPartitionToPrimaryAndBackups(int part) { A.ensure(part >= 0 && part < partitions(), "part >= 0 && part < total partitions"); return cctx.affinity().nodesByPartition(part, topologyVersion()); }
/** {@inheritDoc} */ @Override public ClusterNode mapPartitionToNode(int part) { A.ensure(part >= 0 && part < partitions(), "part >= 0 && part < total partitions"); return F.first(cctx.affinity().nodesByPartition(part, topologyVersion())); }