Skip to content

Commit

Permalink
Demonstrate issue exceeding numInGroup in ControlNotification.
Browse files Browse the repository at this point in the history
Relates to support ticket: 18482.

Session reconnections growth in `LiveLibraryInfo#allSessions`.
Upon a library timeout and reconnection, the engine attempts to send
details of these sessions to the library; however, that exceeds the
maximum group size.
  • Loading branch information
ZachBray committed Apr 18, 2024
1 parent 637c519 commit b4cfa23
Showing 1 changed file with 90 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,54 @@
*/
package uk.co.real_logic.artio.system_tests;

import org.junit.Test;
import uk.co.real_logic.artio.engine.ConnectedSessionInfo;
import uk.co.real_logic.artio.engine.EngineConfiguration;
import uk.co.real_logic.artio.engine.FixEngine;
import uk.co.real_logic.artio.engine.SessionInfo;
import uk.co.real_logic.artio.engine.*;
import uk.co.real_logic.artio.engine.framer.LibraryInfo;
import uk.co.real_logic.artio.library.FixLibrary;
import uk.co.real_logic.artio.library.LibraryConfiguration;
import org.junit.Ignore;
import org.junit.Test;

import java.util.List;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.*;
import static uk.co.real_logic.artio.FixMatchers.hasConnectionId;
import static uk.co.real_logic.artio.FixMatchers.hasSessionId;
import static uk.co.real_logic.artio.TestFixtures.launchMediaDriver;
import static uk.co.real_logic.artio.Timing.DEFAULT_TIMEOUT_IN_MS;
import static uk.co.real_logic.artio.Timing.assertEventuallyTrue;
import static uk.co.real_logic.artio.messages.InitialAcceptedSessionOwner.SOLE_LIBRARY;
import static uk.co.real_logic.artio.messages.SessionState.ACTIVE;
import static uk.co.real_logic.artio.system_tests.SystemTestUtil.*;

public class SoleLibrarySystemTest extends AbstractGatewayToGatewaySystemTest
{
private LockStepFramerEngineScheduler scheduler;

private void launch()
{
launch(true);
launch(true, false);
}

private void launch(final boolean logMessages)
private void launch(final boolean logMessages, final boolean useScheduler)
{
mediaDriver = launchMediaDriver();


final EngineConfiguration acceptingConfig = acceptingConfig(port, ACCEPTOR_ID, INITIATOR_ID, nanoClock)
.deleteLogFileDirOnStart(true)
.replyTimeoutInMs(120_000)
.initialAcceptedSessionOwner(SOLE_LIBRARY);

if (useScheduler)
{
scheduler = new LockStepFramerEngineScheduler();
acceptingConfig.scheduler(scheduler);
}

acceptingEngine = FixEngine.launch(acceptingConfig);

final EngineConfiguration initiatingConfig =
Expand All @@ -59,9 +73,23 @@ private void launch(final boolean logMessages)
initiatingEngine = FixEngine.launch(initiatingConfig);

final LibraryConfiguration acceptingLibraryConfig = acceptingLibraryConfig(acceptingHandler, nanoClock);
acceptingLibrary = connect(acceptingLibraryConfig);
acceptingLibrary = FixLibrary.connect(acceptingLibraryConfig);
assertEventuallyTrue(
() -> "Unable to connect to engine",
() ->
{
if (useScheduler)
{
scheduler.invokeFramer();
}
acceptingLibrary.poll(LIBRARY_LIMIT);

return acceptingLibrary.isConnected();
},
DEFAULT_TIMEOUT_IN_MS,
acceptingLibrary::close);
initiatingLibrary = connect(initiatingLibraryConfig(libraryAeronPort, initiatingHandler, nanoClock));
testSystem = new TestSystem(acceptingLibrary, initiatingLibrary);
testSystem = new TestSystem(scheduler, acceptingLibrary, initiatingLibrary);
}

@Test(timeout = TEST_TIMEOUT_IN_MS)
Expand Down Expand Up @@ -105,6 +133,57 @@ public void shouldSupportUnreleasedOfflineSessionsInSoleLibraryMode()
assertEquals(1, acceptingSession.lastSentMsgSeqNum());
}

@Test(timeout = TEST_TIMEOUT_IN_MS)
@Ignore
public void shouldSupportManySessionReconnections()
{
launch(false, true);

// 300 > number in groupSizeEncoding
for (int i = 0; i < 300; i++)
{
connectAndAcquire();
messagesCanBeExchanged();
disconnectSessions();
}

assertThat(acceptingLibrary.sessions(), hasItem(acceptingSession));
final long sessionId = acceptingSession.id();
assertCountersClosed(false, acceptingSession);

assertOfflineSession(sessionId, acceptingSession);
assertCountersClosed(false, acceptingSession);

final long testDeadlineMs = System.currentTimeMillis() + 10_000;

// trigger library timeout
while (acceptingLibrary.isConnected())
{
acceptingLibrary.poll(10);
initiatingLibrary.poll(10);

if (System.currentTimeMillis() > testDeadlineMs)
{
fail("Failed to disconnect library");
}
}

// library reconnect
while (!acceptingLibrary.isConnected())
{
testSystem.poll();

if (System.currentTimeMillis() > testDeadlineMs)
{
fail("Failed to reconnect library");
}
}

connectAndAcquire();
assertEquals(ACTIVE, acceptingSession.state());
messagesCanBeExchanged();
}

private void connectAndAcquire()
{
connectSessions();
Expand All @@ -130,7 +209,7 @@ public void shouldAllowReconnectingInitiatorsToReconnect()
public void shouldAcquireSessionsWithLoggingSwitchedOff()
{
// Equivalent invariant tested in Engine mode in NoLoggingGatewayToGatewaySystemTest
launch(false);
launch(false, false);

connectAndAcquire();
acceptingMessagesCanBeExchanged();
Expand Down

0 comments on commit b4cfa23

Please sign in to comment.