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

  1. If you intend to remove all members, use the no-arg constructor: `new RemoveMembersFromConsumerGroupOptions()`.
  2. Otherwise ensure the collection is non-empty: skip the call or report 'nothing to remove' to the user.
  3. 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

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


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)