hubcio opened a new issue, #4447:
URL: https://github.com/apache/iggy/issues/4447

   ## Problem
   
   - You cannot see consumer lag (the messages that a group did not consume 
yet). `consumer-group get` shows members and partitions, but no offsets. 
`consumer-offset get` shows one partition per call.
   - The CLI cannot delete a consumer offset. The SDK 
(`core/common/src/traits/consumer_offset_client.rs:65`) and the binary protocol 
(code 122) support it. The HTTP API deletes only regular consumer offsets 
(`core/server/src/http/handlers.rs:1530`).
   - The CLI cannot set a consumer group offset. Over TCP, QUIC and WebSocket, 
`consumer-offset set -k consumer-group` fails with error 5009, because the CLI 
is not a member of the group (`core/server/src/namespace.rs:280`):
   
     ```
     Consumer group member with client ID: 0 does not own partition: 0 at the 
current generation (rebalance in progress).
     ```
   
     No rebalance runs, because the group has no members. Binary errors carry 
only the code, so the client fills the fields with zeros (#3735). Over HTTP, 
the same command writes a regular consumer offset instead (#4408). `-k 
external-group` works, but Iggy consumer groups never read external group 
offsets (#4392).
   
   ## Proposal
   
   - Add a partitions table to `consumer-group get`: partition, member, current 
offset, stored offset and lag. A client does not need to be a member to read a 
group offset. The stored offset is the last consumed offset, so the lag is the 
current offset minus the stored offset. If no offset is stored, the lag is the 
message count of the partition.
   - Add `consumer-offset delete`, with the same arguments as `consumer-offset 
get`.
   - Server: if the group has no members, accept an offset write or delete for 
it from a non-member. If the group has members, keep the current fence. The 
Kafka admin API has the same rule: it resets the offsets of an empty group only.
   - Add `consumer-group reset <STREAM_ID> <TOPIC_ID> <GROUP_ID>` with 
`--to-earliest`, `--to-latest`, `--to-offset <N>` or `--to-timestamp <TIME>`. 
Print the plan first, and write it only with `--execute`.
   - `--to-offset N` stores `N - 1`, because the next poll starts after the 
stored offset. `--to-earliest` and `--to-offset 0` delete the offset.
   
   ## Notes
   
   - Agree on the server rule before coding. The lag view does not depend on 
it. Until the rule exists, `consumer-offset delete` works only for regular 
consumers and external groups.
   - The membership check and the offset write are not atomic, so a consumer 
that joins during a reset can overwrite it. Before a reset, stop all consumers 
of the group and wait for `consumer_group.session_timeout`.
   - An offset write needs only the poll permission. With the new rule, any 
user who can poll the topic can reset an idle group.
   - A stored group offset holds back retention. If a reset deletes it, 
retention can remove messages that the group did not read. The help text must 
say this.
   - Over HTTP, the group kind is lost (#4408), so the lag view needs TCP, QUIC 
or WebSocket until #4279 is done. Offset reads come from the local replica, so 
the lag can be stale (#4409).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to