Search in sources :

Example 1 with NodeIdMessage

use of org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage in project ignite by apache.

the class InboundConnectionHandler method onMessage.

/**
 * {@inheritDoc}
 */
@Override
public void onMessage(final GridNioSession ses, Message msg) {
    Span span = MTC.span();
    span.addLog(() -> "Communication received");
    span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
    ConnectionKey connKey = ses.meta(CONN_IDX_META);
    if (connKey == null) {
        assert ses.accepted() : ses;
        if (!connectGate.tryEnter()) {
            if (log.isDebugEnabled())
                log.debug("Close incoming connection, failed to enter gateway.");
            ses.send(new RecoveryLastReceivedMessage(NODE_STOPPING)).listen(fut -> ses.close());
            return;
        }
        try {
            onFirstMessage(ses, msg);
        } finally {
            connectGate.leave();
        }
    } else {
        if (isChannelConnIdx(connKey.connectionIndex())) {
            if (ses.meta(CHANNEL_FUT_META) == null)
                nioSrvWrapper.onChannelCreate((GridSelectorNioSessionImpl) ses, connKey, msg);
            else {
                GridFutureAdapter<Channel> fut = ses.meta(CHANNEL_FUT_META);
                GridSelectorNioSessionImpl ses0 = (GridSelectorNioSessionImpl) ses;
                ses0.closeSocketOnSessionClose(false);
                ses0.close().listen(f -> {
                    if (f.error() != null) {
                        fut.onDone(f.error());
                        return;
                    }
                    fut.onDone(ses0.key().channel());
                });
            }
            return;
        }
        Object consistentId = ses.meta(CONSISTENT_ID_META);
        assert consistentId != null;
        if (msg instanceof RecoveryLastReceivedMessage) {
            metricsLsnr.onMessageReceived(msg, consistentId);
            GridNioRecoveryDescriptor recovery = ses.outRecoveryDescriptor();
            if (recovery != null) {
                RecoveryLastReceivedMessage msg0 = (RecoveryLastReceivedMessage) msg;
                if (log.isDebugEnabled()) {
                    log.debug("Received recovery acknowledgement [rmtNode=" + connKey.nodeId() + ", connIdx=" + connKey.connectionIndex() + ", rcvCnt=" + msg0.received() + ']');
                }
                recovery.ackReceived(msg0.received());
            }
            return;
        } else {
            GridNioRecoveryDescriptor recovery = ses.inRecoveryDescriptor();
            if (recovery != null) {
                long rcvCnt = recovery.onReceived();
                if (rcvCnt % cfg.ackSendThreshold() == 0) {
                    if (log.isDebugEnabled()) {
                        log.debug("Send recovery acknowledgement [rmtNode=" + connKey.nodeId() + ", connIdx=" + connKey.connectionIndex() + ", rcvCnt=" + rcvCnt + ']');
                    }
                    ses.systemMessage(new RecoveryLastReceivedMessage(rcvCnt));
                    recovery.lastAcknowledged(rcvCnt);
                }
            } else if (connKey.dummy()) {
                assert msg instanceof NodeIdMessage : msg;
                TcpCommunicationNodeConnectionCheckFuture fut = ses.meta(SES_FUT_META);
                assert fut != null : msg;
                fut.onConnected(U.bytesToUuid(((NodeIdMessage) msg).nodeIdBytes(), 0));
                nioSrvWrapper.nio().closeFromWorkerThread(ses);
                return;
            }
        }
        metricsLsnr.onMessageReceived(msg, consistentId);
        IgniteRunnable c;
        if (cfg.messageQueueLimit() > 0) {
            GridNioMessageTracker tracker = ses.meta(TRACKER_META);
            if (tracker == null) {
                GridNioMessageTracker old = ses.addMeta(TRACKER_META, tracker = new GridNioMessageTracker(ses, cfg.messageQueueLimit()));
                assert old == null;
            }
            tracker.onMessageReceived();
            c = tracker;
        } else
            c = NOOP;
        lsnr.onMessage(connKey.nodeId(), msg, c);
    }
}
Also used : RecoveryLastReceivedMessage(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage) Channel(java.nio.channels.Channel) Span(org.apache.ignite.internal.processors.tracing.Span) GridNioMessageTracker(org.apache.ignite.internal.util.nio.GridNioMessageTracker) IgniteRunnable(org.apache.ignite.lang.IgniteRunnable) NodeIdMessage(org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage) GridNioRecoveryDescriptor(org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor) GridSelectorNioSessionImpl(org.apache.ignite.internal.util.nio.GridSelectorNioSessionImpl)

