Search in sources :

Example 1 with DiscoveryEvent

use of org.apache.ignite.events.DiscoveryEvent in project ignite by apache.

the class GridDhtPreloader method assign.

/** {@inheritDoc} */
@Override
public GridDhtPreloaderAssignments assign(GridDhtPartitionsExchangeFuture exchFut) {
    // No assignments for disabled preloader.
    GridDhtPartitionTopology top = cctx.dht().topology();
    if (!cctx.rebalanceEnabled() || !cctx.shared().kernalContext().state().active())
        return new GridDhtPreloaderAssignments(exchFut, top.topologyVersion());
    int partCnt = cctx.affinity().partitions();
    assert exchFut.forcePreload() || exchFut.dummyReassign() || exchFut.exchangeId().topologyVersion().equals(top.topologyVersion()) : "Topology version mismatch [exchId=" + exchFut.exchangeId() + ", cache=" + cctx.name() + ", topVer=" + top.topologyVersion() + ']';
    GridDhtPreloaderAssignments assigns = new GridDhtPreloaderAssignments(exchFut, top.topologyVersion());
    AffinityTopologyVersion topVer = assigns.topologyVersion();
    for (int p = 0; p < partCnt; p++) {
        if (cctx.shared().exchange().hasPendingExchange()) {
            if (log.isDebugEnabled())
                log.debug("Skipping assignments creation, exchange worker has pending assignments: " + exchFut.exchangeId());
            assigns.cancelled(true);
            return assigns;
        }
        // If partition belongs to local node.
        if (cctx.affinity().partitionLocalNode(p, topVer)) {
            GridDhtLocalPartition part = top.localPartition(p, topVer, true);
            assert part != null;
            assert part.id() == p;
            if (part.state() != MOVING) {
                if (log.isDebugEnabled())
                    log.debug("Skipping partition assignment (state is not MOVING): " + part);
                // For.
                continue;
            }
            Collection<ClusterNode> picked = pickedOwners(p, topVer);
            if (picked.isEmpty()) {
                top.own(part);
                if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
                    DiscoveryEvent discoEvt = exchFut.discoveryEvent();
                    cctx.events().addPreloadEvent(p, EVT_CACHE_REBALANCE_PART_DATA_LOST, discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
                }
                if (log.isDebugEnabled())
                    log.debug("Owning partition as there are no other owners: " + part);
            } else {
                ClusterNode n = F.rand(picked);
                GridDhtPartitionDemandMessage msg = assigns.get(n);
                if (msg == null) {
                    assigns.put(n, msg = new GridDhtPartitionDemandMessage(top.updateSequence(), exchFut.exchangeId().topologyVersion(), cctx.cacheId()));
                }
                msg.addPartition(p);
            }
        }
    }
    return assigns;
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) GridDhtPartitionTopology(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) GridDhtLocalPartition(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition)

Example 2 with DiscoveryEvent

use of org.apache.ignite.events.DiscoveryEvent in project ignite by apache.

the class GridCachePartitionExchangeManager method mergeExchangesOnCoordinator.

/**
 * @param curFut Current active exchange future.
 * @return {@code False} if need wait messages for merged exchanges.
 */
