apache/kafka · error · IllegalArgumentException
Invalid empty members has been provided
Error message
Invalid empty members has been provided
What it means
Thrown by the RemoveMembersFromConsumerGroupOptions(Collection<MemberToRemove>) constructor when the supplied collection is empty. The static-consumer-group-membership removal API requires at least one explicit member; removing zero members is a no-op and the client rejects it rather than issuing a meaningless RPC. Use the no-arg constructor for the 'removeAll' mode instead.
Solutions
- If you intend to remove all members, use the no-arg constructor: `new RemoveMembersFromConsumerGroupOptions()`.
- Otherwise ensure the collection is non-empty: skip the call or report 'nothing to remove' to the user.
- Inspect the collection size before construction and log/handle the empty case.
Example fix
// before
RemoveMembersFromConsumerGroupOptions opts =
new RemoveMembersFromConsumerGroupOptions(members);
// after
RemoveMembersFromConsumerGroupOptions opts = members.isEmpty()
? new RemoveMembersFromConsumerGroupOptions()
: new RemoveMembersFromConsumerGroupOptions(members); Defensive patterns
Strategy: validation
Validate before calling
RemoveMembersFromConsumerGroupOptions opts = members.isEmpty()
? new RemoveMembersFromConsumerGroupOptions() // removeAll
: new RemoveMembersFromConsumerGroupOptions(members); Type guard
static boolean isRemovableMembers(Collection<MemberToRemove> c) {
return c != null; // empty is acceptable ONLY when removeAll is intended
} Try / catch
try {
opts = new RemoveMembersFromConsumerGroupOptions(members);
} catch (IllegalArgumentException e) {
if (members.isEmpty()) {
opts = new RemoveMembersFromConsumerGroupOptions(); // fall back to removeAll
} else throw e;
} Prevention
- Decide upfront whether targeted removal or removeAll is intended and construct the matching options.
- Surface a 'no members selected' UX message instead of constructing options with an empty collection.
- Reuse the same member collection for options and result handling to avoid drift.
When it happens
Trigger: Calling `new RemoveMembersFromConsumerGroupOptions(emptyList())`; passing a filtered member set that ended up empty after excluding already-removed members.
Common situations: Building a removal list from admin.describeConsumerGroup output where all members were already filtered out; UI that lets a user deselect every member before clicking remove; reusing the same collection across retries after it was cleared.
Related errors
- Member was not included in the original request
- The method: memberResult is not applicable in 'removeAll'…
- Cannot create a new partition reassignment without any…
- Empty string is not allowed.
- Expected 0 <= minVersion <= maxVersion but received…
AI-assisted analysis of apache/kafka@996fb4585a (2026-08-11).
Data as JSON: /api/errors/3601036ce00a810a.
Report an issue: GitHub.
Appendix: source
Thrown at clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupOptions.java:39
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* Options for {@link AdminClient#removeMembersFromConsumerGroup(String, RemoveMembersFromConsumerGroupOptions)}.
* It carries the members to be removed from the consumer group.
*/
@InterfaceAudience.Public
public class RemoveMembersFromConsumerGroupOptions extends AbstractOptions<RemoveMembersFromConsumerGroupOptions> {
private final Set<MemberToRemove> members;
private String reason;
public RemoveMembersFromConsumerGroupOptions(Collection<MemberToRemove> members) {
if (members.isEmpty()) {
throw new IllegalArgumentException("Invalid empty members has been provided");
}
this.members = new HashSet<>(members);
}
public RemoveMembersFromConsumerGroupOptions() {
this.members = Collections.emptySet();
}
/**
* Sets an optional reason.
*/
public void reason(final String reason) {
this.reason = reason;
}
public Set<MemberToRemove> members() {
return members;
}View on GitHub (pinned to 996fb4585a)