Search in sources :

Example 1 with IContext

use of org.apache.storm.messaging.IContext in project storm by apache.

the class NettyTest method doTestLoad.

private void doTestLoad(Map<String, Object> stormConf) throws Exception {
    LOG.info("2 test load");
    String reqMessage = "0123456789abcdefghijklmnopqrstuvwxyz";
    IContext context = TransportFactory.makeContext(stormConf, null);
    try {
        AtomicReference<TaskMessage> response = new AtomicReference<>();
        try (IConnection server = context.bind(null, 0, mkConnectionCallback(response::set), null);
            IConnection client = context.connect(null, "localhost", server.getPort(), remoteBpStatus)) {
            waitUntilReady(client, server);
            byte[] messageBytes = reqMessage.getBytes(StandardCharsets.UTF_8);
            send(client, taskId, messageBytes);
            /*
                 * This test sends a broadcast to all connected clients from the server, so we need to wait until the server has registered
                 * the client as connected before sending load metrics.
                 *
                 * It's not enough to wait until the client reports that the channel is open, because the server event loop may not have
                 * finished running channelActive for the new channel. If we send metrics too early, the server will broadcast to no one.
                 *
                 * By waiting for the response here, we ensure that the client will be registered at the server before we send load metrics.
                 */
            waitForNotNull(response);
            Map<Integer, Double> taskToLoad = new HashMap<>();
            taskToLoad.put(1, 0.0);
            taskToLoad.put(2, 1.0);
            server.sendLoadMetrics(taskToLoad);
            List<Integer> tasks = new ArrayList<>();
            tasks.add(1);
            tasks.add(2);
            Testing.whileTimeout(Testing.TEST_TIMEOUT_MS, () -> client.getLoad(tasks).isEmpty(), sleep());
            Map<Integer, Load> load = client.getLoad(tasks);
            assertThat(load.get(1).getBoltLoad(), is(0.0));
            assertThat(load.get(2).getBoltLoad(), is(1.0));
        }
    } finally {
        context.term();
    }
}
Also used : Load(org.apache.storm.grouping.Load) IContext(org.apache.storm.messaging.IContext) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) AtomicReference(java.util.concurrent.atomic.AtomicReference) IConnection(org.apache.storm.messaging.IConnection) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TaskMessage(org.apache.storm.messaging.TaskMessage)

Example 2 with IContext

use of org.apache.storm.messaging.IContext in project storm by apache.

the class NettyTest method doTestServerAlwaysReconnects.

private void doTestServerAlwaysReconnects(Map<String, Object> stormConf) throws Exception {
    LOG.info("6. test server always reconnects");
    String reqMessage = "0123456789abcdefghijklmnopqrstuvwxyz";
    IContext context = TransportFactory.makeContext(stormConf, null);
    try {
        AtomicReference<TaskMessage> response = new AtomicReference<>();
        int port = Utils.getAvailablePort(6700);
        try (IConnection client = context.connect(null, "localhost", port, remoteBpStatus)) {
            byte[] messageBytes = reqMessage.getBytes(StandardCharsets.UTF_8);
            send(client, taskId, messageBytes);
            try (IConnection server = context.bind(null, port, mkConnectionCallback(response::set), null)) {
                waitUntilReady(client, server);
                send(client, taskId, messageBytes);
                waitForNotNull(response);
                TaskMessage responseMessage = response.get();
                assertThat(responseMessage.task(), is(taskId));
                assertThat(responseMessage.message(), is(messageBytes));
            }
        }
    } finally {
        context.term();
    }
}
Also used : IContext(org.apache.storm.messaging.IContext) AtomicReference(java.util.concurrent.atomic.AtomicReference) IConnection(org.apache.storm.messaging.IConnection) TaskMessage(org.apache.storm.messaging.TaskMessage)

Example 3 with IContext

use of org.apache.storm.messaging.IContext in project storm by apache.

the class NettyTest method doTestBasic.

private void doTestBasic(Map<String, Object> stormConf) throws Exception {
    LOG.info("1. Should send and receive a basic message");
    String reqMessage = "0123456789abcdefghijklmnopqrstuvwxyz";
    IContext context = TransportFactory.makeContext(stormConf, null);
    try {
        AtomicReference<TaskMessage> response = new AtomicReference<>();
        try (IConnection server = context.bind(null, 0, mkConnectionCallback(response::set), null);
            IConnection client = context.connect(null, "localhost", server.getPort(), remoteBpStatus)) {
            waitUntilReady(client, server);
            byte[] messageBytes = reqMessage.getBytes(StandardCharsets.UTF_8);
            send(client, taskId, messageBytes);
            waitForNotNull(response);
            TaskMessage responseMessage = response.get();
            assertThat(responseMessage.task(), is(taskId));
            assertThat(responseMessage.message(), is(messageBytes));
        }
    } finally {
        context.term();
    }
}
Also used : IContext(org.apache.storm.messaging.IContext) AtomicReference(java.util.concurrent.atomic.AtomicReference) IConnection(org.apache.storm.messaging.IConnection) TaskMessage(org.apache.storm.messaging.TaskMessage)

Example 4 with IContext

use of org.apache.storm.messaging.IContext in project storm by apache.

the class NettyTest method doTestBatch.