public boolean mergeExchangesOnCoordinator(GridDhtPartitionsExchangeFuture curFut) {
    if (IGNITE_EXCHANGE_MERGE_DELAY > 0) {
        try {
            U.sleep(IGNITE_EXCHANGE_MERGE_DELAY);
        } catch (IgniteInterruptedCheckedException e) {
            U.warn(log, "Failed to wait for exchange merge, thread interrupted: " + e);
            return true;
        }
    }
    AffinityTopologyVersion exchMergeTestWaitVer = this.exchMergeTestWaitVer;
    if (exchMergeTestWaitVer != null) {
        if (log.isInfoEnabled()) {
            log.info("Exchange merge test, waiting for version [exch=" + curFut.initialVersion() + ", waitVer=" + exchMergeTestWaitVer + ']');
        }
        long end = U.currentTimeMillis() + 10_000;
        while (U.currentTimeMillis() < end) {
            boolean found = false;
            for (CachePartitionExchangeWorkerTask task : exchWorker.futQ) {
                if (task instanceof GridDhtPartitionsExchangeFuture) {
                    GridDhtPartitionsExchangeFuture fut = (GridDhtPartitionsExchangeFuture) task;
                    if (exchMergeTestWaitVer.equals(fut.initialVersion())) {
                        if (log.isInfoEnabled())
                            log.info("Exchange merge test, found awaited version: " + exchMergeTestWaitVer);
                        found = true;
                        break;
                    }
                }
            }
            if (found)
                break;
            else {
                try {
                    U.sleep(100);
                } catch (IgniteInterruptedCheckedException e) {
                    break;
                }
            }
        }
        this.exchMergeTestWaitVer = null;
    }
    synchronized (curFut.mutex()) {
        int awaited = 0;
        for (CachePartitionExchangeWorkerTask task : exchWorker.futQ) {
            if (task instanceof GridDhtPartitionsExchangeFuture) {
                GridDhtPartitionsExchangeFuture fut = (GridDhtPartitionsExchangeFuture) task;
                DiscoveryEvent evt = fut.firstEvent();
                if (evt.type() == EVT_DISCOVERY_CUSTOM_EVT) {
                    if (log.isInfoEnabled())
                        log.info("Stop merge, custom event found: " + evt);
                    break;
                }
                ClusterNode node = evt.eventNode();
                if (!curFut.context().supportsMergeExchanges(node)) {
                    if (log.isInfoEnabled())
                        log.info("Stop merge, node does not support merge: " + node);
                    break;
                }
                if (evt.type() == EVT_NODE_JOINED && cctx.cache().hasCachesReceivedFromJoin(node)) {
                    if (log.isInfoEnabled())
                        log.info("Stop merge, received caches from node: " + node);
                    break;
                }
                if (log.isInfoEnabled()) {
                    log.info("Merge exchange future [curFut=" + curFut.initialVersion() + ", mergedFut=" + fut.initialVersion() + ", evt=" + IgniteUtils.gridEventName(fut.firstEvent().type()) + ", evtNode=" + fut.firstEvent().eventNode().id() + ", evtNodeClient=" + CU.clientNode(fut.firstEvent().eventNode()) + ']');
                }
                curFut.context().events().addEvent(fut.initialVersion(), fut.firstEvent(), fut.firstEventCache());
                if (evt.type() == EVT_NODE_JOINED) {
                    if (fut.mergeJoinExchange(curFut))
                        awaited++;
                }
            } else {
                if (!task.skipForExchangeMerge()) {
                    if (log.isInfoEnabled())
                        log.info("Stop merge, custom task found: " + task);
                    break;
                }
            }
        }
        return awaited == 0;
    }
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteInterruptedCheckedException(org.apache.ignite.internal.IgniteInterruptedCheckedException) GridDhtPartitionsExchangeFuture(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent)

Example 3 with DiscoveryEvent

use of org.apache.ignite.events.DiscoveryEvent in project ignite by apache.

the class IgfsDataManager method start0.

/**
 * {@inheritDoc}
 */
@Override
protected void start0() throws IgniteCheckedException {
    dataCacheStartLatch = new CountDownLatch(1);
    String igfsName = igfsCtx.configuration().getName();
    topic = F.isEmpty(igfsName) ? TOPIC_IGFS : TOPIC_IGFS.topic(igfsName);
    igfsCtx.kernalContext().io().addMessageListener(topic, new GridMessageListener() {

        @Override
        public void onMessage(UUID nodeId, Object msg, byte plc) {
            if (msg instanceof IgfsBlocksMessage)
                processBlocksMessage(nodeId, (IgfsBlocksMessage) msg);
            else if (msg instanceof IgfsAckMessage)
                processAckMessage(nodeId, (IgfsAckMessage) msg);
        }
    });
    igfsCtx.kernalContext().event().addLocalEventListener(new GridLocalEventListener() {

        @Override
        public void onEvent(Event evt) {
            assert evt.type() == EVT_NODE_FAILED || evt.type() == EVT_NODE_LEFT;
            DiscoveryEvent discoEvt = (DiscoveryEvent) evt;
            if (igfsCtx.igfsNode(discoEvt.eventNode())) {
                for (WriteCompletionFuture future : pendingWrites.values()) {
                    future.onError(discoEvt.eventNode().id(), new ClusterTopologyCheckedException("Node left grid before write completed: " + evt.node().id()));
                }
            }
        }
    }, EVT_NODE_LEFT, EVT_NODE_FAILED);
    delWorker = new AsyncDeleteWorker(igfsCtx.kernalContext().igniteInstanceName(), "igfs-" + igfsName + "-delete-worker", log);
    dataCacheName = igfsCtx.configuration().getDataCacheConfiguration().getName();
}
Also used : GridLocalEventListener(org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener) GridMessageListener(org.apache.ignite.internal.managers.communication.GridMessageListener) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) CountDownLatch(java.util.concurrent.CountDownLatch) Event(org.apache.ignite.events.Event) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) UUID(java.util.UUID) ClusterTopologyCheckedException(org.apache.ignite.internal.cluster.ClusterTopologyCheckedException)

