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 cleanupSpies(final NetworkPublication publication) { for (int i = 0, size = subscriptionLinks.size(); i < size; i++) { final SubscriptionLink link = subscriptionLinks.get(i); if (link.isLinked(publication)) { clientProxy.onUnavailableImage( publication.registrationId(), link.registrationId(), publication.streamId(), publication.channel()); subscriptionLinks.get(i).unlink(publication); } } }
assertThat(publication.streamId(), is(STREAM_ID_1)); assertThat(publication.mtuLength(), is(mtu)); assertThat(publication.producerPosition(), is(expectedPosition)); assertThat(publication.consumerPosition(), is(expectedPosition));
private static NetworkPublication findPublication( final ArrayList<NetworkPublication> publications, final int streamId, final SendChannelEndpoint channelEndpoint) { for (int i = 0, size = publications.size(); i < size; i++) { final NetworkPublication publication = publications.get(i); if (streamId == publication.streamId() && channelEndpoint == publication.channelEndpoint() && NetworkPublication.State.ACTIVE == publication.state() && !publication.isExclusive()) { return publication; } } return null; }
/** * 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); }
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); } } }
if (NetworkPublication.State.ACTIVE == publication.state() && subscriptionLink.matches(publication)) publication.registrationId(), streamId, publication.sessionId(), registrationId, subscriberPosition.position().id(), publication.rawLog().fileName(), CommonContext.IPC_CHANNEL);
confirmMatch(channelUri, params, publication.rawLog(), publication.sessionId()); publication.registrationId(), streamId, publication.sessionId(), publication.rawLog().fileName(), publication.publisherLimitId(), channelEndpoint.statusIndicatorCounterId(), isExclusive);
public boolean matches(final NetworkPublication publication) { return streamId == publication.streamId() && udpChannel.canonicalForm().equals(publication.channelEndpoint().udpChannel().canonicalForm()) && isWildcardOrSessionIdMatch(publication.sessionId()); } }
updateConnectedStatus(); final long producerPosition = producerPosition(); publisherPos.setOrdered(producerPosition); if (!isExclusive) checkForBlockedPublisher(producerPosition, senderPosition.getVolatile(), timeNs); final long producerPosition = producerPosition(); publisherPos.setOrdered(producerPosition); final long senderPosition = this.senderPosition.getVolatile(); if (spiesFinishedConsuming(conductor, producerPosition))
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; } }
final RawLog rawLog = publication.rawLog(); LogBufferDescriptor.rawTail(rawLog.metaData(), index, LogBufferDescriptor.packTail(termId, 0)); final TermAppender appender = new TermAppender(rawLog.termBuffers()[index], rawLog.metaData(), index); when(msg.receiverWindowLength()).thenReturn(10); publication.onStatusMessage(msg, new InetSocketAddress("localhost", 4059)); appender.appendUnfragmentedMessage(headerWriter, srcBuffer, 0, 256, null, termId); assertThat(publication.state(), is(NetworkPublication.State.ACTIVE)); (timeNs) -> publication.onStatusMessage(msg, new InetSocketAddress("localhost", 4059)); publication.updateHasReceivers(timeNs); }); assertThat(publication.state(), anyOf(is(NetworkPublication.State.DRAINING), is(NetworkPublication.State.LINGER))); doWorkUntil(() -> nanoClock.nanoTime() >= endTime, publication::updateHasReceivers); assertThat(publication.state(), anyOf(is(NetworkPublication.State.LINGER), is(NetworkPublication.State.CLOSING))); assertThat(publication.state(), is(NetworkPublication.State.CLOSING));
@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()); }
@Test public void shouldSendSetupFrameAfterReceivingStatusMessageWithSetupBit() { final StatusMessageFlyweight msg = mock(StatusMessageFlyweight.class); when(msg.consumptionTermId()).thenReturn(INITIAL_TERM_ID); when(msg.consumptionTermOffset()).thenReturn(0); when(msg.receiverWindowLength()).thenReturn(ALIGNED_FRAME_LENGTH); publication.onStatusMessage(msg, rcvAddress); final UnsafeBuffer buffer = new UnsafeBuffer(ByteBuffer.allocateDirect(PAYLOAD.length)); buffer.putBytes(0, PAYLOAD); termAppenders[0].appendUnfragmentedMessage(headerWriter, buffer, 0, PAYLOAD.length, null, INITIAL_TERM_ID); sender.doWork(); assertThat(receivedFrames.size(), is(2)); // setup then data receivedFrames.remove(); receivedFrames.remove(); publication.triggerSendSetupFrame(); sender.doWork(); assertThat(receivedFrames.size(), is(0)); // setup has been sent already, have to wait currentTimestamp += Configuration.PUBLICATION_SETUP_TIMEOUT_NS + 10; sender.doWork(); assertThat(receivedFrames.size(), is(1)); setupHeader.wrap(new UnsafeBuffer(receivedFrames.remove())); assertThat(setupHeader.headerType(), is(HeaderFlyweight.HDR_TYPE_SETUP)); }
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); } }
@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)); }
if (publication.state() == NetworkPublication.State.ACTIVE) workCount += publication.updatePublisherLimit();
@Test public void shouldNotSendSetupFrameAfterReceivingStatusMessage() { final StatusMessageFlyweight msg = mock(StatusMessageFlyweight.class); when(msg.consumptionTermId()).thenReturn(INITIAL_TERM_ID); when(msg.consumptionTermOffset()).thenReturn(0); when(msg.receiverWindowLength()).thenReturn(0); publication.onStatusMessage(msg, rcvAddress); // publication.senderPositionLimit(flowControl.onStatusMessage(msg, rcvAddress, )); sender.doWork(); assertThat(receivedFrames.size(), is(1)); receivedFrames.remove(); currentTimestamp += Configuration.PUBLICATION_SETUP_TIMEOUT_NS + 10; sender.doWork(); assertThat(receivedFrames.size(), is(1)); dataHeader.wrap(receivedFrames.remove()); assertThat(dataHeader.headerType(), is(HeaderFlyweight.HDR_TYPE_DATA)); // heartbeat assertThat(dataHeader.frameLength(), is(0)); assertThat(dataHeader.termOffset(), is(offsetOfMessage(1))); }
publication = new NetworkPublication( 1, 101,