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) constructor when the supplied collection of members is empty. Removing zero specific members is ambiguous with removeAll mode (the no-arg constructor), so the explicit-collection constructor rejects an empty set to force the caller to choose.

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 c31c9215e1)

Solutions

  1. To remove all members of the group, use the no-arg constructor new RemoveMembersFromConsumerGroupOptions()
  2. Ensure the collection passed to the constructor contains at least one MemberToRemove
  3. Guard the construction: if the computed set is empty, either switch to removeAll or skip the call

Example fix

// before
admin.removeMembersFromConsumerGroup(groupId,
    new RemoveMembersFromConsumerGroupOptions(List.of())); // throws

// after - remove specific members
new RemoveMembersFromConsumerGroupOptions(
    List.of(new MemberToRemove(memberIdentity)));
// after - remove all members
new RemoveMembersFromConsumerGroupOptions();
Defensive patterns

Strategy: validation

Validate before calling

Collection<MemberToRemove> members = ...;
if (members == null || members.isEmpty()) {
    // If you truly want to remove ALL members, use the no-arg constructor
    // (removeAll mode). Otherwise this is a caller bug.
    throw new IllegalArgumentException(
        "members must be non-empty; use new RemoveMembersFromConsumerGroupOptions() for removeAll");
}
new RemoveMembersFromConsumerGroupOptions(members);

Type guard

static boolean isNonEmptyMembers(Collection<MemberToRemove> members) {
    return members != null && !members.isEmpty();
}

Try / catch

try {
    options = new RemoveMembersFromConsumerGroupOptions(members);
} catch (IllegalArgumentException e) {
    // Empty members supplied. Decide intent: removeAll or caller error.
    if (intendedRemoveAll) {
        options = new RemoveMembersFromConsumerGroupOptions(); // removeAll mode
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Constructing new RemoveMembersFromConsumerGroupOptions(Collections.emptyList()) or passing an empty list/set/Collection<MemberToRemove>. Contrast with the no-arg constructor which intentionally sets an empty set to signal 'remove all members'.

Common situations: Building the member list dynamically from a query (e.g. describing a group) that returned no members; filtering a member set down to zero at runtime; confusing 'remove these members' with 'remove all members' and passing an empty list to mean all.

Related errors


AI-assisted analysis of apache/kafka@c31c9215e1 (2026-08-03). Data as JSON: /data/errors/3601036ce00a810a.json. Report an issue: GitHub.