public ServerResponse remoteAddress(RemoteAddress remoteAddress) { this.remoteStreamId = remoteAddress.getStreamId(); return this; }
public ServerResponse remoteAddress(RemoteAddress remoteAddress) { this.remoteStreamId = remoteAddress.getStreamId(); return this; }
/** * Set the current endpoint address for the node id. It will also register the socket address so a * transport channel will be managed for this endpoint. * * @param nodeId the node id of the endpoint * @param socketAddress the socket address of the endpoint * @return the previous socket address if it has changed, otherwise null */ @Override public SocketAddress setEndpoint(final int nodeId, final SocketAddress socketAddress) { LOG.info( "Registering endpoint for node '{}' with address '{}' on transport '{}'", nodeId, socketAddress, name); final RemoteAddress remoteAddress = remoteAddressList.register(socketAddress); final RemoteAddress lastRemoteAddress = endpoints.put(nodeId, remoteAddress); if (lastRemoteAddress != null && lastRemoteAddress.getStreamId() != remoteAddress.getStreamId()) { return deactivateRemote(nodeId, lastRemoteAddress); } else { return null; } }
/** * Set the current endpoint address for the node id. It will also register the socket address so a * transport channel will be managed for this endpoint. * * @param nodeId the node id of the endpoint * @param socketAddress the socket address of the endpoint * @return the previous socket address if it has changed, otherwise null */ @Override public SocketAddress setEndpoint(final int nodeId, final SocketAddress socketAddress) { LOG.info( "Registering endpoint for node '{}' with address '{}' on transport '{}'", nodeId, socketAddress, name); final RemoteAddress remoteAddress = remoteAddressList.register(socketAddress); final RemoteAddress lastRemoteAddress = endpoints.put(nodeId, remoteAddress); if (lastRemoteAddress != null && lastRemoteAddress.getStreamId() != remoteAddress.getStreamId()) { return deactivateRemote(nodeId, lastRemoteAddress); } else { return null; } }
/** * Effect: This remote address/stream is never used again; no channel will every be managed for * this again; if the underlying socket address is registered again, a new remote address is * assigned (+ new stream id) */ @Override public synchronized void retire(RemoteAddress remote) { getByStreamId(remote.getStreamId()).retire(); }
@Override public boolean sendMessage(Integer nodeId, BufferWriter writer) { final RemoteAddress remoteAddress = endpointRegistry.getEndpoint(nodeId); if (remoteAddress != null) { return sendTransportMessage(remoteAddress.getStreamId(), writer); } else { return false; } }
/** * Effect: This remote address/stream is never used again; no channel will every be managed for * this again; if the underlying socket address is registered again, a new remote address is * assigned (+ new stream id) */ @Override public synchronized void retire(RemoteAddress remote) { getByStreamId(remote.getStreamId()).retire(); }
/** * This stream is deactivated until it is registered again; the stream id in this case will remain * stable * * @param remote */ @Override public synchronized void deactivate(RemoteAddress remote) { getByStreamId(remote.getStreamId()).deactivate(); }
@Override public boolean sendMessage(Integer nodeId, BufferWriter writer) { final RemoteAddress remoteAddress = endpointRegistry.getEndpoint(nodeId); if (remoteAddress != null) { return sendTransportMessage(remoteAddress.getStreamId(), writer); } else { return false; } }
/** * This stream is deactivated until it is registered again; the stream id in this case will remain * stable * * @param remote */ @Override public synchronized void deactivate(RemoteAddress remote) { getByStreamId(remote.getStreamId()).deactivate(); }
private boolean sendNotLeaderResponse( final ServerOutput output, final RemoteAddress remoteAddress, final long requestId) { response .reset() .requestId(requestId) .remoteStreamId(remoteAddress.getStreamId()) .writer(notLeaderResponse); return output.sendResponse(response); }
LOG.trace("Received gossip event {} from node '{}'", eventType, gossipEvent.getSenderId()); consumer.accept(gossipEvent, requestId, remoteAddress.getStreamId()); } else { LOG.warn("No consumer registered for gossip event type '{}'", eventType);
private boolean sendNotLeaderResponse( final ServerOutput output, final RemoteAddress remoteAddress, final long requestId) { response .reset() .requestId(requestId) .remoteStreamId(remoteAddress.getStreamId()) .writer(notLeaderResponse); return output.sendResponse(response); }
LOG.trace("Received gossip event {} from node '{}'", eventType, gossipEvent.getSenderId()); consumer.accept(gossipEvent, requestId, remoteAddress.getStreamId()); } else { LOG.warn("No consumer registered for gossip event type '{}'", eventType);
private void onRequestSubmitted(final OutgoingRequest request) { if (!request.hasTimeoutScheduled()) { final long timerId = requestTimeouts.scheduleTimer( ActorClock.currentTimeMillis() + request.getTimeout().toMillis()); request.setTimerId(timerId); requestsByTimeoutIds.put(timerId, request); } if (!request.isTimedout()) { final RemoteAddress remoteAddress = request.getNextRemoteAddress(); if (remoteAddress != null) { final ChannelWriteQueue sendQueue = channelMap.get(remoteAddress.getStreamId()); if (sendQueue != null) { request.markRemoteAddress(remoteAddress); sendQueue.offer(request); } else { // channel not open, retry actor.runDelayed(Duration.ofMillis(10), () -> submittedRequests.offer(request)); } } else { // no remote address available, retry actor.runDelayed(Duration.ofMillis(10), () -> submittedRequests.offer(request)); } } }
private void onRequestSubmitted(final OutgoingRequest request) { if (!request.hasTimeoutScheduled()) { final long timerId = requestTimeouts.scheduleTimer( ActorClock.currentTimeMillis() + request.getTimeout().toMillis()); request.setTimerId(timerId); requestsByTimeoutIds.put(timerId, request); } if (!request.isTimedout()) { final RemoteAddress remoteAddress = request.getNextRemoteAddress(); if (remoteAddress != null) { final ChannelWriteQueue sendQueue = channelMap.get(remoteAddress.getStreamId()); if (sendQueue != null) { request.markRemoteAddress(remoteAddress); sendQueue.offer(request); } else { // channel not open, retry actor.runDelayed(Duration.ofMillis(10), () -> submittedRequests.offer(request)); } } else { // no remote address available, retry actor.runDelayed(Duration.ofMillis(10), () -> submittedRequests.offer(request)); } } }
@Test public void shouldHandleCommandRequest() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final byte[] valueBuffer = new byte[JOB_EVENT.length]; loggedEvent .getValueBuffer() .getBytes(loggedEvent.getValueOffset(), valueBuffer, 0, loggedEvent.getValueLength()); assertThat(loggedEvent.getValueLength()).isEqualTo(JOB_EVENT.length); assertThat(valueBuffer).isEqualTo(JOB_EVENT); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getRequestId()).isEqualTo(REQUEST_ID); assertThat(eventMetadata.getRequestStreamId()).isEqualTo(DEFAULT_ADDRESS.getStreamId()); }
@Test public void shouldHandleCommandRequest() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final byte[] valueBuffer = new byte[JOB_EVENT.length]; loggedEvent .getValueBuffer() .getBytes(loggedEvent.getValueOffset(), valueBuffer, 0, loggedEvent.getValueLength()); assertThat(loggedEvent.getValueLength()).isEqualTo(JOB_EVENT.length); assertThat(valueBuffer).isEqualTo(JOB_EVENT); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getRequestId()).isEqualTo(REQUEST_ID); assertThat(eventMetadata.getRequestStreamId()).isEqualTo(DEFAULT_ADDRESS.getStreamId()); }
@Test public void shouldHandleControlRequest() { // given final int writtenLength = writeControlRequestToBuffer(buffer); when(mockControlMessageDispatcher.claim(any(ClaimedFragment.class), anyInt())) .thenAnswer(claimFragment(0)); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); verify(mockControlMessageDispatcher).claim(any(ClaimedFragment.class), anyInt()); int offset = fragmentOffset; controlMessageRequestHeaderDescriptor.wrap(sendBuffer, offset); assertThat(controlMessageRequestHeaderDescriptor.streamId()) .isEqualTo(DEFAULT_ADDRESS.getStreamId()); assertThat(controlMessageRequestHeaderDescriptor.requestId()).isEqualTo(REQUEST_ID); offset += ControlMessageRequestHeaderDescriptor.headerLength(); headerEncoder.wrap(sendBuffer, offset); offset += headerEncoder.encodedLength(); controlRequestDecoder.wrap( sendBuffer, offset, controlRequestDecoder.sbeBlockLength(), controlRequestDecoder.sbeSchemaVersion()); final byte[] requestData = readBytes(controlRequestDecoder::getData, controlRequestDecoder::dataLength); assertThat(requestData).isEqualTo(JOB_EVENT); }
@Test public void shouldHandleControlRequest() { // given final int writtenLength = writeControlRequestToBuffer(buffer); when(mockControlMessageDispatcher.claim(any(ClaimedFragment.class), anyInt())) .thenAnswer(claimFragment(0)); // when final boolean isHandled = messageHandler.onRequest( serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, REQUEST_ID); // then assertThat(isHandled).isTrue(); verify(mockControlMessageDispatcher).claim(any(ClaimedFragment.class), anyInt()); int offset = fragmentOffset; controlMessageRequestHeaderDescriptor.wrap(sendBuffer, offset); assertThat(controlMessageRequestHeaderDescriptor.streamId()) .isEqualTo(DEFAULT_ADDRESS.getStreamId()); assertThat(controlMessageRequestHeaderDescriptor.requestId()).isEqualTo(REQUEST_ID); offset += ControlMessageRequestHeaderDescriptor.headerLength(); headerEncoder.wrap(sendBuffer, offset); offset += headerEncoder.encodedLength(); controlRequestDecoder.wrap( sendBuffer, offset, controlRequestDecoder.sbeBlockLength(), controlRequestDecoder.sbeSchemaVersion()); final byte[] requestData = readBytes(controlRequestDecoder::getData, controlRequestDecoder::dataLength); assertThat(requestData).isEqualTo(JOB_EVENT); }