Search in sources :

Example 31 with GridDhtPartitionMap

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

the class GridClientPartitionTopology method update.

/** {@inheritDoc} */
@SuppressWarnings({ "MismatchedQueryAndUpdateOfCollection" })
@Nullable
@Override
public GridDhtPartitionMap update(@Nullable GridDhtPartitionExchangeId exchId, GridDhtPartitionFullMap partMap, Map<Integer, T2<Long, Long>> cntrMap) {
    if (log.isDebugEnabled())
        log.debug("Updating full partition map [exchId=" + exchId + ", parts=" + fullMapString() + ']');
    lock.writeLock().lock();
    try {
        if (exchId != null && lastExchangeId != null && lastExchangeId.compareTo(exchId) >= 0) {
            if (log.isDebugEnabled())
                log.debug("Stale exchange id for full partition map update (will ignore) [lastExchId=" + lastExchangeId + ", exchId=" + exchId + ']');
            return null;
        }
        if (node2part != null && node2part.compareTo(partMap) >= 0) {
            if (log.isDebugEnabled())
                log.debug("Stale partition map for full partition map update (will ignore) [lastExchId=" + lastExchangeId + ", exchId=" + exchId + ", curMap=" + node2part + ", newMap=" + partMap + ']');
            return null;
        }
        updateSeq.incrementAndGet();
        if (exchId != null)
            lastExchangeId = exchId;
        if (node2part != null) {
            for (GridDhtPartitionMap part : node2part.values()) {
                GridDhtPartitionMap newPart = partMap.get(part.nodeId());
                // then we keep the newer value.
                if (newPart != null && newPart.updateSequence() < part.updateSequence()) {
                    if (log.isDebugEnabled())
                        log.debug("Overriding partition map in full update map [exchId=" + exchId + ", curPart=" + mapString(part) + ", newPart=" + mapString(newPart) + ']');
                    partMap.put(part.nodeId(), part);
                }
            }
            for (Iterator<UUID> it = partMap.keySet().iterator(); it.hasNext(); ) {
                UUID nodeId = it.next();
                if (!cctx.discovery().alive(nodeId)) {
                    if (log.isDebugEnabled())
                        log.debug("Removing left node from full map update [nodeId=" + nodeId + ", partMap=" + partMap + ']');
                    it.remove();
                }
            }
        }
        node2part = partMap;
        Map<Integer, Set<UUID>> p2n = new HashMap<>();
        for (Map.Entry<UUID, GridDhtPartitionMap> e : partMap.entrySet()) {
            for (Integer p : e.getValue().keySet()) {
                Set<UUID> ids = p2n.get(p);
                if (ids == null)
                    // Initialize HashSet to size 3 in anticipation that there won't be
                    // more than 3 nodes per partitions.
                    p2n.put(p, ids = U.newHashSet(3));
                ids.add(e.getKey());
            }
        }
        part2node = p2n;
        if (cntrMap != null)
            this.cntrMap = new HashMap<>(cntrMap);
        consistencyCheck();
        if (log.isDebugEnabled())
            log.debug("Partition map after full update: " + fullMapString());
        return null;
    } finally {
        lock.writeLock().unlock();
    }
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) Set(java.util.Set) HashMap(java.util.HashMap) 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) Nullable(org.jetbrains.annotations.Nullable)

Example 32 with GridDhtPartitionMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap 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 33 with GridDhtPartitionMap

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

the class GridDhtPartitionTopologyImpl method resetLostPartitions.

/** {@inheritDoc} */
@Override
public void resetLostPartitions() {
    lock.writeLock().lock();
    try {
        int parts = cctx.affinity().partitions();
        long updSeq = updateSeq.incrementAndGet();
        for (int part = 0; part < parts; part++) {
            Set<UUID> nodeIds = part2node.get(part);
            if (nodeIds != null) {
                boolean lost = false;
                for (UUID node : nodeIds) {
                    GridDhtPartitionMap map = node2part.get(node);
                    if (map.get(part) == LOST) {
                        lost = true;
                        break;
                    }
                }
                if (lost) {
                    GridDhtLocalPartition locPart = localPartition(part, topVer, false);
                    if (locPart != null) {
                        boolean marked = locPart.own();
                        if (marked)
                            updateLocal(locPart.id(), locPart.state(), updSeq);
                    }
                    for (UUID nodeId : nodeIds) {
                        GridDhtPartitionMap nodeMap = node2part.get(nodeId);
                        if (nodeMap.get(part) == LOST)
                            nodeMap.put(part, OWNING);
                    }
                }
            }
        }
        checkEvictions(updSeq, cctx.affinity().assignments(topVer));
        cctx.needsRecovery(false);
    } finally {
        lock.writeLock().unlock();
    }
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) UUID(java.util.UUID)

Example 34 with GridDhtPartitionMap

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

the class GridDhtPartitionTopologyImpl method detectLostPartitions.

