/** * Called from the {@link Sender} to add information to the control packet dispatcher. * * @param publication to add to the dispatcher */ public void registerForSend(final NetworkPublication publication) { publicationBySessionAndStreamId.put(publication.sessionId(), publication.streamId(), publication); }
/** * Called from the {@link Sender} to remove information from the control packet dispatcher. * * @param publication to remove */ public void unregisterForSend(final NetworkPublication publication) { publicationBySessionAndStreamId.remove(publication.sessionId(), publication.streamId()); }
@Advice.OnMethodEnter static void cleanupPublication(final NetworkPublication publication) { LOGGER.logPublicationRemoval(publication.channel(), publication.sessionId(), publication.streamId()); } }
public boolean matches(final NetworkPublication publication) { return streamId == publication.streamId() && udpChannel.canonicalForm().equals(publication.channelEndpoint().udpChannel().canonicalForm()) && isWildcardOrSessionIdMatch(publication.sessionId()); } }
private void getSessionId(final ChannelUri channelUri, final DriverConductor driverConductor) { final String sessionIdStr = channelUri.get(SESSION_ID_PARAM_NAME); if (null != sessionIdStr) { isSessionIdTagged = ChannelUri.isTagged(sessionIdStr); if (isSessionIdTagged) { final NetworkPublication publication = driverConductor.findNetworkPublicationByTag( ChannelUri.getTag(sessionIdStr)); if (null == publication) { throw new IllegalArgumentException( SESSION_ID_PARAM_NAME + "=" + sessionIdStr + " must reference a network publication"); } sessionId = publication.sessionId(); mtuLength = publication.mtuLength(); termLength = publication.termBufferLength(); } else { sessionId = Integer.parseInt(sessionIdStr); } hasSessionId = true; } }
@Before public void setup() { when(mockSystemCounters.get(any())).thenReturn(mockStatusMessagesReceivedCounter); when(mockPublication.streamId()).thenReturn(STREAM_ID); when(mockPublication.sessionId()).thenReturn(SESSION_ID); context.systemCounters(mockSystemCounters); context.receiveChannelEndpointThreadLocals(new ReceiveChannelEndpointThreadLocals(context)); }
@Test public void shouldAddPublicationWithSessionId() { final int sessionId = 4096; final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + sessionId; driverProxy.addPublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); assertThat(argumentCaptor.getValue().sessionId(), is(sessionId)); }
@Test public void shouldAddExclusivePublicationWithSessionId() { final int sessionId = 4096; final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + sessionId; driverProxy.addExclusivePublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); assertThat(argumentCaptor.getValue().sessionId(), is(sessionId)); }
@Test public void shouldAddPublicationWithSameSessionId() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); final int sessionId = argumentCaptor.getValue().sessionId(); final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + sessionId; driverProxy.addPublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); verify(mockClientProxy, times(2)).onPublicationReady( anyLong(), anyLong(), eq(STREAM_ID_1), eq(sessionId), anyString(), anyInt(), anyInt(), eq(false)); }
@Test public void shouldAddExclusivePublicationWithSameSessionId() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); final int sessionId = argumentCaptor.getValue().sessionId(); final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + (sessionId + 1); driverProxy.addExclusivePublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); verify(mockClientProxy).onPublicationReady( anyLong(), anyLong(), eq(STREAM_ID_1), eq(sessionId), anyString(), anyInt(), anyInt(), eq(false)); verify(mockClientProxy).onPublicationReady( anyLong(), anyLong(), eq(STREAM_ID_1), eq(sessionId + 1), anyString(), anyInt(), anyInt(), eq(true)); }
@Test public void shouldErrorOnAddPublicationWithClashingSessionId() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + argumentCaptor.getValue().sessionId(); final long correlationId = driverProxy.addExclusivePublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); verify(mockClientProxy).onError(eq(correlationId), eq(GENERIC_ERROR), anyString()); verify(mockErrorCounter).increment(); verify(mockErrorHandler).onError(any(Throwable.class)); }
@Test public void shouldErrorOnAddPublicationWithNonEqualSessionId() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + (argumentCaptor.getValue().sessionId() + 1); final long correlationId = driverProxy.addPublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); verify(mockClientProxy).onError(eq(correlationId), eq(GENERIC_ERROR), anyString()); verify(mockErrorCounter).increment(); verify(mockErrorHandler).onError(any(Throwable.class)); }
@Test public void shouldBeAbleToAddSingleSpyThenNetworkPublication() { final long idSpy = driverProxy.addSubscription(spyForChannel(CHANNEL_4000), STREAM_ID_1); driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> captor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy, times(1)).newNetworkPublication(captor.capture()); final NetworkPublication publication = captor.getValue(); assertTrue(publication.hasSpies()); final InOrder inOrder = inOrder(mockClientProxy); inOrder.verify(mockClientProxy).onSubscriptionReady(eq(idSpy), anyInt()); inOrder.verify(mockClientProxy).onAvailableImage( eq(networkPublicationCorrelationId(publication)), eq(STREAM_ID_1), eq(publication.sessionId()), anyLong(), anyInt(), eq(publication.rawLog().fileName()), anyString()); }
private void linkSpies(final ArrayList<SubscriptionLink> links, final NetworkPublication publication) { for (int i = 0, size = links.size(); i < size; i++) { final SubscriptionLink subscription = links.get(i); if (subscription.matches(publication) && !subscription.isLinked(publication)) { final Position subPos = linkSpy(publication, subscription); clientProxy.onAvailableImage( publication.registrationId(), publication.streamId(), publication.sessionId(), subscription.registrationId(), subPos.id(), publication.rawLog().fileName(), CommonContext.IPC_CHANNEL); } } }
@Test public void shouldBeAbleToAddNetworkPublicationThenSingleSpy() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); final long idSpy = driverProxy.addSubscription(spyForChannel(CHANNEL_4000), STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> captor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy, times(1)).newNetworkPublication(captor.capture()); final NetworkPublication publication = captor.getValue(); assertTrue(publication.hasSpies()); final InOrder inOrder = inOrder(mockClientProxy); inOrder.verify(mockClientProxy).onSubscriptionReady(eq(idSpy), anyInt()); inOrder.verify(mockClientProxy).onAvailableImage( eq(networkPublicationCorrelationId(publication)), eq(STREAM_ID_1), eq(publication.sessionId()), anyLong(), anyInt(), eq(publication.rawLog().fileName()), anyString()); }
@Test public void shouldAddSingleSpyThenNetworkPublicationWithSameSessionId() { final int sessionId = -4097; final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + sessionId; driverProxy.addSubscription(spyForChannel(CHANNEL_4000 + sessionIdParam), STREAM_ID_1); driverProxy.addPublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> captor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy, times(1)).newNetworkPublication(captor.capture()); final NetworkPublication publication = captor.getValue(); assertTrue(publication.hasSpies()); verify(mockClientProxy).onAvailableImage( eq(networkPublicationCorrelationId(publication)), eq(STREAM_ID_1), eq(publication.sessionId()), anyLong(), anyInt(), eq(publication.rawLog().fileName()), anyString()); }
@Test public void shouldAddNetworkPublicationThenSingleSpyWithSameSessionId() { final int sessionId = -4097; final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + sessionId; driverProxy.addPublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverProxy.addSubscription(spyForChannel(CHANNEL_4000 + sessionIdParam), STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> captor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy, times(1)).newNetworkPublication(captor.capture()); final NetworkPublication publication = captor.getValue(); assertTrue(publication.hasSpies()); verify(mockClientProxy).onAvailableImage( eq(networkPublicationCorrelationId(publication)), eq(STREAM_ID_1), eq(publication.sessionId()), anyLong(), anyInt(), eq(publication.rawLog().fileName()), anyString()); }
@Test public void shouldAvoidAssigningClashingSessionIdOnAddPublication() { driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<NetworkPublication> argumentCaptor = ArgumentCaptor.forClass(NetworkPublication.class); verify(senderProxy).newNetworkPublication(argumentCaptor.capture()); final int sessionId = argumentCaptor.getValue().sessionId(); final String sessionIdParam = "|" + CommonContext.SESSION_ID_PARAM_NAME + "=" + (sessionId + 1); driverProxy.addExclusivePublication(CHANNEL_4000 + sessionIdParam, STREAM_ID_1); driverConductor.doWork(); final long correlationId = driverProxy.addPublication(CHANNEL_4000, STREAM_ID_1 + 1); driverConductor.doWork(); verify(mockClientProxy).onPublicationReady( eq(correlationId), anyLong(), eq(STREAM_ID_1 + 1), eq(sessionId + 2), anyString(), anyInt(), anyInt(), eq(false)); }
private Position linkSpy(final NetworkPublication publication, final SubscriptionLink subscription) { final long joinPosition = publication.consumerPosition(); final long subscriberRegistrationId = subscription.registrationId(); final int streamId = publication.streamId(); final int sessionId = publication.sessionId(); final String channel = subscription.channel(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, subscriberRegistrationId, sessionId, streamId, channel, joinPosition); position.setOrdered(joinPosition); publication.addSubscriber(position); subscription.link(publication, position); return position; }
void cleanupPublication(final NetworkPublication publication) { activeSessionIds.remove(publication.sessionId()); senderProxy.removeNetworkPublication(publication); final SendChannelEndpoint channelEndpoint = publication.channelEndpoint(); if (channelEndpoint.shouldBeClosed()) { channelEndpoint.closeStatusIndicator(); sendChannelEndpointByChannelMap.remove(channelEndpoint.udpChannel().canonicalForm()); senderProxy.closeSendChannelEndpoint(channelEndpoint); } }