Search in sources :

Example 56 with GridDhtPartitionMap

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

the class GridClientPartitionTopology method resetOwners.

/**
 * {@inheritDoc}
 */
@Override
public Map<UUID, Set<Integer>> resetOwners(Map<Integer, Set<UUID>> ownersByUpdCounters, Set<Integer> haveHist, GridDhtPartitionsExchangeFuture exchFut) {
    Map<UUID, Set<Integer>> res = new HashMap<>();
    lock.writeLock().lock();
    try {
        // Process remote partitions.
        for (Map.Entry<Integer, Set<UUID>> entry : ownersByUpdCounters.entrySet()) {
            int part = entry.getKey();
            Set<UUID> newOwners = entry.getValue();
            for (Map.Entry<UUID, GridDhtPartitionMap> remotes : node2part.entrySet()) {
                UUID remoteNodeId = remotes.getKey();
                GridDhtPartitionMap partMap = remotes.getValue();
                GridDhtPartitionState state = partMap.get(part);
                if (state == null || state != OWNING)
                    continue;
                if (!newOwners.contains(remoteNodeId)) {
                    partMap.put(part, MOVING);
                    partMap.updateSequence(partMap.updateSequence() + 1, partMap.topologyVersion());
                    res.computeIfAbsent(remoteNodeId, n -> new HashSet<>());
                    res.get(remoteNodeId).add(part);
                }
            }
        }
        for (Map.Entry<UUID, Set<Integer>> entry : res.entrySet()) {
            UUID nodeId = entry.getKey();
            Set<Integer> partsToRebalance = entry.getValue();
            if (!partsToRebalance.isEmpty()) {
                Set<Integer> historical = partsToRebalance.stream().filter(haveHist::contains).collect(Collectors.toSet());
                // Filter out partitions having WAL history.
                partsToRebalance.removeAll(historical);
                U.warn(log, "Partitions have been scheduled for rebalancing due to outdated update counter " + "[grpId=" + grpId + ", nodeId=" + nodeId + ", partsFull=" + S.compact(partsToRebalance) + ", partsHistorical=" + S.compact(historical) + "]");
            }
        }
        for (Map.Entry<Integer, Set<UUID>> entry : ownersByUpdCounters.entrySet()) part2node.put(entry.getKey(), entry.getValue());
        updateSeq.incrementAndGet();
    } finally {
        lock.writeLock().unlock();
    }
    return res;
}
Also used : TreeSet(java.util.TreeSet) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) UUID(java.util.UUID) GridPartitionStateMap(org.apache.ignite.internal.util.GridPartitionStateMap) CachePartitionFullCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap) HashMap(java.util.HashMap) Map(java.util.Map) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) CachePartitionPartialCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)

Example 57 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}
 */
