/** * @param ccfg Cache configuration. * @return Data transfer object for affinity configuration properties. */ public static VisorCacheAffinityConfiguration from(CacheConfiguration ccfg) { AffinityFunction aff = ccfg.getAffinity(); Boolean excludeNeighbors = null; if (aff instanceof RendezvousAffinityFunction) { RendezvousAffinityFunction hashAffFunc = (RendezvousAffinityFunction) aff; excludeNeighbors = hashAffFunc.isExcludeNeighbors(); } VisorCacheAffinityConfiguration cfg = new VisorCacheAffinityConfiguration(); cfg.function = compactClass(aff); cfg.mapper = compactClass(ccfg.getAffinityMapper()); cfg.partitions = aff.partitions(); cfg.partitionedBackups = ccfg.getBackups(); cfg.excludeNeighbors = excludeNeighbors; return cfg; }
/** @throws InterruptedException If interrupted. */ @SuppressWarnings("BusyWait") protected void awaitPartitionMapExchange() throws InterruptedException { for (Ignite g : G.allGrids()) { IgniteKernal g0 = (IgniteKernal) g; for (IgniteCacheProxy<?, ?> c : g0.context().cache().jcaches()) { CacheConfiguration cfg = c.context().config(); if (cfg.getCacheMode() == PARTITIONED && cfg.getRebalanceMode() != NONE && g.cluster().nodes().size() > 1) { AffinityFunction aff = cfg.getAffinity(); GridDhtCacheAdapter<?, ?> dht = dht(c); GridDhtPartitionTopology top = dht.topology(); for (int p = 0; p < aff.partitions(); p++) { long start = 0; for (int i = 0; ; i++) { boolean match = false; AffinityTopologyVersion readyVer = dht.context().shared().exchange().readyAffinityVersion(); if (readyVer.topologyVersion() > 0 && c.context().started()) { // Must map on updated version of topology. Collection<ClusterNode> affNodes = g0.affinity(cfg.getName()).mapPartitionToPrimaryAndBackups(p); int exp = affNodes.size(); GridDhtTopologyFuture topFut = top.topologyVersionFuture(); Collection<ClusterNode> owners = (topFut != null && topFut.isDone()) ? top.nodes(p, AffinityTopologyVersion.NONE) : Collections.<ClusterNode>emptyList(); int actual = owners.size(); if (affNodes.size() != owners.size() || !affNodes.containsAll(owners)) { LT.warn( log(), null, "Waiting for topology map update [" + "grid=" + g.name() + ", cache=" + cfg.getName() + ", cacheId=" + dht.context().cacheId() + ", topVer=" + top.topologyVersion() + ", topFut=" + topFut + ", p=" + p + ", affNodesCnt=" + exp + ", ownersCnt=" + actual + ", affNodes=" + affNodes + ", owners=" + owners + ", locNode=" + g.cluster().localNode() + ']'); } else match = true; } else { LT.warn( log(), null, "Waiting for topology map update [" + "grid=" + g.name() + ", cache=" + cfg.getName() + ", cacheId=" + dht.context().cacheId() + ", topVer=" + top.topologyVersion() + ", started=" + dht.context().started() + ", p=" + p + ", readVer=" + readyVer + ", locNode=" + g.cluster().localNode() + ']'); } if (!match) { if (i == 0) start = System.currentTimeMillis(); if (System.currentTimeMillis() - start > 30_000) throw new IgniteException( "Timeout of waiting for topology map update [" + "grid=" + g.name() + ", cache=" + cfg.getName() + ", cacheId=" + dht.context().cacheId() + ", topVer=" + top.topologyVersion() + ", p=" + p + ", readVer=" + readyVer + ", locNode=" + g.cluster().localNode() + ']'); Thread.sleep(200); // Busy wait. continue; } if (i > 0) log() .warning( "Finished waiting for topology map update [grid=" + g.name() + ", p=" + p + ", duration=" + (System.currentTimeMillis() - start) + "ms]"); break; } } } } } }