Search in sources :

Example 11 with GridDhtPartitionFullMap

use of org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap 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 oldest = discoCache.oldestAliveServerNodeWithCache();
    ClusterNode loc = cctx.localNode();
    if (node2part != null) {
        if (oldest.equals(loc) && !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());
        part2node = new HashMap<>(part2node);
        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 12 with GridDhtPartitionFullMap

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

the class GridClientPartitionTopology 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());
            }
        }
        consistencyCheck();
        if (log.isDebugEnabled())
            log.debug("Partition map after single update: " + fullMapString());
        return changed ? localPartitionMap() : null;
    } finally {
        lock.writeLock().unlock();
    }
}
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) Nullable(org.jetbrains.annotations.Nullable)

Example 13 with GridDhtPartitionFullMap

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

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

the class GridCacheDhtPreloadDelayedSelfTest method testAutomaticPreloadWithEmptyCache.

/**
     * @throws Exception If failed.
     */
public void testAutomaticPreloadWithEmptyCache() throws Exception {
    preloadMode = SYNC;
    delay = 0;
    Collection<Ignite> ignites = new ArrayList<>();
    try {
        for (int i = 0; i < 5; i++) {
            ignites.add(startGrid(i));
            awaitPartitionMapExchange();
            for (Ignite g : ignites) {
                info(">>> Checking affinity for grid: " + g.name());
                GridDhtPartitionTopology top = topology(g);
                GridDhtPartitionFullMap fullMap = top.partitionMap(true);
                for (Map.Entry<UUID, GridDhtPartitionMap> fe : fullMap.entrySet()) {
                    UUID nodeId = fe.getKey();
                    GridDhtPartitionMap m = fe.getValue();
                    for (Map.Entry<Integer, GridDhtPartitionState> e : m.entrySet()) {
                        int p = e.getKey();
                        GridDhtPartitionState state = e.getValue();
                        Collection<ClusterNode> nodes = affinityNodes(g, p);
                        Collection<UUID> nodeIds = U.nodeIds(nodes);
                        assert nodeIds.contains(nodeId) : "Invalid affinity mapping [nodeId=" + nodeId + ", part=" + p + ", state=" + state + ", igniteInstanceName=" + G.ignite(nodeId).name() + ", affNames=" + U.nodes2names(nodes) + ", affIds=" + nodeIds + ']';
                    }
                }
            }
        }
    } finally {
        stopAllGrids();
    }
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) ArrayList(java.util.ArrayList) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap) GridDhtPartitionMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap) Ignite(org.apache.ignite.Ignite) UUID(java.util.UUID) 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 15 with GridDhtPartitionFullMap

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

the class GridCacheDhtPreloadSelfTest method top2string.

/**
     * @param grids Grids
     * @return String representation of all partitions and their state.
     */
@SuppressWarnings({ "ConstantConditions" })
private String top2string(Iterable<Ignite> grids) {
    Map<String, String> map = new HashMap<>();
    for (Ignite g : grids) {
        IgniteCache<Integer, String> c = g.cache(DEFAULT_CACHE_NAME);
        GridDhtCacheAdapter<Integer, String> dht = dht(c);
        GridDhtPartitionFullMap fullMap = dht.topology().partitionMap(false);
        map.put(g.name(), DEBUG ? fullMap.toFullString() : fullMap.toString());
    }
    return "Grid partition maps [" + map.toString() + ']';
}
Also used : HashMap(java.util.HashMap) Ignite(org.apache.ignite.Ignite) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap)

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