{"id":"b15085df27d5ff33","repo":"apache/kafka","slug":"member-member-was-not-included-in-the-original-r","errorCode":null,"errorMessage":"Member {member} was not included in the original request","messagePattern":"Member (.+?) was not included in the original request","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupResult.java","lineNumber":88,"sourceCode":"                            return;\n                        }\n                    }\n                }\n                result.complete(null);\n            }\n        });\n        return result;\n    }\n\n    /**\n     * Returns the selected member future.\n     */\n    public KafkaFuture<Void> memberResult(MemberToRemove member) {\n        if (removeAll()) {\n            throw new IllegalArgumentException(\"The method: memberResult is not applicable in 'removeAll' mode\");\n        }\n        if (!memberInfos.contains(member)) {\n            throw new IllegalArgumentException(\"Member \" + member + \" was not included in the original request\");\n        }\n\n        final KafkaFutureImpl<Void> result = new KafkaFutureImpl<>();\n        this.future.whenComplete((memberErrors, throwable) -> {\n            if (throwable != null) {\n                result.completeExceptionally(throwable);\n            } else if (!maybeCompleteExceptionally(memberErrors, member.toMemberIdentity(), result)) {\n                result.complete(null);\n            }\n        });\n        return result;\n    }\n\n    private boolean maybeCompleteExceptionally(Map<MemberIdentity, Errors> memberErrors,\n                                               MemberIdentity member,\n                                               KafkaFutureImpl<Void> result) {\n        Throwable exception = KafkaAdminClient.getSubLevelError(memberErrors, member,\n            \"Member \\\"\" + member + \"\\\" was not included in the removal response\");","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/apache/kafka/blob/c31c9215e131f8c17e79f8901b48c13ee6aa8e7a/clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupResult.java#L70-L106","documentation":"Thrown by RemoveMembersFromConsumerGroupResult.memberResult(MemberToRemove) when the caller asks for the per-member future of a member that was not part of the MemberToRemove set originally passed to RemoveMembersFromConsumerGroupOptions. The Admin API tracks exactly which members were requested so it can correlate the broker's per-member errors back to the caller; querying an untracked member is a programming error. It is an IllegalArgumentException, surfaced synchronously before any network call.","triggerScenarios":"Calling admin.removeMembersFromConsumerGroup(groupId, new RemoveMembersFromConsumerGroupOptions(membersA)).memberResult(memberB) where memberB was not in membersA. Also thrown if memberResult is used in 'removeAll' mode, though that case is caught first by a dedicated guard at line 85.","commonSituations":"Constructing MemberToRemove from a different source (e.g. group listing from DescribeGroups) than the one used to build the options; reusing a result object after rebuilding the options with a filtered member list; copy-paste of member-identity fields (group.instance.id vs client.id vs member.id) so equals() fails on MemberToRemove.","solutions":["Pass the exact same MemberToRemove instance (or an equal one) to memberResult that you placed in RemoveMembersFromConsumerGroupOptions.","If you only care about overall success, call result.all() instead of per-member memberResult().","Iterate over the members you originally requested instead of fabricating new MemberToRemove objects from another API response.","Double-check MemberToRemove equality semantics: it wraps MemberIdentity (member id + group.instance.id), so both fields must match."],"exampleFix":"// before\nRemoveMembersFromConsumerGroupOptions opts = new RemoveMembersFromConsumerGroupOptions(List.of(memberA));\nRemoveMembersFromConsumerGroupResult res = admin.removeMembersFromConsumerGroup(groupId, opts);\nres.memberResult(memberB).get(); // throws: memberB not in original request\n\n// after\nRemoveMembersFromConsumerGroupOptions opts = new RemoveMembersFromConsumerGroupOptions(List.of(memberA, memberB));\nRemoveMembersFromConsumerGroupResult res = admin.removeMembersFromConsumerGroup(groupId, opts);\nres.memberResult(memberB).get();","handlingStrategy":"validation","validationCode":"// Before calling result.memberResult(member), verify the member was in the original set:\nSet<MemberToRemove> requested = options.members(); // or track the set you passed to RemoveMembersFromConsumerGroupOptions\nif (!requested.contains(member)) {\n    // skip memberResult for this member, or re-issue removeMembersFromConsumerGroup with the extended set\n    log.warn(\"Skipping memberResult: {} was not in the original RemoveMembersFromConsumerGroupOptions\", member);\n} else {\n    result.memberResult(member).get();\n}","typeGuard":"// MemberToRemove equality is value-based (instanceId hash). Guard against accidentally passing a new instance:\nstatic boolean wasRequested(Set<MemberToRemove> requested, MemberToRemove m) {\n    return requested != null && m != null && requested.stream()\n        .anyMatch(r -> Objects.equals(r.toMemberIdentity().instanceId(), m.toMemberIdentity().instanceId()));\n}","tryCatchPattern":"try {\n    result.memberResult(member).get();\n} catch (ExecutionException e) {\n    if (e.getCause() instanceof IllegalArgumentException\n            && e.getCause().getMessage().contains(\"was not included in the original request\")) {\n        // member was not part of RemoveMembersFromConsumerGroupOptions; re-issue the admin call with it included\n    } else { throw e; }\n}","preventionTips":["Keep the exact MemberToRemove set passed to RemoveMembersFromConsumerGroupOptions in a variable and only call memberResult against members drawn from that set.","When using 'removeAll' mode (empty member set), never call memberResult - it is invalid in that mode.","Do not reconstruct MemberToRemove from primitive fields (instanceId string) for memberResult; reuse the original instance to avoid equality drift."],"tags":["admin-api","consumer-group","programming-error","illegal-argument","java"],"analyzedSha":"c31c9215e131f8c17e79f8901b48c13ee6aa8e7a","analyzedAt":"2026-08-03T12:34:05.770Z","schemaVersion":2}