private Position linkIpcSubscription(final IpcPublication publication, final SubscriptionLink subscription) { final long joinPosition = publication.joinPosition(); final long registrationId = subscription.registrationId(); final int sessionId = publication.sessionId(); final int streamId = subscription.streamId(); final String channel = subscription.channel(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, registrationId, sessionId, streamId, channel, joinPosition); position.setOrdered(joinPosition); publication.addSubscriber(position); subscription.link(publication, position); return position; }
final long producerPosition = producerPosition(); publisherPos.setOrdered(producerPosition); if (!isExclusive) checkForBlockedPublisher(producerPosition, timeNs); final long producerPosition = producerPosition(); publisherPos.setOrdered(producerPosition); if (isDrained(producerPosition))
ipcPublication.registrationId(), streamId, ipcPublication.sessionId(), ipcPublication.rawLog().fileName(), ipcPublication.publisherLimitId(), ChannelEndpointStatus.NO_ID_ALLOCATED, isExclusive); ipcPublication.registrationId(), streamId, ipcPublication.sessionId(), subscriberPosition.subscription().registrationId, subscriberPosition.position().id(), ipcPublication.rawLog().fileName(), channel);
private static IpcPublication findSharedIpcPublication( final ArrayList<IpcPublication> ipcPublications, final long streamId) { IpcPublication ipcPublication = null; for (int i = 0, size = ipcPublications.size(); i < size; i++) { final IpcPublication publication = ipcPublications.get(i); if (publication.streamId() == streamId && !publication.isExclusive() && IpcPublication.State.ACTIVE == publication.state()) { ipcPublication = publication; break; } } return ipcPublication; }
void transitionToLinger(final IpcPublication 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(), CommonContext.IPC_CHANNEL); } } }
@Test public void shouldBeAbleToAddIpcPublicationThenSubscription() { final long idPub = driverProxy.addPublication(CHANNEL_IPC, STREAM_ID_1); final long idSub = driverProxy.addSubscription(CHANNEL_IPC, STREAM_ID_1); driverConductor.doWork(); final IpcPublication ipcPublication = driverConductor.getSharedIpcPublication(STREAM_ID_1); assertNotNull(ipcPublication); final InOrder inOrder = inOrder(mockClientProxy); inOrder.verify(mockClientProxy).onPublicationReady( anyLong(), eq(idPub), eq(STREAM_ID_1), anyInt(), any(), anyInt(), anyInt(), eq(false)); inOrder.verify(mockClientProxy).onSubscriptionReady(eq(idSub), anyInt()); inOrder.verify(mockClientProxy).onAvailableImage( eq(ipcPublication.registrationId()), eq(STREAM_ID_1), eq(ipcPublication.sessionId()), anyLong(), anyInt(), eq(ipcPublication.rawLog().fileName()), anyString()); }
if (IpcPublication.State.ACTIVE == publication.state() && subscriptionLink.matches(publication)) publication.registrationId(), streamId, publication.sessionId(), registrationId, subscriberPosition.position().id(), publication.rawLog().fileName(), channel);
private IpcPublication getOrAddIpcPublication( final long correlationId, final int streamId, final String channel, final boolean isExclusive) { IpcPublication publication = null; final ChannelUri channelUri = ChannelUri.parse(channel); final PublicationParams params = getPublicationParams(ctx, channelUri, this, isExclusive, true); if (!isExclusive) { publication = findSharedIpcPublication(ipcPublications, streamId); } if (null == publication) { if (params.hasSessionId && !params.isSessionIdTagged) { confirmSessionIdNotInUse(params.sessionId); } validateMtuForMaxMessage(params); publication = addIpcPublication(correlationId, streamId, channel, isExclusive, params); } else { confirmMatch(channelUri, params, publication.rawLog(), publication.sessionId()); } return publication; }
if (publication.state() == IpcPublication.State.ACTIVE) workCount += publication.updatePublisherLimit();
@Test public void shouldBeAbleToAddIpcPublicationForReplay() { final int termLength = 128 * 1024; final int initialTermId = 7; final int termId = 11; final int termOffset = 64; final String params = "?term-length=" + termLength + "|init-term-id=" + initialTermId + "|term-id=" + termId + "|term-offset=" + termOffset; when(mockRawLogFactory.newIpcPublication(anyInt(), anyInt(), anyLong(), eq(termLength), anyBoolean())) .thenReturn(LogBufferHelper.newTestLogBuffers(termLength)); driverProxy.addExclusivePublication(CHANNEL_IPC + params, STREAM_ID_1); driverConductor.doWork(); final ArgumentCaptor<Long> captor = ArgumentCaptor.forClass(Long.class); verify(mockClientProxy).onPublicationReady( anyLong(), captor.capture(), eq(STREAM_ID_1), anyInt(), any(), anyInt(), anyInt(), eq(true)); final long registrationId = captor.getValue(); final IpcPublication publication = driverConductor.getIpcPublication(registrationId); assertThat(publication.streamId(), is(STREAM_ID_1)); final long expectedPosition = termLength * (termId - initialTermId) + termOffset; assertThat(publication.producerPosition(), is(expectedPosition)); assertThat(publication.consumerPosition(), is(expectedPosition)); }
public void decRef() { if (0 == --refCount) { state = State.INACTIVE; final long producerPosition = producerPosition(); if (publisherLimit.get() > producerPosition) { publisherLimit.setOrdered(producerPosition); } LogBufferDescriptor.endOfStreamPosition(metaDataBuffer, producerPosition); } }
IpcPublication getIpcPublication(final long registrationId) { for (int i = 0, size = ipcPublications.size(); i < size; i++) { final IpcPublication publication = ipcPublications.get(i); if (publication.registrationId() == registrationId) { return publication; } } return null; }
void cleanupIpcPublication(final IpcPublication publication) { activeSessionIds.remove(publication.sessionId()); for (int i = 0, size = subscriptionLinks.size(); i < size; i++) { subscriptionLinks.get(i).unlink(publication); } }
@Test public void shouldHaveJoiningPositionZeroWhenNoSubscriptions() { assertThat(ipcPublication.joinPosition(), is(0L)); }
@Test public void shouldKeepPublisherLimitZeroOnNoSubscriptionUpdate() { ipcPublication.updatePublisherLimit(); assertThat(publisherLimit.get(), is(0L)); }
final IpcPublication publication = new IpcPublication( registrationId, params.entityTag,
publisherLimit = new UnsafeBufferPosition(counterBuffer, ipcPublication.publisherLimitId());
@Test public void shouldBeAbleToAddSubscriptionThenIpcPublication() { final long idSub = driverProxy.addSubscription(CHANNEL_IPC, STREAM_ID_1); final long idPub = driverProxy.addPublication(CHANNEL_IPC, STREAM_ID_1); driverConductor.doWork(); final IpcPublication ipcPublication = driverConductor.getSharedIpcPublication(STREAM_ID_1); assertNotNull(ipcPublication); final InOrder inOrder = inOrder(mockClientProxy); inOrder.verify(mockClientProxy).onSubscriptionReady(eq(idSub), anyInt()); inOrder.verify(mockClientProxy).onPublicationReady( anyLong(), eq(idPub), eq(STREAM_ID_1), anyInt(), any(), anyInt(), anyInt(), eq(false)); inOrder.verify(mockClientProxy).onAvailableImage( eq(ipcPublication.registrationId()), eq(STREAM_ID_1), eq(ipcPublication.sessionId()), anyLong(), anyInt(), eq(ipcPublication.rawLog().fileName()), anyString()); }
if (IpcPublication.State.ACTIVE == publication.state() && subscriptionLink.matches(publication)) publication.registrationId(), streamId, publication.sessionId(), registrationId, subscriberPosition.position().id(), publication.rawLog().fileName(), channel);