Search in sources :

Example 6 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap in project ignite by apache.

the class IgniteFailoverAbstractBenchmark method awaitPartitionMapExchange.

/**
     * Awaits for partitiona map exchage.
     *
     * @param ignite Ignite.
     * @throws Exception If failed.
     */
@SuppressWarnings("BusyWait")
protected static void awaitPartitionMapExchange(Ignite ignite) throws Exception {
    IgniteLogger log = ignite.log();
    log.info("Waiting for finishing of a partition exchange on node: " + ignite);
    IgniteKernal kernal = (IgniteKernal) ignite;
    while (true) {
        boolean partitionsExchangeFinished = true;
        for (IgniteInternalCache<?, ?> cache : kernal.cachesx(null)) {
            log.info("Checking cache: " + cache.name());
            GridCacheAdapter<?, ?> c = kernal.internalCache(cache.name());
            if (!(c instanceof GridDhtCacheAdapter))
                break;
            GridDhtCacheAdapter<?, ?> dht = (GridDhtCacheAdapter<?, ?>) c;
            GridDhtPartitionFullMap partMap = dht.topology().partitionMap(true);
            for (Map.Entry<UUID, GridDhtPartitionMap> e : partMap.entrySet()) {
                log.info("Checking node: " + e.getKey());
                for (Map.Entry<Integer, GridDhtPartitionState> e1 : e.getValue().entrySet()) {
                    if (e1.getValue() != GridDhtPartitionState.OWNING) {
                        log.info("Undesired state [id=" + e1.getKey() + ", state=" + e1.getValue() + ']');
                        partitionsExchangeFinished = false;
                        break;
                    }
                }
                if (!partitionsExchangeFinished)
                    break;
            }
            if (!partitionsExchangeFinished)
                break;
        }
        if (partitionsExchangeFinished)
            return;
        Thread.sleep(100);
    }
}
Also used : IgniteKernal(org.apache.ignite.internal.IgniteKernal) GridDhtCacheAdapter(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) GridDhtPartitionState(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState) IgniteLogger(org.apache.ignite.IgniteLogger) UUID(java.util.UUID) HashMap(java.util.HashMap) Map(java.util.Map) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)

Example 7 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap in project ignite by apache.

the class GridDhtPartitionTopologyImpl method removeNode.

/**
     * @param nodeId Node to remove.
     */
private void removeNode(UUID nodeId) {
    assert nodeId != null;
    ClusterNode oldest = discoCache.oldestAliveServerNode();
    assert oldest != null || cctx.kernalContext().clientNode();
    ClusterNode loc = cctx.localNode();
    if (node2part != null) {
        if (loc.equals(oldest) && !node2part.nodeId().equals(loc.id())) {
            updateSeq.setIfGreater(node2part.updateSequence());
            node2part = new GridDhtPartitionFullMap(loc.id(), loc.order(), updateSeq.incrementAndGet(), node2part, false);
        } else
            node2part = new GridDhtPartitionFullMap(node2part, node2part.updateSequence());
        GridDhtPartitionMap parts = node2part.remove(nodeId);
        if (parts != null) {
            for (Integer p : parts.keySet()) {
                Set<UUID> nodeIds = part2node.get(p);
                if (nodeIds != null) {
                    nodeIds.remove(nodeId);
                    if (nodeIds.isEmpty())
                        part2node.remove(p);
                }
            }
        }
        consistencyCheck();
    }
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) UUID(java.util.UUID)

Example 8 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap in project ignite by apache.

the class GridDhtPartitionTopologyImpl method update.

