Search in sources :

Example 61 with Header

use of io.aeron.logbuffer.Header in project aeron by real-logic.

the class MultiModuleSharedDriverTest method shouldSupportTwoMultiNodeClusters.

@Test
@InterruptAfter(30)
public void shouldSupportTwoMultiNodeClusters() {
    try (MultiClusterNode node0 = new MultiClusterNode(0, systemTestWatcher.dataCollector());
        MultiClusterNode node1 = new MultiClusterNode(1, systemTestWatcher.dataCollector())) {
        final MutableReference<String> egress = new MutableReference<>();
        final EgressListener egressListener = (clusterSessionId, timestamp, buffer, offset, length, header) -> egress.set(buffer.getStringWithoutLengthAscii(offset, length));
        try (AeronCluster client0 = AeronCluster.connect(new AeronCluster.Context().aeronDirectoryName(node0.archivingMediaDriver.mediaDriver().aeronDirectoryName()).egressListener(egressListener).ingressChannel("aeron:udp?term-length=64k").ingressEndpoints(TestCluster.ingressEndpoints(0, 2)).egressChannel("aeron:udp?endpoint=localhost:9020"));
            AeronCluster client1 = AeronCluster.connect(new AeronCluster.Context().aeronDirectoryName(node1.archivingMediaDriver.mediaDriver().aeronDirectoryName()).egressListener(egressListener).ingressChannel("aeron:udp?term-length=64k").ingressEndpoints(TestCluster.ingressEndpoints(1, 2)).egressChannel("aeron:udp?endpoint=localhost:9120"))) {
            echoMessage(client0, "Message 0", egress);
            echoMessage(client1, "Message 1", egress);
        }
    }
}
Also used : AeronCluster(io.aeron.cluster.client.AeronCluster) StubClusteredService(io.aeron.test.cluster.StubClusteredService) ClusteredServiceContainer(io.aeron.cluster.service.ClusteredServiceContainer) io.aeron.test(io.aeron.test) SystemUtil(org.agrona.SystemUtil) RedirectingNameResolver(io.aeron.test.driver.RedirectingNameResolver) MutableReference(org.agrona.collections.MutableReference) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) ArchivingMediaDriver(io.aeron.archive.ArchivingMediaDriver) RegisterExtension(org.junit.jupiter.api.extension.RegisterExtension) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) ArchiveThreadingMode(io.aeron.archive.ArchiveThreadingMode) CloseHelper(org.agrona.CloseHelper) MediaDriver(io.aeron.driver.MediaDriver) Archive(io.aeron.archive.Archive) ExpandableArrayBuffer(org.agrona.ExpandableArrayBuffer) CommonContext(io.aeron.CommonContext) File(java.io.File) Test(org.junit.jupiter.api.Test) EgressListener(io.aeron.cluster.client.EgressListener) Header(io.aeron.logbuffer.Header) ClientSession(io.aeron.cluster.service.ClientSession) ThreadingMode(io.aeron.driver.ThreadingMode) TestCluster(io.aeron.test.cluster.TestCluster) DirectBuffer(org.agrona.DirectBuffer) CommonContext(io.aeron.CommonContext) AeronCluster(io.aeron.cluster.client.AeronCluster) MutableReference(org.agrona.collections.MutableReference) EgressListener(io.aeron.cluster.client.EgressListener) Test(org.junit.jupiter.api.Test)

Example 62 with Header

use of io.aeron.logbuffer.Header in project aeron by real-logic.

the class PubAndSubTest method shouldContinueAfterRolloverWithMinimalPaddingHeader.

@ParameterizedTest
@MethodSource("channels")
@InterruptAfter(10)
void shouldContinueAfterRolloverWithMinimalPaddingHeader(final String channel) {
    final int termBufferLength = 64 * 1024;
    final int termBufferLengthMinusPaddingHeader = termBufferLength - HEADER_LENGTH;
    final int num1kMessagesInTermBuffer = 63;
    final int lastMessageLength = termBufferLengthMinusPaddingHeader - (num1kMessagesInTermBuffer * 1024) - HEADER_LENGTH;
    final int messageLength = 1024 - HEADER_LENGTH;
    context.publicationTermBufferLength(termBufferLength);
    launch(channel);
    // lock step reception until we get to within 8 messages of the end
    for (int i = 0; i < num1kMessagesInTermBuffer - 7; i++) {
        while (publication.offer(buffer, 0, messageLength) < 0L) {
            Tests.yield();
        }
        pollForFragment();
    }
    for (int i = 7; i > 0; i--) {
        while (publication.offer(buffer, 0, messageLength) < 0L) {
            Tests.yield();
        }
    }
    // small enough to leave room for padding that is just a header
    while (publication.offer(buffer, 0, lastMessageLength) < 0L) {
        Tests.yield();
    }
    // no roll over
    while (publication.offer(buffer, 0, messageLength) < 0L) {
        Tests.yield();
    }
    final MutableInteger fragmentsRead = new MutableInteger();
    Tests.executeUntil(() -> fragmentsRead.value == 9, (j) -> {
        final int fragments = subscription.poll(fragmentHandler, 10);
        if (0 == fragments) {
            Thread.yield();
        }
        fragmentsRead.value += fragments;
    }, Integer.MAX_VALUE, TimeUnit.MILLISECONDS.toNanos(500));
    final InOrder inOrder = inOrder(fragmentHandler);
    inOrder.verify(fragmentHandler, times(num1kMessagesInTermBuffer)).onFragment(any(DirectBuffer.class), anyInt(), eq(messageLength), any(Header.class));
    inOrder.verify(fragmentHandler, times(1)).onFragment(any(DirectBuffer.class), anyInt(), eq(lastMessageLength), any(Header.class));
    inOrder.verify(fragmentHandler, times(1)).onFragment(any(DirectBuffer.class), anyInt(), eq(messageLength), any(Header.class));
}
Also used : DirectBuffer(org.agrona.DirectBuffer) InOrder(org.mockito.InOrder) Header(io.aeron.logbuffer.Header) MutableInteger(org.agrona.collections.MutableInteger) DebugSendChannelEndpoint(io.aeron.driver.ext.DebugSendChannelEndpoint) InterruptAfter(io.aeron.test.InterruptAfter) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 63 with Header

