/** @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; } } } } } }
/** * @param ignite Grid. * @param cacheName Cache name. * @param sample Sample size. * @return Data transfer object for given cache. * @throws IgniteCheckedException If failed to create data transfer object. */ public VisorCache from(IgniteEx ignite, String cacheName, int sample) throws IgniteCheckedException { assert ignite != null; GridCacheAdapter ca = ignite.context().cache().internalCache(cacheName); // Cache was not started. if (ca == null || !ca.context().started()) return null; name = cacheName; try { swapSize = ca.swapSize(); swapKeys = ca.swapKeys(); } catch (IgniteCheckedException ignored) { swapSize = -1; swapKeys = -1; } primaryPartitions = Collections.emptyList(); backupPartitions = Collections.emptyList(); CacheConfiguration cfg = ca.configuration(); mode = cfg.getCacheMode(); boolean partitioned = (mode == CacheMode.PARTITIONED || mode == CacheMode.REPLICATED) && ca.context().affinityNode(); if (partitioned) { GridDhtCacheAdapter dca = null; if (ca instanceof GridNearCacheAdapter) dca = ((GridNearCacheAdapter) ca).dht(); else if (ca instanceof GridDhtCacheAdapter) dca = (GridDhtCacheAdapter) ca; if (dca != null) { GridDhtPartitionTopology top = dca.topology(); if (cfg.getCacheMode() != CacheMode.LOCAL && cfg.getBackups() > 0) { GridDhtPartitionMap2 map2 = top.localPartitionMap(); partitionsMap = new GridDhtPartitionMap(map2.nodeId(), map2.updateSequence(), map2.map()); } List<GridDhtLocalPartition> parts = top.localPartitions(); primaryPartitions = new ArrayList<>(parts.size()); backupPartitions = new ArrayList<>(parts.size()); for (GridDhtLocalPartition part : parts) { int p = part.id(); int sz = part.size(); // Pass -1 as topology version in order not to wait for topology version. if (part.primary(AffinityTopologyVersion.NONE)) primaryPartitions.add(new IgnitePair<>(p, sz)); else if (part.state() == GridDhtPartitionState.OWNING && part.backup(AffinityTopologyVersion.NONE)) backupPartitions.add(new IgnitePair<>(p, sz)); } } else { // Old way of collecting partitions info. ClusterNode node = ignite.cluster().localNode(); int[] pp = ca.affinity().primaryPartitions(node); primaryPartitions = new ArrayList<>(pp.length); for (int p : pp) { Set set = ca.entrySet(p); primaryPartitions.add(new IgnitePair<>(p, set != null ? set.size() : 0)); } int[] bp = ca.affinity().backupPartitions(node); backupPartitions = new ArrayList<>(bp.length); for (int p : bp) { Set set = ca.entrySet(p); backupPartitions.add(new IgnitePair<>(p, set != null ? set.size() : 0)); } } } size = ca.size(); nearSize = ca.nearSize(); dynamicDeploymentId = ca.context().dynamicDeploymentId(); dhtSize = size - nearSize; primarySize = ca.primarySize(); offHeapAllocatedSize = ca.offHeapAllocatedSize(); offHeapEntriesCnt = ca.offHeapEntriesCount(); partitions = ca.affinity().partitions(); metrics = VisorCacheMetrics.from(ignite, cacheName); estimateMemorySize(ignite, ca, sample); return this; }