Example 4 with DiscoveryEvent

use of org.apache.ignite.events.DiscoveryEvent in project ignite by apache.

the class GridDhtPartitionTopologyImpl method afterExchange.

/**
 * {@inheritDoc}
 */
@Override
public boolean afterExchange(GridDhtPartitionsExchangeFuture exchFut) {
    boolean changed = false;
    int num = grp.affinity().partitions();
    AffinityTopologyVersion topVer = exchFut.context().events().topologyVersion();
    assert grp.affinity().lastVersion().equals(topVer) : "Affinity is not initialized " + "[grp=" + grp.cacheOrGroupName() + ", topVer=" + topVer + ", affVer=" + grp.affinity().lastVersion() + ", fut=" + exchFut + ']';
    ctx.database().checkpointReadLock();
    try {
        lock.writeLock().lock();
        try {
            if (stopping)
                return false;
            assert readyTopVer.initialized() : readyTopVer;
            assert lastTopChangeVer.equals(readyTopVer);
            if (log.isDebugEnabled()) {
                log.debug("Partition map before afterExchange [grp=" + grp.cacheOrGroupName() + ", exchId=" + exchFut.exchangeId() + ", fullMap=" + fullMapString() + ']');
            }
            long updateSeq = this.updateSeq.incrementAndGet();
            for (int p = 0; p < num; p++) {
                GridDhtLocalPartition locPart = localPartition0(p, topVer, false, false, false);
                if (partitionLocalNode(p, topVer)) {
                    // which obviously has not happened at this point.
                    if (locPart == null) {
                        if (log.isDebugEnabled()) {
                            log.debug("Skipping local partition afterExchange (will not create) [" + "grp=" + grp.cacheOrGroupName() + ", p=" + p + ']');
                        }
                        continue;
                    }
                    GridDhtPartitionState state = locPart.state();
                    if (state == MOVING) {
                        if (grp.rebalanceEnabled()) {
                            Collection<ClusterNode> owners = owners(p);
                            // If there are no other owners, then become an owner.
                            if (F.isEmpty(owners)) {
                                boolean owned = locPart.own();
                                assert owned : "Failed to own partition [grp=" + grp.cacheOrGroupName() + ", locPart=" + locPart + ']';
                                updateSeq = updateLocal(p, locPart.state(), updateSeq, topVer);
                                changed = true;
                                if (grp.eventRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
                                    DiscoveryEvent discoEvt = exchFut.events().lastEvent();
                                    grp.addRebalanceEvent(p, EVT_CACHE_REBALANCE_PART_DATA_LOST, discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
                                }
                                if (log.isDebugEnabled()) {
                                    log.debug("Owned partition [grp=" + grp.cacheOrGroupName() + ", part=" + locPart + ']');
                                }
                            } else if (log.isDebugEnabled())
                                log.debug("Will not own partition (there are owners to rebalance from) [grp=" + grp.cacheOrGroupName() + ", locPart=" + locPart + ", owners = " + owners + ']');
                        } else
                            updateSeq = updateLocal(p, locPart.state(), updateSeq, topVer);
                    }
                } else {
                    if (locPart != null) {
                        GridDhtPartitionState state = locPart.state();
                        if (state == MOVING) {
                            locPart.rent(false);
                            updateSeq = updateLocal(p, locPart.state(), updateSeq, topVer);
                            changed = true;
                            if (log.isDebugEnabled()) {
                                log.debug("Evicting " + state + " partition (it does not belong to affinity) [" + "grp=" + grp.cacheOrGroupName() + ", part=" + locPart + ']');
                            }
                        }
                    }
                }
            }
            AffinityAssignment aff = grp.affinity().readyAffinity(topVer);
            if (node2part != null && node2part.valid())
                changed |= checkEvictions(updateSeq, aff);
            updateRebalanceVersion(aff.assignment());
            consistencyCheck();
        } finally {
            lock.writeLock().unlock();
        }
    } finally {
        ctx.database().checkpointReadUnlock();
    }
    return changed;
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) AffinityAssignment(org.apache.ignite.internal.processors.affinity.AffinityAssignment) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent)