/** {@inheritDoc} */
@SuppressWarnings({ "MismatchedQueryAndUpdateOfCollection" })
@Nullable
@Override
public GridDhtPartitionMap update(@Nullable GridDhtPartitionExchangeId exchId, GridDhtPartitionMap parts) {
    if (log.isDebugEnabled())
        log.debug("Updating single partition map [exchId=" + exchId + ", parts=" + mapString(parts) + ']');
    if (!cctx.discovery().alive(parts.nodeId())) {
        if (log.isDebugEnabled())
            log.debug("Received partition update for non-existing node (will ignore) [exchId=" + exchId + ", parts=" + parts + ']');
        return null;
    }
    lock.writeLock().lock();
    try {
        if (stopping)
            return null;
        if (lastExchangeId != null && exchId != null && lastExchangeId.compareTo(exchId) > 0) {
            if (log.isDebugEnabled())
                log.debug("Stale exchange id for single partition map update (will ignore) [lastExchId=" + lastExchangeId + ", exchId=" + exchId + ']');
            return null;
        }
        if (exchId != null)
            lastExchangeId = exchId;
        if (node2part == null)
            // Create invalid partition map.
            node2part = new GridDhtPartitionFullMap();
        GridDhtPartitionMap cur = node2part.get(parts.nodeId());
        if (cur != null && cur.updateSequence() >= parts.updateSequence()) {
            if (log.isDebugEnabled())
                log.debug("Stale update sequence for single partition map update (will ignore) [exchId=" + exchId + ", curSeq=" + cur.updateSequence() + ", newSeq=" + parts.updateSequence() + ']');
            return null;
        }
        long updateSeq = this.updateSeq.incrementAndGet();
        node2part = new GridDhtPartitionFullMap(node2part, updateSeq);
        boolean changed = false;
        if (cur == null || !cur.equals(parts))
            changed = true;
        node2part.put(parts.nodeId(), parts);
        part2node = new HashMap<>(part2node);
        // Add new mappings.
        for (Integer p : parts.keySet()) {
            Set<UUID> ids = part2node.get(p);
            if (ids == null)
                // Initialize HashSet to size 3 in anticipation that there won't be
                // more than 3 nodes per partition.
                part2node.put(p, ids = U.newHashSet(3));
            changed |= ids.add(parts.nodeId());
        }
        // Remove obsolete mappings.
        if (cur != null) {
            for (Integer p : F.view(cur.keySet(), F0.notIn(parts.keySet()))) {
                Set<UUID> ids = part2node.get(p);
                if (ids != null)
                    changed |= ids.remove(parts.nodeId());
            }
        }
        AffinityTopologyVersion affVer = cctx.affinity().affinityTopologyVersion();
        if (!affVer.equals(AffinityTopologyVersion.NONE) && affVer.compareTo(topVer) >= 0) {
            List<List<ClusterNode>> aff = cctx.affinity().assignments(topVer);
            changed |= checkEvictions(updateSeq, aff);
            updateRebalanceVersion(aff);
        }
        consistencyCheck();
        if (log.isDebugEnabled())
            log.debug("Partition map after single update: " + fullMapString());
        if (changed)
            cctx.shared().exchange().scheduleResendPartitions();
        return changed ? localPartitionMap() : null;
    } finally {
        lock.writeLock().unlock();
    }
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) List(java.util.List) ArrayList(java.util.ArrayList) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) UUID(java.util.UUID) Nullable(org.jetbrains.annotations.Nullable)

Example 9 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap in project ignite by apache.

the class GridCachePartitionExchangeManager method addFullPartitionsMap.

/**
     * @param m Message.
     * @param dupData Duplicated data map.
     * @param compress {@code True} if need check for duplicated partition state data.
     * @param cacheId Cache ID.
     * @param map Map to add.
     * @param affKey Cache affinity key.
     */
private void addFullPartitionsMap(GridDhtPartitionsFullMessage m, Map<Object, T2<Integer, GridDhtPartitionFullMap>> dupData, boolean compress, Integer cacheId, GridDhtPartitionFullMap map, Object affKey) {
    Integer dupDataCache = null;
    if (compress && affKey != null && !m.containsCache(cacheId)) {
        T2<Integer, GridDhtPartitionFullMap> state0 = dupData.get(affKey);
        if (state0 != null && state0.get2().partitionStateEquals(map)) {
            GridDhtPartitionFullMap map0 = new GridDhtPartitionFullMap(map.nodeId(), map.nodeOrder(), map.updateSequence());
            for (Map.Entry<UUID, GridDhtPartitionMap> e : map.entrySet()) map0.put(e.getKey(), e.getValue().emptyCopy());
            map = map0;
            dupDataCache = state0.get1();
        } else
            dupData.put(affKey, new T2<>(cacheId, map));
    }
    m.addFullPartitionsMap(cacheId, map, dupDataCache);
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) UUID(java.util.UUID) Map(java.util.Map) NavigableMap(java.util.NavigableMap) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) TreeMap(java.util.TreeMap) T2(org.apache.ignite.internal.util.typedef.T2)