use of io.aeron.logbuffer.Header in project aeron by real-logic.

the class FragmentedMessageTest method shouldReceivePublishedMessage.

@ParameterizedTest
@MethodSource("channels")
@InterruptAfter(10)
void shouldReceivePublishedMessage(final String channel) {
    final FragmentAssembler assembler = new FragmentAssembler(mockFragmentHandler);
    try (Subscription subscription = aeron.addSubscription(channel, STREAM_ID);
        Publication publication = aeron.addPublication(channel, STREAM_ID)) {
        final UnsafeBuffer srcBuffer = new UnsafeBuffer(new byte[driver.context().mtuLength() * 4]);
        final int offset = 0;
        final int length = srcBuffer.capacity() / 4;
        for (int i = 0; i < 4; i++) {
            srcBuffer.setMemory(i * length, length, (byte) (65 + i));
        }
        while (publication.offer(srcBuffer, offset, srcBuffer.capacity()) < 0L) {
            Tests.yield();
        }
        final int expectedFragmentsBecauseOfHeader = 5;
        int numFragments = 0;
        do {
            final int fragments = subscription.poll(assembler, FRAGMENT_COUNT_LIMIT);
            if (0 == fragments) {
                Tests.yield();
            }
            numFragments += fragments;
        } while (numFragments < expectedFragmentsBecauseOfHeader);
        final ArgumentCaptor<DirectBuffer> bufferArg = ArgumentCaptor.forClass(DirectBuffer.class);
        final ArgumentCaptor<Header> headerArg = ArgumentCaptor.forClass(Header.class);
        verify(mockFragmentHandler, times(1)).onFragment(bufferArg.capture(), eq(offset), eq(srcBuffer.capacity()), headerArg.capture());
        final DirectBuffer capturedBuffer = bufferArg.getValue();
        for (int i = 0; i < srcBuffer.capacity(); i++) {
            assertEquals(srcBuffer.getByte(i), capturedBuffer.getByte(i), "same at i=" + i);
        }
        assertEquals(END_FRAG_FLAG, headerArg.getValue().flags());
    }
}
Also used : DirectBuffer(org.agrona.DirectBuffer) Header(io.aeron.logbuffer.Header) UnsafeBuffer(org.agrona.concurrent.UnsafeBuffer) InterruptAfter(io.aeron.test.InterruptAfter) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Aggregations

Header (io.aeron.logbuffer.Header)63 Test (org.junit.jupiter.api.Test)44 DirectBuffer (org.agrona.DirectBuffer)33 ClientSession (io.aeron.cluster.service.ClientSession)21 StubClusteredService (io.aeron.test.cluster.StubClusteredService)20 ExpandableArrayBuffer (org.agrona.ExpandableArrayBuffer)20 ClusteredService (io.aeron.cluster.service.ClusteredService)18 ClusteredServiceContainer (io.aeron.cluster.service.ClusteredServiceContainer)18 MediaDriver (io.aeron.driver.MediaDriver)18 CloseHelper (org.agrona.CloseHelper)17 Subscription (io.aeron.Subscription)16 Archive (io.aeron.archive.Archive)16 ArchiveThreadingMode (io.aeron.archive.ArchiveThreadingMode)16 AeronCluster (io.aeron.cluster.client.AeronCluster)16 ThreadingMode (io.aeron.driver.ThreadingMode)16 ExtendWith (org.junit.jupiter.api.extension.ExtendWith)16 UnsafeBuffer (org.agrona.concurrent.UnsafeBuffer)15 EgressListener (io.aeron.cluster.client.EgressListener)14 BeforeEach (org.junit.jupiter.api.BeforeEach)14 CLUSTER_MEMBERS (io.aeron.cluster.ClusterTestConstants.CLUSTER_MEMBERS)12