Search in sources :

Example 16 with Pdu

use of herddb.proto.Pdu in project herddb by diennea.

the class NetworkChannelTest method test.

@Test
public void test() throws Exception {
    try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
        acceptor.setEnableJVMNetwork(false);
        acceptor.setAcceptor((Channel channel) -> {
            channel.setMessagesReceiver(new ChannelEventListener() {

                @Override
                public void requestReceived(Pdu message, Channel channel) {
                    ByteBuf msg = buildAckResponse(message);
                    channel.sendReplyMessage(message.messageId, msg);
                    message.close();
                }

                @Override
                public void channelClosed(Channel channel) {
                }
            });
            return (ServerSideConnection) () -> new Random().nextLong();
        });
        acceptor.start();
        ExecutorService executor = Executors.newCachedThreadPool();
        try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {

            @Override
            public void channelClosed(Channel channel) {
                System.out.println("client channelClosed");
            }
        }, executor, new NioEventLoopGroup(10, executor))) {
            for (int i = 0; i < 100; i++) {
                ByteBuf buffer = buildAckRequest(i);
                try (Pdu result = client.sendMessageWithPduReply(i, Unpooled.wrappedBuffer(buffer), 10000)) {
                    assertEquals(Pdu.TYPE_ACK, result.type);
                }
            }
        } finally {
            executor.shutdown();
        }
    }
    if (NetworkUtils.isEnableEpoolNative()) {
        try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
            acceptor.setEnableJVMNetwork(false);
            acceptor.setAcceptor((Channel channel) -> {
                channel.setMessagesReceiver(new ChannelEventListener() {

                    @Override
                    public void requestReceived(Pdu message, Channel channel) {
                        ByteBuf msg = buildAckResponse(message);
                        channel.sendReplyMessage(message.messageId, msg);
                        message.close();
                    }

                    @Override
                    public void channelClosed(Channel channel) {
                    }
                });
                return (ServerSideConnection) () -> new Random().nextLong();
            });
            acceptor.start();
            ExecutorService executor = Executors.newCachedThreadPool();
            try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {

                @Override
                public void channelClosed(Channel channel) {
                    System.out.println("client channelClosed");
                }
            }, executor, new EpollEventLoopGroup(10, executor))) {
                for (int i = 0; i < 100; i++) {
                    ByteBuf buffer = buildAckRequest(i);
                    try (Pdu result = client.sendMessageWithPduReply(i, Unpooled.wrappedBuffer(buffer), 10000)) {
                        assertEquals(Pdu.TYPE_ACK, result.type);
                    }
                }
            } finally {
                executor.shutdown();
            }
        }
    }
}
Also used : ChannelEventListener(herddb.network.ChannelEventListener) Pdu(herddb.proto.Pdu) Random(java.util.Random) EpollEventLoopGroup(io.netty.channel.epoll.EpollEventLoopGroup) Channel(herddb.network.Channel) ExecutorService(java.util.concurrent.ExecutorService) ServerSideConnection(herddb.network.ServerSideConnection) ByteBuf(io.netty.buffer.ByteBuf) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) Test(org.junit.Test)

Example 17 with Pdu

use of herddb.proto.Pdu in project herddb by diennea.

the class NetworkChannelTest method testServerPushesData.

