@Test public void testJoinGroupRequestVersion0RebalanceTimeout() { final short version = 0; JoinGroupRequest jgr = createJoinGroupRequest(version); JoinGroupRequest jgr2 = new JoinGroupRequest(jgr.toStruct(), version); assertEquals(jgr2.rebalanceTimeout(), jgr.rebalanceTimeout()); }
@Override public boolean matches(AbstractRequest body) { if (!(body instanceof JoinGroupRequest)) { return false; } JoinGroupRequest joinGroupRequest = (JoinGroupRequest) body; if (!joinGroupRequest.memberId().equals(memberId)) { return false; } return true; } }, joinGroupResponse(Errors.UNKNOWN_MEMBER_ID));
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 JoinGroupRequest build(short version) { if (version < 1) { // v0 had no rebalance timeout but used session timeout implicitly rebalanceTimeout = sessionTimeout; } return new JoinGroupRequest(version, groupId, sessionTimeout, rebalanceTimeout, memberId, protocolType, groupProtocols); }
@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);
@Override public AbstractResponse getErrorResponse(int throttleTimeMs, Throwable e) { short versionId = version(); switch (versionId) { case 0: case 1: return new JoinGroupResponse( Errors.forException(e), JoinGroupResponse.UNKNOWN_GENERATION_ID, JoinGroupResponse.UNKNOWN_PROTOCOL, JoinGroupResponse.UNKNOWN_MEMBER_ID, // memberId JoinGroupResponse.UNKNOWN_MEMBER_ID, // leaderId Collections.emptyMap()); case 2: case 3: case 4: return new JoinGroupResponse( throttleTimeMs, Errors.forException(e), JoinGroupResponse.UNKNOWN_GENERATION_ID, JoinGroupResponse.UNKNOWN_PROTOCOL, JoinGroupResponse.UNKNOWN_MEMBER_ID, // memberId JoinGroupResponse.UNKNOWN_MEMBER_ID, // leaderId Collections.emptyMap()); default: throw new IllegalArgumentException(String.format("Version %d is not valid. Valid versions for %s are 0 to %d", versionId, this.getClass().getSimpleName(), ApiKeys.JOIN_GROUP.latestVersion())); } }
public static JoinGroupRequest parse(ByteBuffer buffer, short version) { return new JoinGroupRequest(ApiKeys.JOIN_GROUP.parseRequest(version, buffer), version); }
@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));
@Override protected Struct toStruct() { short version = version(); Struct struct = new Struct(ApiKeys.JOIN_GROUP.requestSchema(version)); struct.set(GROUP_ID, groupId); struct.set(SESSION_TIMEOUT_KEY_NAME, sessionTimeout); if (version >= 1) { struct.set(REBALANCE_TIMEOUT_KEY_NAME, rebalanceTimeout); } struct.set(MEMBER_ID, memberId); struct.set(PROTOCOL_TYPE_KEY_NAME, protocolType); List<Struct> groupProtocolsList = new ArrayList<>(groupProtocols.size()); for (ProtocolMetadata protocol : groupProtocols) { Struct protocolStruct = struct.instance(GROUP_PROTOCOLS_KEY_NAME); protocolStruct.set(PROTOCOL_NAME_KEY_NAME, protocol.name); protocolStruct.set(PROTOCOL_METADATA_KEY_NAME, protocol.metadata); groupProtocolsList.add(protocolStruct); } struct.set(GROUP_PROTOCOLS_KEY_NAME, groupProtocolsList.toArray()); return struct; } }
return new FindCoordinatorRequest(struct, apiVersion); case JOIN_GROUP: return new JoinGroupRequest(struct, apiVersion); case HEARTBEAT: return new HeartbeatRequest(struct, apiVersion);
@Override public boolean matches(AbstractRequest body) { JoinGroupRequest joinRequest = (JoinGroupRequest) body; return joinRequest.memberId().equals(JoinGroupRequest.UNKNOWN_MEMBER_ID); } }, joinGroupFollowerResponse(2, consumerId, "leader", Errors.NONE));
public static JoinGroupRequest parse(ByteBuffer buffer) { return new JoinGroupRequest(((Struct) curSchema.read(buffer))); } }
@Override public boolean matches(AbstractRequest body) { JoinGroupRequest joinRequest = (JoinGroupRequest) body; return joinRequest.memberId().equals(JoinGroupRequest.UNKNOWN_MEMBER_ID); } }, joinGroupFollowerResponse(2, consumerId, "leader", Errors.NONE));