Example 5 with DiscoveryEvent

use of org.apache.ignite.events.DiscoveryEvent in project ignite by apache.

the class GridDhtPartitionTopologyImpl method beforeExchange.

/**
 * {@inheritDoc}
 */
@Override
public void beforeExchange(GridDhtPartitionsExchangeFuture exchFut, boolean affReady, boolean updateMoving) throws IgniteCheckedException {
    ClusterNode loc = ctx.localNode();
    ctx.database().checkpointReadLock();
    try {
        synchronized (ctx.exchange().interruptLock()) {
            if (Thread.currentThread().isInterrupted())
                throw new IgniteInterruptedCheckedException("Thread is interrupted: " + Thread.currentThread());
            U.writeLock(lock);
            try {
                if (stopping)
                    return;
                assert lastTopChangeVer.equals(exchFut.initialVersion()) : "Invalid topology version [topVer=" + lastTopChangeVer + ", exchId=" + exchFut.exchangeId() + ']';
                ExchangeDiscoveryEvents evts = exchFut.context().events();
                if (affReady) {
                    assert grp.affinity().lastVersion().equals(evts.topologyVersion()) : "Invalid affinity version [" + "grp=" + grp.cacheOrGroupName() + ", affVer=" + grp.affinity().lastVersion() + ", evtsVer=" + evts.topologyVersion() + ']';
                    lastTopChangeVer = readyTopVer = evts.topologyVersion();
                }
                ClusterNode oldest = discoCache.oldestAliveServerNode();
                if (log.isDebugEnabled()) {
                    log.debug("Partition map beforeExchange [grp=" + grp.cacheOrGroupName() + ", exchId=" + exchFut.exchangeId() + ", fullMap=" + fullMapString() + ']');
                }
                long updateSeq = this.updateSeq.incrementAndGet();
                cntrMap.clear();
                boolean grpStarted = exchFut.cacheGroupAddedOnExchange(grp.groupId(), grp.receivedFrom());
                // If this is the oldest node.
                if (oldest != null && (loc.equals(oldest) || grpStarted)) {
                    if (node2part == null) {
                        node2part = new GridDhtPartitionFullMap(oldest.id(), oldest.order(), updateSeq);
                        if (log.isDebugEnabled()) {
                            log.debug("Created brand new full topology map on oldest node [" + "grp=" + grp.cacheOrGroupName() + ", exchId=" + exchFut.exchangeId() + ", fullMap=" + fullMapString() + ']');
                        }
                    } else if (!node2part.valid()) {
                        node2part = new GridDhtPartitionFullMap(oldest.id(), oldest.order(), updateSeq, node2part, false);
                        if (log.isDebugEnabled()) {
                            log.debug("Created new full topology map on oldest node [" + "grp=" + grp.cacheOrGroupName() + ", exchId=" + exchFut.exchangeId() + ", fullMap=" + node2part + ']');
                        }
                    } else if (!node2part.nodeId().equals(loc.id())) {
                        node2part = new GridDhtPartitionFullMap(oldest.id(), oldest.order(), updateSeq, node2part, false);
                        if (log.isDebugEnabled()) {
                            log.debug("Copied old map into new map on oldest node (previous oldest node left) [" + "grp=" + grp.cacheOrGroupName() + ", exchId=" + exchFut.exchangeId() + ", fullMap=" + fullMapString() + ']');
                        }
                    }
                }
                if (evts.hasServerLeft()) {
                    List<DiscoveryEvent> evts0 = evts.events();
                    for (int i = 0; i < evts0.size(); i++) {
                        DiscoveryEvent evt = evts0.get(i);
                        if (ExchangeDiscoveryEvents.serverLeftEvent(evt))
                            removeNode(evt.eventNode().id());
                    }
                }
                if (grp.affinityNode()) {
                    if (grpStarted || exchFut.firstEvent().type() == EVT_DISCOVERY_CUSTOM_EVT || exchFut.serverNodeDiscoveryEvent()) {
                        if (affReady) {
                            assert grp.affinity().lastVersion().equals(evts.topologyVersion());
                            initPartitions0(evts.topologyVersion(), exchFut, updateSeq);
                        } else {
                            assert !exchFut.context().mergeExchanges();
                            List<List<ClusterNode>> aff = grp.affinity().idealAssignment();
                            createPartitions(exchFut.initialVersion(), aff, updateSeq);
                        }
                    }
                }
                consistencyCheck();
                if (updateMoving) {
                    assert grp.affinity().lastVersion().equals(evts.topologyVersion());
                    createMovingPartitions(grp.affinity().readyAffinity(evts.topologyVersion()));
                }
                if (log.isDebugEnabled()) {
                    log.debug("Partition map after beforeExchange [grp=" + grp.cacheOrGroupName() + ", " + "exchId=" + exchFut.exchangeId() + ", fullMap=" + fullMapString() + ']');
                }
            } finally {
                lock.writeLock().unlock();
            }
        }
    } finally {
        ctx.database().checkpointReadUnlock();
    }
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteInterruptedCheckedException(org.apache.ignite.internal.IgniteInterruptedCheckedException) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) List(java.util.List) ArrayList(java.util.ArrayList) ExchangeDiscoveryEvents(org.apache.ignite.internal.processors.cache.ExchangeDiscoveryEvents) GridDhtPartitionFullMap(org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap)

Aggregations

DiscoveryEvent (org.apache.ignite.events.DiscoveryEvent)111 Event (org.apache.ignite.events.Event)56 UUID (java.util.UUID)49 ClusterNode (org.apache.ignite.cluster.ClusterNode)45 CountDownLatch (java.util.concurrent.CountDownLatch)30 Ignite (org.apache.ignite.Ignite)29 Test (org.junit.Test)27 AffinityTopologyVersion (org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion)25 GridLocalEventListener (org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener)24 GridCommonAbstractTest (org.apache.ignite.testframework.junits.common.GridCommonAbstractTest)23 ArrayList (java.util.ArrayList)20 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)18 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)17 List (java.util.List)16 Collection (java.util.Collection)12 HashMap (java.util.HashMap)12 Map (java.util.Map)11 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)11 IgniteInterruptedCheckedException (org.apache.ignite.internal.IgniteInterruptedCheckedException)11 GridMessageListener (org.apache.ignite.internal.managers.communication.GridMessageListener)10