@Test
public void testServerPushesData() throws Exception {
    try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
        acceptor.setEnableJVMNetwork(false);
        acceptor.setEnableRealNetwork(true);
        acceptor.setAcceptor((Channel channel) -> {
            channel.setMessagesReceiver(new ChannelEventListener() {

                @Override
                public void requestReceived(Pdu message, Channel channel) {
                    try {
                        ByteBuf msg = buildAckResponse(message);
                        // send a message to the client
                        ByteBuf buffer = buildAckRequest(900);
                        Pdu response = channel.sendMessageWithPduReply(900, buffer, 10000);
                        assertEquals(Pdu.TYPE_ACK, response.type);
                        // send the response to the client
                        channel.sendReplyMessage(message.messageId, msg);
                        message.close();
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    } catch (TimeoutException ex) {
                        ex.printStackTrace();
                    }
                }

                @Override
                public void channelClosed(Channel channel) {
                }
            });
            return (ServerSideConnection) () -> new Random().nextLong();
        });
        acceptor.start();
        ExecutorService executor = Executors.newCachedThreadPool();
        CopyOnWriteArrayList<Long> pushedMessagesFromServer = new CopyOnWriteArrayList<>();
        try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {

            @Override
            public void requestReceived(Pdu pdu, Channel channel) {
                pushedMessagesFromServer.add(pdu.messageId);
                assertTrue(pdu.isRequest());
                ByteBuf msg = buildAckResponse(pdu);
                // send the response to the server
                channel.sendReplyMessage(pdu.messageId, msg);
                pdu.close();
            }

            @Override
            public void channelClosed(Channel channel) {
                System.out.println("client channelClosed");
            }
        }, executor, new NioEventLoopGroup(10, executor))) {
            ByteBuf buffer = buildAckRequest(134);
            try (Pdu result = client.sendMessageWithPduReply(134, buffer, 10000)) {
                assertEquals(Pdu.TYPE_ACK, result.type);
            }
            assertEquals(1, pushedMessagesFromServer.size());
        } finally {
            executor.shutdown();
        }
    }
}
Also used : Pdu(herddb.proto.Pdu) Channel(herddb.network.Channel) ServerSideConnection(herddb.network.ServerSideConnection) ByteBuf(io.netty.buffer.ByteBuf) ChannelEventListener(herddb.network.ChannelEventListener) Random(java.util.Random) ExecutorService(java.util.concurrent.ExecutorService) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) TimeoutException(java.util.concurrent.TimeoutException) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) Test(org.junit.Test)

Example 18 with Pdu

use of herddb.proto.Pdu in project herddb by diennea.

the class RetryOnLeaderChangedTest method testSwitchLeaderAndAuthTimeout.