/** {@inheritDoc} */
@Override
public boolean detectLostPartitions(DiscoveryEvent discoEvt) {
    lock.writeLock().lock();
    try {
        int parts = cctx.affinity().partitions();
        Collection<Integer> lost = null;
        for (int p = 0; p < parts; p++) {
            boolean foundOwner = false;
            Set<UUID> nodeIds = part2node.get(p);
            if (nodeIds != null) {
                for (UUID nodeId : nodeIds) {
                    GridDhtPartitionMap partMap = node2part.get(nodeId);
                    GridDhtPartitionState state = partMap.get(p);
                    if (state == OWNING) {
                        foundOwner = true;
                        break;
                    }
                }
            }
            if (!foundOwner) {
                if (lost == null)
                    lost = new HashSet<>(parts - p, 1.0f);
                lost.add(p);
            }
        }
        boolean changed = false;
        if (lost != null) {
            PartitionLossPolicy plc = cctx.config().getPartitionLossPolicy();
            assert plc != null;
            // Update partition state on all nodes.
            for (Integer part : lost) {
                long updSeq = updateSeq.incrementAndGet();
                GridDhtLocalPartition locPart = localPartition(part, topVer, false);
                if (locPart != null) {
                    boolean marked = plc == PartitionLossPolicy.IGNORE ? locPart.own() : locPart.markLost();
                    if (marked)
                        updateLocal(locPart.id(), locPart.state(), updSeq);
                    changed |= marked;
                } else // Update map for remote node.
                if (plc != PartitionLossPolicy.IGNORE) {
                    Set<UUID> nodeIds = part2node.get(part);
                    if (nodeIds != null) {
                        for (UUID nodeId : nodeIds) {
                            GridDhtPartitionMap nodeMap = node2part.get(nodeId);
                            if (nodeMap.get(part) != EVICTED)
                                nodeMap.put(part, LOST);
                        }
                    }
                }
                if (cctx.events().isRecordable(EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST))
                    cctx.events().addPreloadEvent(part, EVT_CACHE_REBALANCE_PART_DATA_LOST, discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
            }
            if (plc != PartitionLossPolicy.IGNORE)
                cctx.needsRecovery(true);
        }
        return changed;
    } finally {
        lock.writeLock().unlock();
    }
}
Also used : Set(java.util.Set) HashSet(java.util.HashSet) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) PartitionLossPolicy(org.apache.ignite.cache.PartitionLossPolicy) UUID(java.util.UUID) HashSet(java.util.HashSet)

Example 35 with GridDhtPartitionMap

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

the class GridCachePartitionExchangeManager method createPartitionsSingleMessage.

/**
 * @param exchangeId Exchange ID.
 * @param clientOnlyExchange Client exchange flag.
 * @param sndCounters {@code True} if need send partition update counters.
 * @param newCntrMap {@code True} if possible to use {@link CachePartitionPartialCountersMap}.
 * @return Message.
 */
public GridDhtPartitionsSingleMessage createPartitionsSingleMessage(@Nullable GridDhtPartitionExchangeId exchangeId, boolean clientOnlyExchange, boolean sndCounters, boolean newCntrMap, ExchangeActions exchActions) {
    GridDhtPartitionsSingleMessage m = new GridDhtPartitionsSingleMessage(exchangeId, clientOnlyExchange, cctx.versions().last(), true);
    Map<Object, T2<Integer, GridPartitionStateMap>> dupData = new HashMap<>();
    for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
        if (!grp.isLocal() && (exchActions == null || !exchActions.cacheGroupStopping(grp.groupId()))) {
            GridDhtPartitionMap locMap = grp.topology().localPartitionMap();
            addPartitionMap(m, dupData, true, grp.groupId(), locMap, grp.affinity().similarAffinityKey());
            if (sndCounters) {
                CachePartitionPartialCountersMap cntrsMap = grp.topology().localUpdateCounters(true);
                m.addPartitionUpdateCounters(grp.groupId(), newCntrMap ? cntrsMap : CachePartitionPartialCountersMap.toCountersMap(cntrsMap));
            }
        }
    }
    for (GridClientPartitionTopology top : clientTops.values()) {
        if (m.partitions() != null && m.partitions().containsKey(top.groupId()))
            continue;
        GridDhtPartitionMap locMap = top.localPartitionMap();
        addPartitionMap(m, dupData, true, top.groupId(), locMap, top.similarAffinityKey());
        if (sndCounters) {
            CachePartitionPartialCountersMap cntrsMap = top.localUpdateCounters(true);
            m.addPartitionUpdateCounters(top.groupId(), newCntrMap ? cntrsMap : CachePartitionPartialCountersMap.toCountersMap(cntrsMap));
        }
    }
    return m;
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) GridDhtPartitionsSingleMessage(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) T2(org.apache.ignite.internal.util.typedef.T2) CachePartitionPartialCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap) GridClientPartitionTopology(org.apache.ignite.internal.processors.cache.distributed.dht.GridClientPartitionTopology)

Aggregations

GridDhtPartitionMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)67 UUID (java.util.UUID)47 GridDhtPartitionFullMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap)46 Map (java.util.Map)41 HashMap (java.util.HashMap)36 GridPartitionStateMap (org.apache.ignite.internal.util.GridPartitionStateMap)32 CachePartitionPartialCountersMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap)30 CachePartitionFullCountersMap (org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap)28 ClusterNode (org.apache.ignite.cluster.ClusterNode)20 HashSet (java.util.HashSet)14 AffinityTopologyVersion (org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion)10 Set (java.util.Set)9 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)8 AffinityAssignment (org.apache.ignite.internal.processors.affinity.AffinityAssignment)8 ArrayList (java.util.ArrayList)7 Ignite (org.apache.ignite.Ignite)7 IgniteKernal (org.apache.ignite.internal.IgniteKernal)7 GridDhtPartitionState (org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState)7 GridDhtPartitionTopology (org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology)7 List (java.util.List)6