/** * Gets ready future for the next affinity topology version (used in cases when a node leaves grid). * * @param curVer Current topology version (before a node left grid). * @return Ready future. */ public IgniteInternalFuture<?> nextAffinityReadyFuture(AffinityTopologyVersion curVer) { if (curVer == null) return null; AffinityTopologyVersion nextVer = new AffinityTopologyVersion(curVer.topologyVersion() + 1); IgniteInternalFuture<?> fut = exchMgr.affinityReadyFuture(nextVer); return fut == null ? new GridFinishedFuture<>() : fut; }
/** * @param topVer Topology version. * @throws IgniteCheckedException If failed. */ public void awaitForReadyTopologyVersion(AffinityTopologyVersion topVer) throws IgniteCheckedException { IgniteInternalFuture<?> fut = ctx.cache().context().exchange().affinityReadyFuture(topVer); if (fut != null) fut.get(); }
/** * @param topVer Topology version. */ private void awaitVersionAndRemap(AffinityTopologyVersion topVer){ IgniteInternalFuture<AffinityTopologyVersion> awaitTopologyVersionFuture = cctx.shared().exchange().affinityReadyFuture(topVer); awaitTopologyVersionFuture.listen(f -> { try { remap(f.get()); } catch (IgniteCheckedException e) { onDone(e); } }); }
/** */ private void remap(@NotNull AffinityTopologyVersion mapVer, @NotNull MvccSnapshotResponseListener lsnr) { if (log.isDebugEnabled()) log.debug("Mvcc coordinator failed or reassigned, need remap."); AffinityTopologyVersion topVer0 = topVer; if (topVer0 != null && topVer0.compareTo(mapVer) >= 0) mapVer = topVer0.nextMinorVersion(); // Topology version can grow only. assert topVer0 == null || mapVer.compareTo(topVer0) > 0 : "topVer=" + topVer0 + ", nextTopVer=" + mapVer; IgniteInternalFuture<AffinityTopologyVersion> readyFut = cctx.shared().exchange().affinityReadyFuture(mapVer); assert readyFut != null; // Cannot be null. if (readyFut.isDone()) onAffinityReady(readyFut, lsnr); else readyFut.listen(fut -> onAffinityReady(fut, lsnr)); }
/** * @param remapTopVer New topology version. */ private void waitAndRemap(AffinityTopologyVersion remapTopVer) { if (topLocked) { CachePartialUpdateCheckedException e = new CachePartialUpdateCheckedException("Failed to update keys (retry update if possible)."); ClusterTopologyCheckedException cause = new ClusterTopologyCheckedException( "Failed to update keys, topology changed while execute atomic update inside transaction."); cause.retryReadyFuture(cctx.shared().exchange().affinityReadyFuture(remapTopVer)); e.add(Collections.singleton(cctx.toCacheKeyObject(key)), cause); completeFuture(null, e, null); return; } IgniteInternalFuture<AffinityTopologyVersion> fut = cctx.shared().exchange().affinityReadyFuture(remapTopVer); if (fut == null) fut = new GridFinishedFuture<>(remapTopVer); fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() { @Override public void apply(final IgniteInternalFuture<AffinityTopologyVersion> fut) { cctx.kernalContext().closure().runLocalSafe(new Runnable() { @Override public void run() { mapOnTopology(); } }); } }); }
/** * @param expNodes Expected nodes number. * @param topVer Topology version. * @return Affinity futures. */ private List<IgniteInternalFuture<?>> affFutures(int expNodes, AffinityTopologyVersion topVer) { List<Ignite> nodes = G.allGrids(); assertEquals(expNodes, nodes.size()); List<IgniteInternalFuture<?>> futs = new ArrayList<>(nodes.size()); for (Ignite node : nodes) { IgniteInternalFuture<?> fut = ((IgniteKernal)node).context().cache().context().exchange().affinityReadyFuture(topVer); futs.add(fut); } return futs; }
/** * @param c Closure to run. * @param topVer Topology version to wait for. * @param async Async flag. */ private void waitAffinityAndRun(final Runnable c, long topVer, boolean async) { AffinityTopologyVersion topVer0 = new AffinityTopologyVersion(topVer, 0); IgniteInternalFuture<?> fut = ctx.cache().context().exchange().affinityReadyFuture(topVer0); if (fut != null && !fut.isDone()) { fut.listen(new CI1<IgniteInternalFuture<?>>() { @Override public void apply(IgniteInternalFuture<?> fut) { ctx.closure().runLocalSafe(c, true); } }); } else { if (async) ctx.closure().runLocalSafe(c, true); else c.run(); } }
private void waitAndRemap(AffinityTopologyVersion remapTopVer) { assert remapTopVer != null; if (topLocked) { assert !F.isEmpty(remapKeys) : remapKeys; CachePartialUpdateCheckedException e = new CachePartialUpdateCheckedException("Failed to update keys (retry update if possible)."); ClusterTopologyCheckedException cause = new ClusterTopologyCheckedException( "Failed to update keys, topology changed while execute atomic update inside transaction."); cause.retryReadyFuture(cctx.shared().exchange().affinityReadyFuture(remapTopVer)); e.add(remapKeys, cause); completeFuture(null, e, null); return; } IgniteInternalFuture<AffinityTopologyVersion> fut = cctx.shared().exchange().affinityReadyFuture(remapTopVer); if (fut == null) fut = new GridFinishedFuture<>(remapTopVer); fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() { @Override public void apply(final IgniteInternalFuture<AffinityTopologyVersion> fut) { cctx.kernalContext().closure().runLocalSafe(new Runnable() { @Override public void run() { mapOnTopology(); } }); } }); }
/** * @param ctx Context. * @throws IgniteCheckedException In case of error. */ void waitTopologyFuture(GridKernalContext ctx) throws IgniteCheckedException { GridCacheContext<K, V> cctx = cacheContext(ctx); if (!cctx.isLocal()) { AffinityTopologyVersion topVer = initTopVer; cacheContext(ctx).shared().exchange().affinityReadyFuture(topVer).get(); for (int partId = 0; partId < cacheContext(ctx).affinity().partitions(); partId++) getOrCreatePartitionRecovery(ctx, partId, topVer); } }
/** * @param topVer Topology version. * @param node Node. * @return Exchange future. */ private IgniteInternalFuture<?> affinityReadyFuture(AffinityTopologyVersion topVer, Ignite node) { IgniteInternalFuture<?> fut = ((IgniteKernal)node).context().cache().context().exchange(). affinityReadyFuture(topVer); return fut != null ? fut : new GridFinishedFuture<>(); }
/** * Ensures that cache has been started and is ready to store streamed data. */ private void ensureCacheStarted() { DynamicCacheDescriptor desc = ctx.cache().cacheDescriptor(cacheName); assert desc != null; if (desc.startTopologyVersion() == null) return; IgniteInternalFuture<?> affReadyFut = ctx.cache().context().exchange() .affinityReadyFuture(desc.startTopologyVersion()); if (affReadyFut != null) { try { affReadyFut.get(); } catch (IgniteCheckedException ex) { throw new IgniteException(ex); } } }
@Override public Void call() throws Exception { for (T2<DynamicCacheChangeRequest, AffinityTopologyVersion> t : reqsToComplete) { final DynamicCacheChangeRequest req = t.get1(); AffinityTopologyVersion waitTopVer = t.get2(); IgniteInternalFuture<?> fut = waitTopVer != null ? ctx.cache().context().exchange().affinityReadyFuture(waitTopVer) : null; if (fut == null || fut.isDone()) ctx.cache().completeCacheStartFuture(req, false, null); else { fut.listen(new IgniteInClosure<IgniteInternalFuture<?>>() { @Override public void apply(IgniteInternalFuture<?> fut) { ctx.cache().completeCacheStartFuture(req, false, null); } }); } } return null; } });
/** * Holds (suspends) job execution until our cache version becomes equal to remote cache's version. * * @return {@code True} if topology check passed. */ private boolean waitAffinityReadyFuture() { GridCacheProcessor cacheProc = ((IgniteEx)ignite).context().cache(); AffinityTopologyVersion locTopVer = cacheProc.context().exchange().readyAffinityVersion(); if (locTopVer.compareTo(topVer) < 0) { IgniteInternalFuture<?> fut = cacheProc.context().exchange().affinityReadyFuture(topVer); if (fut != null && !fut.isDone()) { jobCtx.holdcc(); fut.listen(new CI1<IgniteInternalFuture<?>>() { @Override public void apply(IgniteInternalFuture<?> t) { ((IgniteEx)ignite).context().closure().runLocalSafe(new Runnable() { @Override public void run() { jobCtx.callcc(); } }, false); } }); return false; } } return true; } }
pendingTopVer = newTopVer; else { IgniteInternalFuture<?> affReadyFut = ctx.cache().context().exchange().affinityReadyFuture(initTopVer);
/** * @param expNodes Expected nodes number. * @param topVer Topology version. * @throws Exception If failed. */ private void checkOrderCounters(int expNodes, AffinityTopologyVersion topVer) throws Exception { List<Ignite> nodes = G.allGrids(); Long order = null; for (Ignite node : nodes) { IgniteKernal node0 = (IgniteKernal)node; if (node0.configuration().isClientMode()) continue; IgniteInternalFuture<?> fut = node0.context().cache().context().exchange().affinityReadyFuture(topVer); if (fut != null) fut.get(); AtomicLong orderCntr = GridTestUtils.getFieldValue(node0.context().cache().context().versions(), "order"); log.info("Order [node=" + node0.name() + ", order=" + orderCntr.get() + ']'); if (order == null) order = orderCntr.get(); else assertEquals(order, (Long)orderCntr.get()); } assertEquals(expNodes, nodes.size()); }
parent.cctx.exchange().affinityReadyFuture(res.clientRemapVersion());
@Override public void apply(IgniteInternalFuture<Boolean> remapFut0) { try { IgniteInternalFuture<?> affFut = parent.cctx.exchange().affinityReadyFuture(res.clientRemapVersion());
/** * Waits for the topology version to be not less than one registered on source node. * * @param src Source node. * @throws IgniteCheckedException If failed to wait on affinity ready future. */ protected void alignCacheTopologyVersion(Ignite src) throws IgniteCheckedException { AffinityTopologyVersion topVer = ((IgniteEx)src).context().cache().context().exchange().readyAffinityVersion(); info("Will wait for topology version on all nodes: " + topVer); for (Ignite ignite : Ignition.allGrids()) { IgniteInternalFuture<?> ready = ((IgniteEx)ignite).context().cache().context().exchange() .affinityReadyFuture(topVer); if (ready != null) ready.get(); } }
/** * @param seg Cluster segment. * @param topVer Topology version to wait for. */ protected void awaitExchangeVersionFinished(Collection<Ignite> seg, long topVer) { AffinityTopologyVersion waitTopVer = new AffinityTopologyVersion(topVer, 0); for (Ignite grid : seg) { IgniteInternalFuture<?> exchFut = ((IgniteEx)grid).context().cache().context().exchange().affinityReadyFuture(waitTopVer); if (exchFut != null && !exchFut.isDone()) { try { if (log.isDebugEnabled()) log.debug("Waiting for topology exchange future [grid=" + grid.name() + ", ver=" + topVer + ", curTopVer=" + grid.cluster().topologyVersion() + "]" ); exchFut.get(); } catch (IgniteCheckedException e) { log.error("Failed to wait for exchange [topVer=" + waitTopVer + ", node=" + grid.name() + ']', e); } } if (log.isDebugEnabled()) log.debug("Finished topology exchange future [grid=" + grid.name() + ", curTopVer=" + grid.cluster().topologyVersion() + "]" ); } }
IgniteInternalFuture<?> fut = grid(0).context().cache().context().exchange().affinityReadyFuture(topVer);