Example 2 with NodeIdMessage

use of org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage in project ignite by apache.

the class InboundConnectionHandler method onFirstMessage.

/**
 * @param ses Session.
 * @param msg Message.
 */
private void onFirstMessage(final GridNioSession ses, Message msg) {
    UUID sndId;
    ConnectionKey connKey;
    if (msg instanceof NodeIdMessage) {
        sndId = U.bytesToUuid(((NodeIdMessage) msg).nodeIdBytes(), 0);
        connKey = new ConnectionKey(sndId, 0, -1);
    } else {
        assert msg instanceof HandshakeMessage : msg;
        HandshakeMessage msg0 = (HandshakeMessage) msg;
        sndId = ((HandshakeMessage) msg).nodeId();
        connKey = new ConnectionKey(sndId, msg0.connectionIndex(), msg0.connectCount());
    }
    if (log.isDebugEnabled())
        log.debug("Remote node ID received: " + sndId);
    final ClusterNode rmtNode = nodeGetter.apply(sndId);
    if (rmtNode == null) {
        DiscoverySpi discoverySpi = igniteExSupplier.get().configuration().getDiscoverySpi();
        boolean unknownNode = true;
        if (discoverySpi instanceof TcpDiscoverySpi) {
            TcpDiscoverySpi tcpDiscoverySpi = (TcpDiscoverySpi) discoverySpi;
            ClusterNode node0 = tcpDiscoverySpi.getNode0(sndId);
            if (node0 != null) {
                assert node0.isClient() : node0;
                if (node0.version().compareTo(VERSION_SINCE_CLIENT_COULD_WAIT_TO_CONNECT) >= 0)
                    unknownNode = false;
            }
        } else if (discoverySpi instanceof IgniteDiscoverySpi)
            unknownNode = !((IgniteDiscoverySpi) discoverySpi).knownNode(sndId);
        if (unknownNode) {
            U.warn(log, "Close incoming connection, unknown node [nodeId=" + sndId + ", ses=" + ses + ']');
            ses.send(new RecoveryLastReceivedMessage(UNKNOWN_NODE)).listen(fut -> ses.close());
        } else
            ses.send(new RecoveryLastReceivedMessage(NEED_WAIT)).listen(fut -> ses.close());
        return;
    }
    ses.addMeta(CONSISTENT_ID_META, rmtNode.consistentId());
    final ConnectionKey old = ses.addMeta(CONN_IDX_META, connKey);
    assert old == null;
    ClusterNode locNode = locNodeSupplier.get();
    if (ses.remoteAddress() == null)
        return;
    assert msg instanceof HandshakeMessage : msg;
    HandshakeMessage msg0 = (HandshakeMessage) msg;
    if (log.isDebugEnabled()) {
        log.debug("Received handshake message [locNodeId=" + locNode.id() + ", rmtNodeId=" + sndId + ", msg=" + msg0 + ']');
    }
    if (isChannelConnIdx(msg0.connectionIndex()))
        ses.send(new RecoveryLastReceivedMessage(0));
    else if (cfg.usePairedConnections() && usePairedConnections(rmtNode, attributeNames.pairedConnection())) {
        final GridNioRecoveryDescriptor recoveryDesc = nioSrvWrapper.inRecoveryDescriptor(rmtNode, connKey);
        ConnectClosureNew c = new ConnectClosureNew(ses, recoveryDesc, rmtNode);
        boolean reserve = recoveryDesc.tryReserve(msg0.connectCount(), c);
        if (reserve)
            connectedNew(recoveryDesc, ses, true);
        else {
            if (c.failed) {
                ses.send(new RecoveryLastReceivedMessage(ALREADY_CONNECTED));
                closeStaleConnections(connKey);
            }
        }
    } else {
        assert connKey.connectionIndex() >= 0 : connKey;
        GridCommunicationClient[] curClients = clientPool.clientFor(sndId);
        GridCommunicationClient oldClient = curClients != null && connKey.connectionIndex() < curClients.length ? curClients[connKey.connectionIndex()] : null;
        if (oldClient instanceof GridTcpNioCommunicationClient) {
            if (log.isInfoEnabled())
                log.info("Received incoming connection when already connected " + "to this node, rejecting [locNode=" + locNode.id() + ", rmtNode=" + sndId + ']');
            ses.send(new RecoveryLastReceivedMessage(ALREADY_CONNECTED));
            closeStaleConnections(connKey);
            return;
        }
        GridFutureAdapter<GridCommunicationClient> fut = new GridFutureAdapter<>();
        GridFutureAdapter<GridCommunicationClient> oldFut = clientPool.putIfAbsentFut(connKey, fut);
        final GridNioRecoveryDescriptor recoveryDesc = nioSrvWrapper.inRecoveryDescriptor(rmtNode, connKey);
        if (oldFut == null) {
            curClients = clientPool.clientFor(sndId);
            oldClient = curClients != null && connKey.connectionIndex() < curClients.length ? curClients[connKey.connectionIndex()] : null;
            if (oldClient instanceof GridTcpNioCommunicationClient) {
                assert oldClient.connectionIndex() == connKey.connectionIndex() : oldClient;
                if (log.isInfoEnabled())
                    log.info("Received incoming connection when already connected " + "to this node, rejecting [locNode=" + locNode.id() + ", rmtNode=" + sndId + ']');
                ses.send(new RecoveryLastReceivedMessage(ALREADY_CONNECTED));
                closeStaleConnections(connKey);
                fut.onDone(oldClient);
                return;
            }
            boolean reserved = recoveryDesc.tryReserve(msg0.connectCount(), new ConnectClosure(ses, recoveryDesc, rmtNode, connKey, msg0, true, fut));
            if (log.isDebugEnabled()) {
                log.debug("Received incoming connection from remote node " + "[rmtNode=" + rmtNode.id() + ", reserved=" + reserved + ", recovery=" + recoveryDesc + ']');
            }
            if (reserved) {
                try {
                    GridTcpNioCommunicationClient client = connected(recoveryDesc, ses, rmtNode, msg0.received(), true, true);
                    fut.onDone(client);
                } finally {
                    clientPool.removeFut(connKey, fut);
                }
            }
        } else {
            if (oldFut instanceof ConnectFuture && locNode.order() < rmtNode.order()) {
                if (log.isInfoEnabled()) {
                    log.info("Received incoming connection from remote node while " + "connecting to this node, rejecting [locNode=" + locNode.id() + ", locNodeOrder=" + locNode.order() + ", rmtNode=" + rmtNode.id() + ", rmtNodeOrder=" + rmtNode.order() + ']');
                }
                ses.send(new RecoveryLastReceivedMessage(ALREADY_CONNECTED));
            } else {
                boolean reserved = recoveryDesc.tryReserve(msg0.connectCount(), new ConnectClosure(ses, recoveryDesc, rmtNode, connKey, msg0, true, fut));
                GridTcpNioCommunicationClient client = null;
                if (reserved)
                    client = connected(recoveryDesc, ses, rmtNode, msg0.received(), true, true);
                if (oldFut instanceof ConnectionRequestFuture && !oldFut.isDone())
                    oldFut.onDone(client);
            }
        }
    }
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteInternalFuture(org.apache.ignite.internal.IgniteInternalFuture) CommunicationTcpUtils.usePairedConnections(org.apache.ignite.spi.communication.tcp.internal.CommunicationTcpUtils.usePairedConnections) GridNioSession(org.apache.ignite.internal.util.nio.GridNioSession) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter) NEED_WAIT(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage.NEED_WAIT) GridNioSessionMetaKey(org.apache.ignite.internal.util.nio.GridNioSessionMetaKey) DiscoverySpi(org.apache.ignite.spi.discovery.DiscoverySpi) CONSISTENT_ID_META(org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.CONSISTENT_ID_META) FailureProcessor(org.apache.ignite.internal.processors.failure.FailureProcessor) GridTcpNioCommunicationClient(org.apache.ignite.internal.util.nio.GridTcpNioCommunicationClient) Channel(java.nio.channels.Channel) GridNioMessageTracker(org.apache.ignite.internal.util.nio.GridNioMessageTracker) NOOP(org.apache.ignite.spi.communication.tcp.internal.CommunicationTcpUtils.NOOP) FailureType(org.apache.ignite.failure.FailureType) IgniteInClosure(org.apache.ignite.lang.IgniteInClosure) NodeIdMessage(org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) SpanTags(org.apache.ignite.internal.processors.tracing.SpanTags) IgniteRunnable(org.apache.ignite.lang.IgniteRunnable) UUID(java.util.UUID) RecoveryLastReceivedMessage(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage) AttributeNames(org.apache.ignite.spi.communication.tcp.AttributeNames) CountDownLatch(java.util.concurrent.CountDownLatch) Nullable(org.jetbrains.annotations.Nullable) MTC(org.apache.ignite.internal.processors.tracing.MTC) TraceableMessagesTable.traceName(org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable.traceName) CHANNEL_FUT_META(org.apache.ignite.spi.communication.tcp.internal.GridNioServerWrapper.CHANNEL_FUT_META) Message(org.apache.ignite.plugin.extensions.communication.Message) GridCommunicationClient(org.apache.ignite.internal.util.nio.GridCommunicationClient) IgniteProductVersion(org.apache.ignite.lang.IgniteProductVersion) NODE_STOPPING(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage.NODE_STOPPING) ALREADY_CONNECTED(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage.ALREADY_CONNECTED) CommunicationListener(org.apache.ignite.spi.communication.CommunicationListener) TcpCommunicationMetricsListener(org.apache.ignite.spi.communication.tcp.TcpCommunicationMetricsListener) Span(org.apache.ignite.internal.processors.tracing.Span) GridSelectorNioSessionImpl(org.apache.ignite.internal.util.nio.GridSelectorNioSessionImpl) U(org.apache.ignite.internal.util.typedef.internal.U) IgniteLogger(org.apache.ignite.IgniteLogger) Function(java.util.function.Function) Supplier(java.util.function.Supplier) IgniteDiscoverySpi(org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi) LT(org.apache.ignite.internal.util.typedef.internal.LT) ClusterNode(org.apache.ignite.cluster.ClusterNode) FailureContext(org.apache.ignite.failure.FailureContext) CONN_IDX_META(org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi.CONN_IDX_META) Ignite(org.apache.ignite.Ignite) MAX_CONN_PER_NODE(org.apache.ignite.spi.communication.tcp.internal.GridNioServerWrapper.MAX_CONN_PER_NODE) SES_FUT_META(org.apache.ignite.spi.communication.tcp.internal.TcpCommunicationConnectionCheckFuture.SES_FUT_META) HandshakeMessage(org.apache.ignite.spi.communication.tcp.messages.HandshakeMessage) GridNioServerListenerAdapter(org.apache.ignite.internal.util.nio.GridNioServerListenerAdapter) TcpDiscoverySpi(org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi) UNKNOWN_NODE(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage.UNKNOWN_NODE) GridNioRecoveryDescriptor(org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor) HandshakeWaitMessage(org.apache.ignite.spi.communication.tcp.messages.HandshakeWaitMessage) RecoveryLastReceivedMessage(org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage) GridCommunicationClient(org.apache.ignite.internal.util.nio.GridCommunicationClient) GridTcpNioCommunicationClient(org.apache.ignite.internal.util.nio.GridTcpNioCommunicationClient) HandshakeMessage(org.apache.ignite.spi.communication.tcp.messages.HandshakeMessage) NodeIdMessage(org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage) DiscoverySpi(org.apache.ignite.spi.discovery.DiscoverySpi) IgniteDiscoverySpi(org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi) TcpDiscoverySpi(org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi) GridNioRecoveryDescriptor(org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter) UUID(java.util.UUID) IgniteDiscoverySpi(org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi) TcpDiscoverySpi(org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi)

Aggregations

Channel (java.nio.channels.Channel)2 Span (org.apache.ignite.internal.processors.tracing.Span)2 GridNioMessageTracker (org.apache.ignite.internal.util.nio.GridNioMessageTracker)2 GridNioRecoveryDescriptor (org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor)2 GridSelectorNioSessionImpl (org.apache.ignite.internal.util.nio.GridSelectorNioSessionImpl)2 IgniteRunnable (org.apache.ignite.lang.IgniteRunnable)2 NodeIdMessage (org.apache.ignite.spi.communication.tcp.messages.NodeIdMessage)2 RecoveryLastReceivedMessage (org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMessage)2 UUID (java.util.UUID)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 Function (java.util.function.Function)1 Supplier (java.util.function.Supplier)1 Ignite (org.apache.ignite.Ignite)1 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)1 IgniteLogger (org.apache.ignite.IgniteLogger)1 ClusterNode (org.apache.ignite.cluster.ClusterNode)1 FailureContext (org.apache.ignite.failure.FailureContext)1 FailureType (org.apache.ignite.failure.FailureType)1 IgniteInternalFuture (org.apache.ignite.internal.IgniteInternalFuture)1 IgniteDiscoverySpi (org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi)1