Search in sources :

Example 1 with Packet

use of io.dingodb.net.netty.packet.Packet in project dingo by dingodb.

the class GenericMessageHandler method handle.

@Override
public void handle(Connection<Message> connection, Packet<Message> packet) {
    switch(packet.header().type()) {
        case PING:
            connection.genericSubChannel().send(MessagePacket.pong(0));
            return;
        case PONG:
            break;
        case CONNECT_CHANNEL:
            ConnectionSubChannel<Message> channel = connection.openSubChannel(packet.header().targetChannelId());
            channel.send(MessagePacket.ack(channel.channelId(), channel.targetChannelId(), channel.nextSeq()));
            break;
        case DIS_CONNECT_CHANNEL:
            connection.closeSubChannel(packet.header().channelId());
            break;
        case ACK:
            Optional.ofNullable(ackFuture.get(connection)).map(futureMap -> futureMap.remove(packet.header().channelId())).ifPresent(future -> future.complete(packet));
            break;
        case HANDSHAKE_ERROR:
            ErrorMessage errorMessage = ErrorMessage.builder().build().load(packet.content().toBytes());
            log.error("Handshake failed, msg is: {}", errorMessage.getDetailMessage());
            try {
                connection.close();
            } catch (Exception e) {
                log.error("Connection close error.", e);
            }
            break;
        default:
            throw new IllegalStateException("Unexpected value: " + packet.header().type());
    }
}
Also used : PacketMode(io.dingodb.net.netty.packet.PacketMode) Packet(io.dingodb.net.netty.packet.Packet) PacketType(io.dingodb.net.netty.packet.PacketType) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Message(io.dingodb.net.Message) TimeoutException(java.util.concurrent.TimeoutException) ErrorMessage(io.dingodb.net.netty.packet.message.ErrorMessage) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Slf4j(lombok.extern.slf4j.Slf4j) Future(java.util.concurrent.Future) MessagePacket(io.dingodb.net.netty.packet.impl.MessagePacket) MessageDispatcher(io.dingodb.net.netty.handler.MessageDispatcher) AutoService(com.google.auto.service.AutoService) Map(java.util.Map) Optional(io.dingodb.common.util.Optional) ConnectionSubChannel(io.dingodb.net.netty.channel.ConnectionSubChannel) MessageHandler(io.dingodb.net.netty.handler.MessageHandler) Logs(io.dingodb.net.netty.utils.Logs) ChannelId(io.dingodb.net.netty.channel.ChannelId) Connection(io.dingodb.net.netty.connection.Connection) Message(io.dingodb.net.Message) ErrorMessage(io.dingodb.net.netty.packet.message.ErrorMessage) ErrorMessage(io.dingodb.net.netty.packet.message.ErrorMessage) TimeoutException(java.util.concurrent.TimeoutException)

Example 2 with Packet

use of io.dingodb.net.netty.packet.Packet in project dingo by dingodb.

the class NetServiceNettyConnection method openSubChannel.

@Override
public NetServiceConnectionSubChannel openSubChannel() {
    NetServiceConnectionSubChannel channel = subChannels.computeIfAbsent(generateChannelId(), cid -> new NetServiceConnectionSubChannel(cid, null, this));
    Future<Packet<Message>> ack = GenericMessageHandler.instance().waitAck(this, channel.channelId());
    channel.send(MessagePacket.connectRemoteChannel(channel.channelId(), channel.nextSeq()));
    try {
        channel.targetChannelId(ack.get(heartbeat, TimeUnit.SECONDS).header().targetChannelId());
    } catch (InterruptedException e) {
        closeSubChannel(channel.channelId());
        NetError.OPEN_CHANNEL_INTERRUPT.throwFormatError();
    } catch (ExecutionException e) {
        closeSubChannel(channel.channelId());
        log.error("Open channel error, channel id: [{}], caller: [{}]", channel.channelId(), stack(2));
        NetError.UNKNOWN.throwFormatError(e.getMessage());
    } catch (TimeoutException e) {
        closeSubChannel(channel.channelId());
        OPEN_CHANNEL_TIME_OUT.throwFormatError();
    }
    if (log.isDebugEnabled()) {
        log.debug("Open channel to [{}] channel [{}], this channel: [{}], caller: [{}]", remoteAddress(), channel.targetChannelId(), channel.channelId(), log.isTraceEnabled() ? stackTrace() : stack(3));
    }
    channel.start();
    return channel;
}
Also used : HandshakeMessage.handshakePacket(io.dingodb.net.netty.packet.message.HandshakeMessage.handshakePacket) MessagePacket(io.dingodb.net.netty.packet.impl.MessagePacket) Packet(io.dingodb.net.netty.packet.Packet) NetServiceConnectionSubChannel(io.dingodb.net.netty.channel.impl.NetServiceConnectionSubChannel) ExecutionException(java.util.concurrent.ExecutionException) TimeoutException(java.util.concurrent.TimeoutException)

Aggregations

Packet (io.dingodb.net.netty.packet.Packet)2 MessagePacket (io.dingodb.net.netty.packet.impl.MessagePacket)2 TimeoutException (java.util.concurrent.TimeoutException)2 AutoService (com.google.auto.service.AutoService)1 Optional (io.dingodb.common.util.Optional)1 Message (io.dingodb.net.Message)1 ChannelId (io.dingodb.net.netty.channel.ChannelId)1 ConnectionSubChannel (io.dingodb.net.netty.channel.ConnectionSubChannel)1 NetServiceConnectionSubChannel (io.dingodb.net.netty.channel.impl.NetServiceConnectionSubChannel)1 Connection (io.dingodb.net.netty.connection.Connection)1 MessageDispatcher (io.dingodb.net.netty.handler.MessageDispatcher)1 MessageHandler (io.dingodb.net.netty.handler.MessageHandler)1 PacketMode (io.dingodb.net.netty.packet.PacketMode)1 PacketType (io.dingodb.net.netty.packet.PacketType)1 ErrorMessage (io.dingodb.net.netty.packet.message.ErrorMessage)1 HandshakeMessage.handshakePacket (io.dingodb.net.netty.packet.message.HandshakeMessage.handshakePacket)1 Logs (io.dingodb.net.netty.utils.Logs)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 CompletableFuture (java.util.concurrent.CompletableFuture)1