Example 10 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap in project ignite by apache.

the class GridCachePartitionExchangeManager method createPartitionsFullMessage.

/**
     * @param nodes Target nodes.
     * @param exchId Non-null exchange ID if message is created for exchange.
     * @param lastVer Last version.
     * @param compress {@code True} if it is possible to use compression for message.
     * @return Message.
     */
public GridDhtPartitionsFullMessage createPartitionsFullMessage(Collection<ClusterNode> nodes, @Nullable final GridDhtPartitionExchangeId exchId, @Nullable GridCacheVersion lastVer, final boolean compress) {
    final GridDhtPartitionsFullMessage m = new GridDhtPartitionsFullMessage(exchId, lastVer, exchId != null ? exchId.topologyVersion() : AffinityTopologyVersion.NONE);
    m.compress(compress);
    final Map<Object, T2<Integer, GridDhtPartitionFullMap>> dupData = new HashMap<>();
    cctx.forAllCaches(new IgniteInClosure<GridCacheContext>() {

        @Override
        public void apply(GridCacheContext cacheCtx) {
            if (!cacheCtx.isLocal()) {
                boolean ready;
                if (exchId != null) {
                    AffinityTopologyVersion startTopVer = cacheCtx.startTopologyVersion();
                    ready = startTopVer.compareTo(exchId.topologyVersion()) <= 0;
                } else
                    ready = cacheCtx.started();
                if (ready) {
                    GridAffinityAssignmentCache affCache = cacheCtx.affinity().affinityCache();
                    GridDhtPartitionFullMap locMap = cacheCtx.topology().partitionMap(true);
                    addFullPartitionsMap(m, dupData, compress, cacheCtx.cacheId(), locMap, affCache.similarAffinityKey());
                    if (exchId != null)
                        m.addPartitionUpdateCounters(cacheCtx.cacheId(), cacheCtx.topology().updateCounters(true));
                }
            }
        }
    });
    // It is important that client topologies be added after contexts.
    for (GridClientPartitionTopology top : cctx.exchange().clientTopologies()) {
        GridDhtPartitionFullMap map = top.partitionMap(true);
        addFullPartitionsMap(m, dupData, compress, top.cacheId(), map, top.similarAffinityKey());
        if (exchId != null)
            m.addPartitionUpdateCounters(top.cacheId(), top.updateCounters(true));
    }
    return m;
}
Also used : GridDhtPartitionsFullMessage(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage) HashMap(java.util.HashMap) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) GridAffinityAssignmentCache(org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) T2(org.apache.ignite.internal.util.typedef.T2) GridClientPartitionTopology(org.apache.ignite.internal.processors.cache.distributed.dht.GridClientPartitionTopology)

Aggregations

GridDhtPartitionFullMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap)16 GridDhtPartitionMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)12 UUID (java.util.UUID)9 HashMap (java.util.HashMap)8 Map (java.util.Map)7 ClusterNode (org.apache.ignite.cluster.ClusterNode)5 ArrayList (java.util.ArrayList)4 List (java.util.List)3 Ignite (org.apache.ignite.Ignite)3 AffinityTopologyVersion (org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion)3 T2 (org.apache.ignite.internal.util.typedef.T2)3 Nullable (org.jetbrains.annotations.Nullable)3 NavigableMap (java.util.NavigableMap)2 Set (java.util.Set)2 TreeMap (java.util.TreeMap)2 ConcurrentMap (java.util.concurrent.ConcurrentMap)2 ConcurrentSkipListMap (java.util.concurrent.ConcurrentSkipListMap)2 GridDhtPartitionExchangeId (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId)2 HashSet (java.util.HashSet)1 IgniteLogger (org.apache.ignite.IgniteLogger)1