@Override public IgniteException apply(IgniteCheckedException e) { ClusterTopologyException topEx = new ClusterTopologyException(e.getMessage(), e); ClusterTopologyCheckedException checked = (ClusterTopologyCheckedException)e; if (checked.retryReadyFuture() != null) topEx.retryReadyFuture(new IgniteFutureImpl<>(checked.retryReadyFuture())); return topEx; } });
/** * Creates new topology exception for cases when primary node leaves grid during mapping. * * @param nested Optional nested exception. * @param nodeId Node ID. * @return Topology exception with user-friendly message. */ private ClusterTopologyCheckedException newTopologyException(@Nullable Throwable nested, UUID nodeId) { ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to acquire lock for keys " + "(primary node left grid, retry transaction if possible) [keys=" + keys + ", node=" + nodeId + ']', nested); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); return topEx; }
/** * Creates new topology exception for cases when primary node leaves grid during mapping. * * @param nested Optional nested exception. * @param nodeId Node ID. * @return Topology exception with user-friendly message. */ private ClusterTopologyCheckedException newTopologyException(@Nullable Throwable nested, UUID nodeId) { ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to acquire lock for keys " + "(primary node left grid, retry transaction if possible) [keys=" + keys + ", node=" + nodeId + ']', nested); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); return topEx; }
/** * Creates new topology exception for cases when primary node leaves grid during mapping. * * @param nodeId Node ID. * @return Topology exception with user-friendly message. */ private ClusterTopologyCheckedException newTopologyException(UUID nodeId) { ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to enlist keys " + "(primary node left grid, retry transaction if possible) [node=" + nodeId + ']'); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); return topEx; }
/** * @param c Closure to run. * @throws IgniteCheckedException If failed. * @return Closure return value. */ private static <T> T retryTopologySafe(IgniteOutClosureX<T> c) throws IgniteCheckedException { for (int i = 0; i < GridCacheAdapter.MAX_RETRIES; i++) { try { return c.applyx(); } catch (IgniteCheckedException e) { if (i == GridCacheAdapter.MAX_RETRIES - 1) throw e; ClusterTopologyCheckedException topErr = e.getCause(ClusterTopologyCheckedException.class); if (topErr == null || (topErr instanceof ClusterTopologyServerNotFoundException)) throw e; IgniteInternalFuture<?> fut = topErr.retryReadyFuture(); if (fut != null) fut.get(); } } assert false; return null; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { if (batches.keySet().contains(nodeId)) { if (log.isDebugEnabled()) log.debug("Found unacknowledged batch for left node [nodeId=" + nodeId + ", fut=" + this + ']'); ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to enlist keys " + "(primary node left grid, retry transaction if possible) [node=" + nodeId + ']'); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); processFailure(topEx, null); batches.remove(nodeId); if (batches.isEmpty()) // Wait for all pending requests. onDone(); } if (log.isDebugEnabled()) log.debug("Future does not have mapping for left node (ignoring) [nodeId=" + nodeId + ", fut=" + this + ']'); return false; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { if (batches.keySet().contains(nodeId)) { if (log.isDebugEnabled()) log.debug("Found unacknowledged batch for left node [nodeId=" + nodeId + ", fut=" + this + ']'); ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to enlist keys " + "(primary node left grid, retry transaction if possible) [node=" + nodeId + ']'); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); processFailure(topEx, null); batches.remove(nodeId); if (batches.isEmpty()) // Wait for all pending requests. onDone(); } if (log.isDebugEnabled()) log.debug("Future does not have mapping for left node (ignoring) [nodeId=" + nodeId + ", fut=" + this + ']'); return false; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { boolean found = false; for (IgniteInternalFuture<?> fut : futures()) { if (fut instanceof MiniFuture) { MiniFuture f = (MiniFuture)fut; if (f.primary().id().equals(nodeId)) { ClusterTopologyCheckedException e = new ClusterTopologyCheckedException("Remote node left grid: " + nodeId); e.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion())); f.onNodeLeft(e); found = true; } } } return found; }
if (topErr.retryReadyFuture() != null) topErr.retryReadyFuture().get(); else U.sleep(1);
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { boolean found = false; for (IgniteInternalFuture<?> fut : futures()) { if (isMini(fut)) { MiniFuture f = (MiniFuture) fut; if (f.primary().id().equals(nodeId)) { ClusterTopologyCheckedException e = new ClusterTopologyCheckedException("Remote node left grid: " + nodeId); e.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion())); f.onNodeLeft(e); found = true; } } } return found; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { boolean found = false; for (IgniteInternalFuture<?> fut : futures()) { if (isMini(fut)) { MiniFuture f = (MiniFuture) fut; if (f.node().id().equals(nodeId)) { ClusterTopologyCheckedException e = new ClusterTopologyCheckedException("Remote node left grid: " + nodeId); e.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion())); f.onNodeLeft(e, true); found = true; } } } return found; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { if (topVer == null) return false; // Local query, do nothing. for (IgniteInternalFuture<?> fut : futures()) { NodeFuture f = (NodeFuture)fut; if (f.node.id().equals(nodeId)) { if (log.isDebugEnabled()) log.debug("Found mini-future for left node [nodeId=" + nodeId + ", mini=" + f + ", fut=" + this + ']'); ClusterTopologyCheckedException topEx = new ClusterTopologyCheckedException("Failed to enlist keys " + "(primary node left grid, retry transaction if possible) [node=" + nodeId + ']'); topEx.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(topVer)); return f.onResult(0, false, topEx); } } if (log.isDebugEnabled()) log.debug("Future does not have mapping for left node (ignoring) [nodeId=" + nodeId + ", fut=" + this + ']'); return false; }
/** * @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(); } }); } }); }
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 req Request. * @return Response to notify about primary failure. */ final GridNearAtomicUpdateResponse primaryFailedResponse(GridNearAtomicAbstractUpdateRequest req) { assert req.response() == null : req; assert req.nodeId() != null : req; if (msgLog.isDebugEnabled()) { msgLog.debug("Near update fut, node left [futId=" + req.futureId() + ", node=" + req.nodeId() + ']'); } GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(cctx.cacheId(), req.nodeId(), req.futureId(), req.partition(), true, cctx.deploymentEnabled()); ClusterTopologyCheckedException e = new ClusterTopologyCheckedException("Primary node left grid " + "before response is received: " + req.nodeId()); e.retryReadyFuture(cctx.shared().nextAffinityReadyFuture(req.topologyVersion())); res.addFailedKeys(req.keys(), e); return res; }
"Cluster topology changed while client transaction is preparing."); err0.retryReadyFuture(affFut);
e.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion()));
e.retryReadyFuture(cctx.nextAffinityReadyFuture(topVer));
ClusterTopologyCheckedException topEx = X.cause(e, ClusterTopologyCheckedException.class); retryFut = topEx.retryReadyFuture();
new ClusterTopologyCheckedException("Backup node left grid: " + backupId); cause.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion())); new ClusterTopologyCheckedException("Primary node left grid: " + nodeId); cause.retryReadyFuture(cctx.nextAffinityReadyFuture(tx.topologyVersion()));