@Override protected List<JoinGroupRequest.ProtocolMetadata> metadata() { return Collections.singletonList(new JoinGroupRequest.ProtocolMetadata("dummy-subprotocol", EMPTY_DATA)); }
@Override public boolean matches(AbstractRequest body) { JoinGroupRequest joinGroupRequest = (JoinGroupRequest) body; PartitionAssignor.Subscription subscription = ConsumerProtocol.deserializeSubscription(joinGroupRequest.groupProtocols().get(0).metadata()); return subscribedTopics.equals(new HashSet<>(subscription.topics())); } }, joinGroupFollowerResponse(assignor, 1, "memberId", "leaderId", Errors.NONE), coordinator);
private void handleJoinGroupRequest(ChannelHandlerContext ctx, Request request) { JoinGroupRequest joinGroupRequest = (JoinGroupRequest) request.getBody(); ResponseHeader responseHeader = new ResponseHeader(request.getHeader().correlationId()); List<ProtocolEntry> protocols = joinGroupRequest.groupProtocols().stream().map(protocol -> new ProtocolEntry(protocol.name(), Utils.toArray(protocol.metadata()))).collect(Collectors.toList()); coordinator.handleJoinGroup( joinGroupRequest.groupId(), joinGroupRequest.memberId(), request.getHeader().clientId(), request.getClientAddress().toString(), joinGroupRequest.rebalanceTimeout(), joinGroupRequest.sessionTimeout(), joinGroupRequest.protocolType(), protocols, (joinResult) -> { Map<String, ByteBuffer> members = joinResult.getMembers().entrySet().stream().collect(Collectors.toMap(k -> k.getKey(), k -> ByteBuffer.wrap(k.getValue()))); JoinGroupResponse responseBody = new JoinGroupResponse(request.getHeader().apiVersion(), joinResult.getErrorCode(), joinResult.getGenerationId(), joinResult.getSubProtocol(), joinResult.getMemberId(), joinResult.getLeaderId(), members); logger.trace(String.format("Sending join group response %s for correlation id %d to client %s.", responseBody, request.getHeader().correlationId(), request.getHeader().clientId())); sendResponse(ctx, new Response(responseHeader, responseBody)); } ); }
@Override public List<ProtocolMetadata> metadata() { configSnapshot = configStorage.snapshot(); ConnectProtocol.WorkerState workerState = new ConnectProtocol.WorkerState(restUrl, configSnapshot.offset()); ByteBuffer metadata = ConnectProtocol.serializeMetadata(workerState); return Collections.singletonList(new ProtocolMetadata(DEFAULT_SUBPROTOCOL, metadata)); }
@Override public List<ProtocolMetadata> metadata() { configSnapshot = taskConfigManager.snapshot(); DatalinkProtocol.WorkerState workerState = new DatalinkProtocol.WorkerState(restUrl, configSnapshot.version()); ByteBuffer metadata = DatalinkProtocol.serializeMetadata(workerState); return Collections.singletonList(new ProtocolMetadata(DEFAULT_SUBPROTOCOL, metadata)); }
@Test public void testProtocolMetadataOrder() { RoundRobinAssignor roundRobin = new RoundRobinAssignor(); RangeAssignor range = new RangeAssignor(); try (Metrics metrics = new Metrics(time)) { ConsumerCoordinator coordinator = buildCoordinator(metrics, Arrays.<PartitionAssignor>asList(roundRobin, range), ConsumerConfig.DEFAULT_EXCLUDE_INTERNAL_TOPICS, false, true); List<ProtocolMetadata> metadata = coordinator.metadata(); assertEquals(2, metadata.size()); assertEquals(roundRobin.name(), metadata.get(0).name()); assertEquals(range.name(), metadata.get(1).name()); } try (Metrics metrics = new Metrics(time)) { ConsumerCoordinator coordinator = buildCoordinator(metrics, Arrays.<PartitionAssignor>asList(range, roundRobin), ConsumerConfig.DEFAULT_EXCLUDE_INTERNAL_TOPICS, false, true); List<ProtocolMetadata> metadata = coordinator.metadata(); assertEquals(2, metadata.size()); assertEquals(range.name(), metadata.get(0).name()); assertEquals(roundRobin.name(), metadata.get(1).name()); } }
public JoinGroupRequest(Struct struct, short versionId) { super(ApiKeys.JOIN_GROUP, versionId); groupId = struct.get(GROUP_ID); sessionTimeout = struct.getInt(SESSION_TIMEOUT_KEY_NAME); if (struct.hasField(REBALANCE_TIMEOUT_KEY_NAME)) // rebalance timeout is added in v1 rebalanceTimeout = struct.getInt(REBALANCE_TIMEOUT_KEY_NAME); else // v0 had no rebalance timeout but used session timeout implicitly rebalanceTimeout = sessionTimeout; memberId = struct.get(MEMBER_ID); protocolType = struct.getString(PROTOCOL_TYPE_KEY_NAME); groupProtocols = new ArrayList<>(); for (Object groupProtocolObj : struct.getArray(GROUP_PROTOCOLS_KEY_NAME)) { Struct groupProtocolStruct = (Struct) groupProtocolObj; String name = groupProtocolStruct.getString(PROTOCOL_NAME_KEY_NAME); ByteBuffer metadata = groupProtocolStruct.getBytes(PROTOCOL_METADATA_KEY_NAME); groupProtocols.add(new ProtocolMetadata(name, metadata)); } }
@Override public List<ProtocolMetadata> metadata() { this.joinedSubscription = subscriptions.subscription(); List<ProtocolMetadata> metadataList = new ArrayList<>(); for (PartitionAssignor assignor : assignors) { Subscription subscription = assignor.subscription(joinedSubscription); ByteBuffer metadata = ConsumerProtocol.serializeSubscription(subscription); metadataList.add(new ProtocolMetadata(assignor.name(), metadata)); } return metadataList; }
@Override public boolean matches(AbstractRequest body) { JoinGroupRequest join = (JoinGroupRequest) body; ProtocolMetadata protocolMetadata = join.groupProtocols().iterator().next(); PartitionAssignor.Subscription subscription = ConsumerProtocol.deserializeSubscription(protocolMetadata.metadata()); protocolMetadata.metadata().rewind(); return subscription.topics().containsAll(updatedSubscriptionSet); } }, joinGroupLeaderResponse(2, consumerId, updatedSubscriptions, Errors.NONE));
private JoinGroupRequest createJoinGroupRequest(int version) { ByteBuffer metadata = ByteBuffer.wrap(new byte[] {}); List<JoinGroupRequest.ProtocolMetadata> protocols = new ArrayList<>(); protocols.add(new JoinGroupRequest.ProtocolMetadata("consumer-range", metadata)); if (version == 0) { return new JoinGroupRequest.Builder("group1", 30000, "consumer1", "consumer", protocols). build((short) version); } else { return new JoinGroupRequest.Builder("group1", 10000, "consumer1", "consumer", protocols). setRebalanceTimeout(60000).build(); } }