@Override
public boolean update(@Nullable GridDhtPartitionExchangeId exchId, GridDhtPartitionMap parts, boolean force) {
    if (log.isDebugEnabled()) {
        log.debug("Updating single partition map [grp=" + grp.cacheOrGroupName() + ", exchId=" + exchId + ", parts=" + mapString(parts) + ']');
    }
    if (!ctx.discovery().alive(parts.nodeId())) {
        if (log.isTraceEnabled()) {
            log.trace("Received partition update for non-existing node (will ignore) [grp=" + grp.cacheOrGroupName() + ", exchId=" + exchId + ", parts=" + parts + ']');
        }
        return false;
    }
    ctx.database().checkpointReadLock();
    try {
        lock.writeLock().lock();
        try {
            if (stopping)
                return false;
            if (!force) {
                if (lastTopChangeVer.initialized() && exchId != null && lastTopChangeVer.compareTo(exchId.topologyVersion()) > 0) {
                    U.warn(log, "Stale exchange id for single partition map update (will ignore) [" + "grp=" + grp.cacheOrGroupName() + ", lastTopChange=" + lastTopChangeVer + ", readTopVer=" + readyTopVer + ", exch=" + exchId.topologyVersion() + ']');
                    return false;
                }
            }
            if (node2part == null)
                // Create invalid partition map.
                node2part = new GridDhtPartitionFullMap();
            GridDhtPartitionMap cur = node2part.get(parts.nodeId());
            if (force) {
                if (cur != null && cur.topologyVersion().initialized())
                    parts.updateSequence(cur.updateSequence(), cur.topologyVersion());
            } else if (isStaleUpdate(cur, parts)) {
                assert cur != null;
                String msg = "Stale update for single partition map update (will ignore) [" + "nodeId=" + parts.nodeId() + ", grp=" + grp.cacheOrGroupName() + ", exchId=" + exchId + ", curMap=" + cur + ", newMap=" + parts + ']';
                // This is usual situation when partition maps are equal, just print debug message.
                if (cur.compareTo(parts) == 0) {
                    if (log.isTraceEnabled())
                        log.trace(msg);
                } else
                    U.warn(log, msg);
                return false;
            }
            long updateSeq = this.updateSeq.incrementAndGet();
            node2part.newUpdateSequence(updateSeq);
            boolean changed = false;
            if (cur == null || !cur.equals(parts))
                changed = true;
            node2part.put(parts.nodeId(), parts);
            // During exchange diff is calculated after all messages are received and affinity initialized.
            if (exchId == null && !grp.isReplicated()) {
                if (readyTopVer.initialized() && readyTopVer.compareTo(diffFromAffinityVer) >= 0) {
                    AffinityAssignment affAssignment = grp.affinity().readyAffinity(readyTopVer);
                    // Add new mappings.
                    for (Map.Entry<Integer, GridDhtPartitionState> e : parts.entrySet()) {
                        int p = e.getKey();
                        Set<UUID> diffIds = diffFromAffinity.get(p);
                        if ((e.getValue() == MOVING || e.getValue() == OWNING || e.getValue() == RENTING) && !affAssignment.getIds(p).contains(parts.nodeId())) {
                            if (diffIds == null)
                                diffFromAffinity.put(p, diffIds = U.newHashSet(3));
                            if (diffIds.add(parts.nodeId()))
                                changed = true;
                        } else {
                            if (diffIds != null && diffIds.remove(parts.nodeId())) {
                                changed = true;
                                if (diffIds.isEmpty())
                                    diffFromAffinity.remove(p);
                            }
                        }
                    }
                    // Remove obsolete mappings.
                    if (cur != null) {
                        for (Integer p : F.view(cur.keySet(), F0.notIn(parts.keySet()))) {
                            Set<UUID> ids = diffFromAffinity.get(p);
                            if (ids != null && ids.remove(parts.nodeId())) {
                                changed = true;
                                if (ids.isEmpty())
                                    diffFromAffinity.remove(p);
                            }
                        }
                    }
                    diffFromAffinityVer = readyTopVer;
                }
            }
            if (readyTopVer.initialized() && readyTopVer.equals(lastTopChangeVer)) {
                AffinityAssignment aff = grp.affinity().readyAffinity(readyTopVer);
                if (exchId == null)
                    changed |= checkEvictions(updateSeq, aff);
                updateRebalanceVersion(aff.topologyVersion(), aff.assignment());
            }
            consistencyCheck();
            if (log.isDebugEnabled())
                log.debug("Partition map after single update [grp=" + grp.cacheOrGroupName() + ", map=" + fullMapString() + ']');
            if (changed && exchId == null) {
                if (log.isDebugEnabled())
                    log.debug("Partitions have been scheduled to resend [reason=" + "Single map update [grp" + grp.cacheOrGroupName() + "]");
                ctx.exchange().scheduleResendPartitions();
            }
            return changed;
        } finally {
            lock.writeLock().unlock();
        }
    } finally {
        ctx.database().checkpointReadUnlock();
    }
}
Also used : AffinityAssignment(org.apache.ignite.internal.processors.affinity.AffinityAssignment) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) UUID(java.util.UUID) GridPartitionStateMap(org.apache.ignite.internal.util.GridPartitionStateMap) CachePartitionFullCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap) Map(java.util.Map) HashMap(java.util.HashMap) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) CachePartitionPartialCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)

Example 58 with GridDhtPartitionMap

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

the class CacheGroupMetricsImpl method numberOfPartitionCopies.

/**
 * Calculates the number of partition copies for all partitions of this cache group and filter values by the
 * predicate.
 *
 * @param pred Predicate.
 */
private int numberOfPartitionCopies(IntBiPredicate pred) {
    GridDhtPartitionFullMap partFullMap = ctx.topology().partitionMap(false);
    if (partFullMap == null)
        return 0;
    int parts = ctx.topology().partitions();
    int res = -1;
    for (int part = 0; part < parts; part++) {
        int cnt = 0;
        for (Map.Entry<UUID, GridDhtPartitionMap> entry : partFullMap.entrySet()) {
            if (entry.getValue().get(part) == GridDhtPartitionState.OWNING)
                cnt++;
        }
        if (part == 0 || pred.apply(res, cnt))
            res = cnt;
    }
    return res;
}
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) LinkedHashMap(java.util.LinkedHashMap) 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 59 with GridDhtPartitionMap

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

the class GridClientPartitionTopology method createMovingPartitions.

/**
 * @param aff Affinity.
 */
private void createMovingPartitions(AffinityAssignment aff) {
    for (Map.Entry<UUID, GridDhtPartitionMap> e : node2part.entrySet()) {
        GridDhtPartitionMap map = e.getValue();
        addMoving(map, aff.backupPartitions(e.getKey()));
        addMoving(map, aff.primaryPartitions(e.getKey()));
    }
}
Also used : GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) UUID(java.util.UUID) GridPartitionStateMap(org.apache.ignite.internal.util.GridPartitionStateMap) CachePartitionFullCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionFullCountersMap) HashMap(java.util.HashMap) Map(java.util.Map) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) CachePartitionPartialCountersMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.CachePartitionPartialCountersMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap)

Example 60 with GridDhtPartitionMap

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

the class GridClientPartitionTopology method removeNode.

/**
 * @param nodeId Node to remove.
 */
private void removeNode(UUID nodeId) {
    assert nodeId != null;
    assert lock.writeLock().isHeldByCurrentThread();
    ClusterNode loc = cctx.localNode();
    if (node2part != null) {
        if (!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)

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