/** * Get affinity assignment for the given topology version. * * @param topVer Topology version. * @return Affinity assignment. */ public AffinityAssignment assignment(AffinityTopologyVersion topVer) { return assignment(topVer, cctx.shared().exchange().lastAffinityChangedTopologyVersion(topVer)); }
/** * Get cached affinity for specified topology version. * * @param topVer Topology version. * @return Cached affinity. */ public AffinityAssignment cachedAffinity(AffinityTopologyVersion topVer) { AffinityTopologyVersion lastAffChangeTopVer = ctx.cache().context().exchange().lastAffinityChangedTopologyVersion(topVer); return cachedAffinity(topVer, lastAffChangeTopVer); }
ctx.cache().context().exchange().lastAffinityChangedTopologyVersion(topVer);
/** {@inheritDoc} */ @Override public void ownMoving(AffinityTopologyVersion rebFinishedTopVer) { lock.writeLock().lock(); AffinityTopologyVersion lastAffChangeVer = ctx.exchange().lastAffinityChangedTopologyVersion(lastTopChangeVer); if (lastAffChangeVer.compareTo(rebFinishedTopVer) > 0) log.info("Affinity topology changed, no MOVING partitions will be owned " + "[rebFinishedTopVer=" + rebFinishedTopVer + ", lastAffChangeVer=" + lastAffChangeVer + "]"); try { for (GridDhtLocalPartition locPart : grp.topology().currentLocalPartitions()) { if (locPart.state() == MOVING) { boolean reserved = locPart.reserve(); try { if (reserved && locPart.state() == MOVING && lastAffChangeVer.compareTo(rebFinishedTopVer) <= 0 && rebFinishedTopVer.compareTo(lastTopChangeVer) <= 0) grp.topology().own(locPart); } finally { if (reserved) locPart.release(); } } } } finally { lock.writeLock().unlock(); } }
/** * @param expVer Expected topology version. * @param curVer Current topology version. * @return {@code True} if cache affinity changed and operation should be remapped. */ protected final boolean needRemap(AffinityTopologyVersion expVer, AffinityTopologyVersion curVer, Collection<KeyCacheObject> keys) { if (curVer.equals(expVer)) return false; AffinityTopologyVersion lastAffChangedTopVer = ctx.shared().exchange().lastAffinityChangedTopologyVersion(expVer); if (curVer.compareTo(lastAffChangedTopVer) >= 0 && curVer.compareTo(expVer) <= 0) return false; // TODO IGNITE-7164 check mvcc crd for mvcc enabled txs. Collection<ClusterNode> cacheNodes0 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), expVer); Collection<ClusterNode> cacheNodes1 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), curVer); if (!cacheNodes0.equals(cacheNodes1) || ctx.affinity().affinityTopologyVersion().compareTo(curVer) < 0) return true; try { List<List<ClusterNode>> aff1 = ctx.affinity().assignments(expVer); List<List<ClusterNode>> aff2 = ctx.affinity().assignments(curVer); return !aff1.equals(aff2); } catch (IllegalStateException ignored) { return true; } }
/** */ public boolean affinityChanged(AffinityTopologyVersion from, AffinityTopologyVersion to) { if (lastAffinityChangedTopologyVersion(to).compareTo(from) >= 0) return false; Collection<GridDhtPartitionsExchangeFuture> history = exchFuts.values(); boolean fromFound = false; for (GridDhtPartitionsExchangeFuture fut : history) { if (!fromFound) { int cmp = fut.initialVersion().compareTo(from); if (cmp > 0) // We don't have history, so return true for safety return true; else if (cmp == 0) fromFound = true; else if (fut.isDone() && fut.topologyVersion().compareTo(from) >= 0) return true; // Temporary solution for merge exchange case } else { if (fut.changedAffinity()) return true; if (fut.initialVersion().compareTo(to) >= 0) return false; } } return true; }
AffinityTopologyVersion lastAffChangedVer = cacheMsg.lastAffinityChangedTopologyVersion(); cctx.exchange().lastAffinityChangedTopologyVersion(rmtAffVer, lastAffChangedVer);
/** {@inheritDoc} */ @Override public boolean rebalanceRequired(AffinityTopologyVersion rebTopVer, GridDhtPartitionsExchangeFuture exchFut) { if (ctx.kernalContext().clientNode() || rebTopVer.equals(AffinityTopologyVersion.NONE)) return false; // No-op. if (exchFut.resetLostPartitionFor(grp.cacheOrGroupName())) return true; if (exchFut.localJoinExchange()) return true; // Required, can have outdated updSeq partition counter if node reconnects. if (!grp.affinity().cachedVersions().contains(rebTopVer)) { assert rebTopVer.compareTo(grp.localStartVersion()) <= 0 : "Empty hisroty allowed only for newly started cache group [rebTopVer=" + rebTopVer + ", localStartTopVer=" + grp.localStartVersion() + ']'; return true; // Required, since no history info available. } final IgniteInternalFuture<Boolean> rebFut = rebalanceFuture(); if (rebFut.isDone() && !rebFut.result()) return true; // Required, previous rebalance cancelled. AffinityTopologyVersion lastAffChangeTopVer = ctx.exchange().lastAffinityChangedTopologyVersion(exchFut.topologyVersion()); return lastAffChangeTopVer.compareTo(rebTopVer) > 0; }
return false; AffinityTopologyVersion lastAffChangedTopVer = ctx.exchange().lastAffinityChangedTopologyVersion(expVer);
return; msg.lastAffinityChangedTopologyVersion(cctx.exchange().lastAffinityChangedTopologyVersion(msg.topologyVersion()));
return; msg.lastAffinityChangedTopologyVersion(cctx.exchange().lastAffinityChangedTopologyVersion(msg.topologyVersion()));
assert !node.isLocal() : node; msg.lastAffinityChangedTopologyVersion(cctx.exchange().lastAffinityChangedTopologyVersion(msg.topologyVersion()));
&& ctx.shared().exchange().lastAffinityChangedTopologyVersion(topFut.initialVersion()).compareTo(topVer) <= 0)) {