/** {@inheritDoc} */ @SuppressWarnings("NonPrivateFieldAccessedInSynchronizedContext") @Override protected void onNodeLeft(UUID nodeId) { boolean callOnPage; synchronized (this) { callOnPage = !loc && subgrid.contains(nodeId); } if (callOnPage) onPage(nodeId, Collections.emptyList(), new ClusterTopologyCheckedException("Remote node has left topology: " + nodeId), true); }
@Override public void run() { buf0.onNodeLeft(); if (futs != null) { Throwable ex = new ClusterTopologyCheckedException( "Failed to wait for request completion (node has left): " + nodeId); for (int i = 0; i < futs.size(); i++) futs.get(i).onDone(ex); } } }, ctx.discovery().topologyVersion(), false);
/** */ private void onCoordinatorFailed(UUID nodeId) { // 1. Notify all listeners waiting for a snapshot. Map<Long, MvccSnapshotResponseListener> map = snapLsnrs.remove(nodeId); if (map != null) { ClusterTopologyCheckedException ex = new ClusterTopologyCheckedException("Failed to request mvcc " + "version, coordinator left: " + nodeId); MvccSnapshotResponseListener lsnr; for (Long id : map.keySet()) { if ((lsnr = map.remove(id)) != null) lsnr.onError(ex); } } // 2. Notify acknowledge futures. for (WaitAckFuture fut : ackFuts.values()) fut.onNodeLeft(nodeId); }
/** * 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 nodeId Destination node ID. * @param msg Message. * @param orderedTopic Topic for ordered notifications. * If {@code null}, non-ordered message will be sent. * @param ackC Ack closure. * @throws IgniteCheckedException In case of error. */ private void sendWithRetries(UUID nodeId, GridContinuousMessage msg, @Nullable Object orderedTopic, IgniteInClosure<IgniteException> ackC) throws IgniteCheckedException { assert nodeId != null; assert msg != null; ClusterNode node = ctx.discovery().node(nodeId); if (node != null) sendWithRetries(node, msg, orderedTopic, ackC); else throw new ClusterTopologyCheckedException("Node for provided ID doesn't exist (did it leave the grid?): " + nodeId); }
/** * @param nodeId Id of destination node. * @param topic Topic to send the message to. * @param msg Message to send. * @param plc Type of processing. * @throws IgniteCheckedException Thrown in case of any errors. */ public void sendToCustomTopic(UUID nodeId, Object topic, Message msg, byte plc) throws IgniteCheckedException { ClusterNode node = ctx.discovery().node(nodeId); if (node == null) throw new ClusterTopologyCheckedException("Failed to send message to node (has node left grid?): " + nodeId); sendToCustomTopic(node, topic, msg, plc); }
/** * Sends communication message. * * @param nodeId ID of node to send the message to. * @param msg Message to send. * @param plc IO policy. * @throws IgniteCheckedException If sending failed. */ public void send(UUID nodeId, GridCacheMessage msg, byte plc) throws IgniteCheckedException { ClusterNode n = cctx.discovery().node(nodeId); if (n == null) throw new ClusterTopologyCheckedException("Failed to send message because node left grid [nodeId=" + nodeId + ", msg=" + msg + ']'); send(n, msg, plc); }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { try { if (nearNodeId.equals(nodeId)) onDone(new ClusterTopologyCheckedException("Requesting node left the grid [nodeId=" + nodeId + ']')); else if (pending != null && pending.remove(nodeId) != null) cctx.kernalContext().closure().runLocalSafe(() -> continueLoop(false)); } catch (Exception e) { onDone(e); } return false; }
/** {@inheritDoc} */ @Override public boolean onNodeLeft(UUID nodeId) { boolean found = false; for (IgniteInternalFuture<Map<K, V>> fut : futures()) if (isMini(fut)) { AbstractMiniFuture f = (AbstractMiniFuture)fut; if (f.node().id().equals(nodeId)) { found = true; f.onNodeLeft(new ClusterTopologyCheckedException("Remote node left grid (will retry): " + nodeId)); } } return found; }
/** * @param nodeId Id of destination node. * @param topic Topic to send the message to. * @param msg Message to send. * @param plc Type of processing. * @throws IgniteCheckedException Thrown in case of any errors. */ public void sendToGridTopic(UUID nodeId, GridTopic topic, Message msg, byte plc) throws IgniteCheckedException { ClusterNode node = ctx.discovery().node(nodeId); if (node == null) throw new ClusterTopologyCheckedException("Failed to send message to node (has node left grid?): " + nodeId); send(node, topic, topic.ordinal(), msg, plc, false, 0, false, null, 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; }
/** * @param topVer Topology version. */ private boolean checkRetryPermits(AffinityTopologyVersion topVer) { if (topVer.equals(this.topVer)) return true; if (REMAP_CNT_UPD.incrementAndGet(this) > MAX_REMAP_CNT) { ClusterNode node0 = node; onDone(new ClusterTopologyCheckedException("Failed to remap key to a new node after " + MAX_REMAP_CNT + " attempts (key got remapped to the same node) [key=" + key + ", node=" + (node0 != null ? U.toShortString(node0) : node0) + ", invalidNodes=" + invalidNodes + ']')); return false; } return true; }
/** {@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; }
@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);
/** {@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; }
/** * Checks whether new coordinator was initialized after the snapshot is acquired. * * Need to fit invariant that all updates are finished before a new coordinator is initialized. * * @throws ClusterTopologyCheckedException If failed. */ private void checkCoordinatorVersion() throws ClusterTopologyCheckedException { MvccCoordinator crd = cctx.shared().coordinators().currentCoordinator(); if (!crd.initialized() || crd.version() != mvccSnapshot.coordinatorVersion()) throw new ClusterTopologyCheckedException("Cannot perform update, coordinator was changed: " + "[currentCoordinator=" + crd + ", mvccSnapshot=" + mvccSnapshot + "]."); }
/** {@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; }