@Test
public void testSwitchLeaderAndAuthTimeout() throws Exception {
    TestStatsProvider statsProvider = new TestStatsProvider();
    ServerConfiguration serverconfig_1 = newServerConfigurationWithAutoPort(folder.newFolder().toPath());
    serverconfig_1.set(ServerConfiguration.PROPERTY_NODEID, "server1");
    serverconfig_1.set(ServerConfiguration.PROPERTY_MODE, ServerConfiguration.PROPERTY_MODE_CLUSTER);
    serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_ADDRESS, testEnv.getAddress());
    serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_PATH, testEnv.getPath());
    serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_SESSIONTIMEOUT, testEnv.getTimeout());
    ServerConfiguration serverconfig_2 = serverconfig_1.copy().set(ServerConfiguration.PROPERTY_NODEID, "server2").set(ServerConfiguration.PROPERTY_BASEDIR, folder.newFolder().toPath().toAbsolutePath());
    final AtomicBoolean suspendProcessing = new AtomicBoolean(false);
    try (Server server_1 = new Server(serverconfig_1)) {
        server_1.start();
        server_1.waitForStandaloneBoot();
        try (Server server_2 = new Server(serverconfig_2) {

            @Override
            protected ServerSideConnectionPeer buildPeer(Channel channel) {
                return new ServerSideConnectionPeer(channel, this) {

                    @Override
                    public void requestReceived(Pdu message, Channel channel) {
                        if (suspendProcessing.get()) {
                            LOG.log(Level.INFO, "dropping message type " + message.type + " id " + message.messageId);
                            message.close();
                            return;
                        }
                        super.requestReceived(message, channel);
                    }
                };
            }
        }) {
            server_2.start();
            TestUtils.execute(server_1.getManager(), "CREATE TABLESPACE 'ttt','leader:" + server_2.getNodeId() + "','expectedreplicacount:2'", Collections.emptyList());
            // wait for server_2 to wake up
            for (int i = 0; i < 40; i++) {
                TableSpaceManager tableSpaceManager2 = server_2.getManager().getTableSpaceManager("ttt");
                if (tableSpaceManager2 != null && tableSpaceManager2.isLeader()) {
                    break;
                }
                Thread.sleep(500);
            }
            assertTrue(server_2.getManager().getTableSpaceManager("ttt") != null && server_2.getManager().getTableSpaceManager("ttt").isLeader());
            // wait for server_1 to announce as follower
            waitClusterStatus(server_1.getManager(), server_1.getNodeId(), "follower");
            ClientConfiguration clientConfiguration = new ClientConfiguration();
            clientConfiguration.set(ClientConfiguration.PROPERTY_MODE, ClientConfiguration.PROPERTY_MODE_CLUSTER);
            clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_ADDRESS, testEnv.getAddress());
            clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_PATH, testEnv.getPath());
            clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_SESSIONTIMEOUT, testEnv.getTimeout());
            clientConfiguration.set(ClientConfiguration.PROPERTY_MAX_CONNECTIONS_PER_SERVER, 2);
            clientConfiguration.set(ClientConfiguration.PROPERTY_TIMEOUT, 2000);
            StatsLogger logger = statsProvider.getStatsLogger("ds");
            try (HDBClient client1 = new HDBClient(clientConfiguration, logger) {

                @Override
                public HDBConnection openConnection() {
                    HDBConnection con = new VisibleRouteHDBConnection(this);
                    registerConnection(con);
                    return con;
                }
            }) {
                try (VisibleRouteHDBConnection connection = (VisibleRouteHDBConnection) client1.openConnection()) {
                    // create table and insert data
                    connection.executeUpdate(TableSpace.DEFAULT, "CREATE TABLE ttt.t1(k1 int primary key, n1 int)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList());
                    connection.executeUpdate(TableSpace.DEFAULT, "INSERT INTO ttt.t1(k1,n1) values(1,1)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList());
                    assertEquals("server2", connection.getRouteToTableSpace("ttt").getNodeId());
                    // change leader
                    switchLeader(server_1.getNodeId(), server_2.getNodeId(), server_1.getManager());
                    try (VisibleRouteHDBConnection connection2 = (VisibleRouteHDBConnection) client1.openConnection()) {
                        // connection routing still point to old leader (now follower)
                        assertEquals("server2", connection2.getRouteToTableSpace("ttt").getNodeId());
                        // suspend server_2 authentication
                        suspendProcessing.set(true);
                        // attempt an insert with old routing. Suspended autentication generates a timeout
                        // and routing will be reevaluated
                        assertEquals(1, connection2.executeUpdate(TableSpace.DEFAULT, "INSERT INTO ttt.t1(k1,n1) values(2,2)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList()).updateCount);
                        // right routing to current master
                        assertEquals("server1", connection2.getRouteToTableSpace("ttt").getNodeId());
                        suspendProcessing.set(false);
                    }
                }
            }
        }
    }
}
Also used : TestStatsProvider(org.apache.bookkeeper.test.TestStatsProvider) Pdu(herddb.proto.Pdu) ServerSideConnectionPeer(herddb.server.ServerSideConnectionPeer) StatsLogger(org.apache.bookkeeper.stats.StatsLogger) Server(herddb.server.Server) ServerConfiguration(herddb.server.ServerConfiguration) Channel(herddb.network.Channel) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HDBConnection(herddb.client.HDBConnection) HDBClient(herddb.client.HDBClient) TableSpaceManager(herddb.core.TableSpaceManager) ClientConfiguration(herddb.client.ClientConfiguration) Test(org.junit.Test)

Example 19 with Pdu

use of herddb.proto.Pdu in project herddb by diennea.

the class LocalVMChannel method sendOneWayMessage.

@Override
public void sendOneWayMessage(ByteBuf message, SendResultCallback callback) {
    if (isClosed()) {
        ReferenceCountUtil.safeRelease(message);
        callback.messageSent(new IOException("channel closed"));
        return;
    }
    try {
        Pdu pdu = PduCodec.decodePdu(message);
        // execute server side code in this thread
        serverSideChannel.directProcessPdu(pdu);
    } catch (IOException ex) {
        ReferenceCountUtil.safeRelease(message);
        callback.messageSent(ex);
    }
}
Also used : Pdu(herddb.proto.Pdu) IOException(java.io.IOException)

Example 20 with Pdu

use of herddb.proto.Pdu in project herddb by diennea.

the class LocalChannelTest method testServerPushesData.

@Test
public void testServerPushesData() throws Exception {
    InetSocketAddress addr = new InetSocketAddress("localhost", NetworkUtils.assignFirstFreePort());
    try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor(addr.getHostName(), addr.getPort(), true)) {
        acceptor.setEnableRealNetwork(false);
        acceptor.setAcceptor((Channel channel) -> {
            channel.setMessagesReceiver(new ChannelEventListener() {

                @Override
                public void requestReceived(Pdu message, Channel channel) {
                    try {
                        ByteBuf msg = buildAckResponse(message);
                        // send a message to the client
                        ByteBuf buffer = buildAckRequest(900);
                        Pdu response = channel.sendMessageWithPduReply(900, buffer, 10000);
                        assertEquals(Pdu.TYPE_ACK, response.type);
                        // send the response to the client
                        channel.sendReplyMessage(message.messageId, msg);
                        message.close();
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    } catch (TimeoutException ex) {
                        ex.printStackTrace();
                    }
                }

                @Override
                public void channelClosed(Channel channel) {
                }
            });
            return (ServerSideConnection) () -> new Random().nextLong();
        });
        acceptor.start();
        assertNotNull(LocalServerRegistry.getLocalServer(NetworkUtils.getAddress(addr), addr.getPort()));
        ExecutorService executor = Executors.newCachedThreadPool();
        CopyOnWriteArrayList<Long> pushedMessagesFromServer = new CopyOnWriteArrayList<>();
        try (Channel client = NettyConnector.connect(addr.getHostName(), addr.getPort(), true, 0, 0, new ChannelEventListener() {

            @Override
            public void requestReceived(Pdu pdu, Channel channel) {
                pushedMessagesFromServer.add(pdu.messageId);
                assertTrue(pdu.isRequest());
                ByteBuf msg = buildAckResponse(pdu);
                // send the response to the server
                channel.sendReplyMessage(pdu.messageId, msg);
                pdu.close();
            }

            @Override
            public void channelClosed(Channel channel) {
                System.out.println("client channelClosed");
            }
        }, executor, null)) {
            ByteBuf buffer = buildAckRequest(134);
            try (Pdu result = client.sendMessageWithPduReply(134, buffer, 10000)) {
                assertEquals(Pdu.TYPE_ACK, result.type);
            }
            assertEquals(1, pushedMessagesFromServer.size());
        } finally {
            executor.shutdown();
        }
    }
    assertNull(LocalServerRegistry.getLocalServer(NetworkUtils.getAddress(addr), addr.getPort()));
}
Also used : Pdu(herddb.proto.Pdu) InetSocketAddress(java.net.InetSocketAddress) Channel(herddb.network.Channel) ServerSideConnection(herddb.network.ServerSideConnection) ByteBuf(io.netty.buffer.ByteBuf) ChannelEventListener(herddb.network.ChannelEventListener) Random(java.util.Random) ExecutorService(java.util.concurrent.ExecutorService) TimeoutException(java.util.concurrent.TimeoutException) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) Test(org.junit.Test)

Aggregations

Pdu (herddb.proto.Pdu)27 Channel (herddb.network.Channel)19 ByteBuf (io.netty.buffer.ByteBuf)17 TimeoutException (java.util.concurrent.TimeoutException)16 HDBOperationTimeoutException (herddb.client.impl.HDBOperationTimeoutException)11 RawString (herddb.utils.RawString)7 Test (org.junit.Test)7 PduCodec (herddb.proto.PduCodec)6 ExecutorService (java.util.concurrent.ExecutorService)6 ChannelEventListener (herddb.network.ChannelEventListener)5 ServerSideConnection (herddb.network.ServerSideConnection)5 ArrayList (java.util.ArrayList)5 Random (java.util.Random)5 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)5 CompletableFuture (java.util.concurrent.CompletableFuture)4 DumpedLogEntry (herddb.backup.DumpedLogEntry)3 ServerConfiguration (herddb.server.ServerConfiguration)3 DataStorageManagerException (herddb.storage.DataStorageManagerException)3 NioEventLoopGroup (io.netty.channel.nio.NioEventLoopGroup)3 IOException (java.io.IOException)3