private void doTestBatch(Map<String, Object> stormConf) throws Exception {
    int numMessages = 100_000;
    LOG.info("Should send and receive many messages (testing with " + numMessages + " messages)");
    ArrayList<TaskMessage> responses = new ArrayList<>();
    AtomicInteger received = new AtomicInteger();
    IContext context = TransportFactory.makeContext(stormConf, null);
    try {
        try (IConnection server = context.bind(null, 0, mkConnectionCallback((message) -> {
            responses.add(message);
            received.incrementAndGet();
        }), null);
            IConnection client = context.connect(null, "localhost", server.getPort(), remoteBpStatus)) {
            waitUntilReady(client, server);
            IntStream.range(1, numMessages).forEach(i -> send(client, taskId, String.valueOf(i).getBytes(StandardCharsets.UTF_8)));
            Testing.whileTimeout(Testing.TEST_TIMEOUT_MS, () -> responses.size() < numMessages - 1, () -> {
                LOG.info("{} of {} received", responses.size(), numMessages - 1);
                sleep().run();
            });
            IntStream.range(1, numMessages).forEach(i -> {
                assertThat(new String(responses.get(i - 1).message(), StandardCharsets.UTF_8), is(String.valueOf(i)));
            });
        }
    } finally {
        context.term();
    }
}
Also used : CoreMatchers.is(org.hamcrest.CoreMatchers.is) IntStream(java.util.stream.IntStream) Arrays(java.util.Arrays) StringUtils(org.apache.commons.lang.StringUtils) Testing(org.apache.storm.Testing) LoggerFactory(org.slf4j.LoggerFactory) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) TransportFactory(org.apache.storm.messaging.TransportFactory) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) Assert.assertThat(org.junit.Assert.assertThat) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) Matchers.lessThan(org.hamcrest.Matchers.lessThan) Logger(org.slf4j.Logger) IConnection(org.apache.storm.messaging.IConnection) Test(org.junit.Test) TaskMessage(org.apache.storm.messaging.TaskMessage) WorkerState(org.apache.storm.daemon.worker.WorkerState) Utils(org.apache.storm.utils.Utils) Load(org.apache.storm.grouping.Load) StandardCharsets(java.nio.charset.StandardCharsets) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) List(java.util.List) IConnectionCallback(org.apache.storm.messaging.IConnectionCallback) IContext(org.apache.storm.messaging.IContext) Config(org.apache.storm.Config) Collections(java.util.Collections) IContext(org.apache.storm.messaging.IContext) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArrayList(java.util.ArrayList) IConnection(org.apache.storm.messaging.IConnection) TaskMessage(org.apache.storm.messaging.TaskMessage)

Example 5 with IContext

use of org.apache.storm.messaging.IContext in project storm by apache.

the class NettyTest method doTestServerDelayed.

private void doTestServerDelayed(Map<String, Object> stormConf) throws Exception {
    LOG.info("4. test server delayed");
    String reqMessage = "0123456789abcdefghijklmnopqrstuvwxyz";
    IContext context = TransportFactory.makeContext(stormConf, null);
    try {
        AtomicReference<TaskMessage> response = new AtomicReference<>();
        int port = Utils.getAvailablePort(6700);
        try (IConnection client = context.connect(null, "localhost", port, remoteBpStatus)) {
            AtomicReference<IConnection> server = new AtomicReference<>();
            try {
                CompletableFuture<?> serverStart = CompletableFuture.runAsync(() -> {
                    try {
                        Thread.sleep(100);
                        server.set(context.bind(null, port, mkConnectionCallback(response::set), null));
                        waitUntilReady(client, server.get());
                    } catch (Exception e) {
                        throw Utils.wrapInRuntime(e);
                    }
                });
                serverStart.get(Testing.TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
                byte[] messageBytes = reqMessage.getBytes(StandardCharsets.UTF_8);
                send(client, taskId, messageBytes);
                waitForNotNull(response);
                TaskMessage responseMessage = response.get();
                assertThat(responseMessage.task(), is(taskId));
                assertThat(responseMessage.message(), is(messageBytes));
            } finally {
                if (server.get() != null) {
                    server.get().close();
                }
            }
        }
    } finally {
        context.term();
    }
}
Also used : IContext(org.apache.storm.messaging.IContext) AtomicReference(java.util.concurrent.atomic.AtomicReference) IConnection(org.apache.storm.messaging.IConnection) TaskMessage(org.apache.storm.messaging.TaskMessage)

Aggregations

AtomicReference (java.util.concurrent.atomic.AtomicReference)7 IConnection (org.apache.storm.messaging.IConnection)7 IContext (org.apache.storm.messaging.IContext)7 TaskMessage (org.apache.storm.messaging.TaskMessage)7 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Load (org.apache.storm.grouping.Load)2 StandardCharsets (java.nio.charset.StandardCharsets)1 Arrays (java.util.Arrays)1 Collections (java.util.Collections)1 List (java.util.List)1 Map (java.util.Map)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 TimeUnit (java.util.concurrent.TimeUnit)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 Consumer (java.util.function.Consumer)1 IntStream (java.util.stream.IntStream)1 StringUtils (org.apache.commons.lang.StringUtils)1 Config (org.apache.storm.Config)1