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);
}
}
}
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));
}
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());
}
}
Aggregations