vbhanuchander-lang commented on issue #17193:
URL: https://github.com/apache/iceberg/issues/17193#issuecomment-5274641634
I looked into this because the symptom is corroborated (#11818 reports the
same "constant hanging
lag for low-volume topics"), but I do not think the stated mechanism can be
what is happening.
Four things in the chain do not match the code. I am posting them because
they change what needs
fixing, not to argue the bug away.
**1. #14395 did not remove a `cg-control` readiness check.** The check it
removed was on
`config.connectGroupId()` — the *Connect* consumer group for the data topic
— inside
`CommitterImpl.hasLeaderPartition`, and its purpose was coordinator **leader
election** (deciding
which task owns the first partition):
```java
- if (groupDesc.state() == ConsumerGroupState.STABLE) {
- Collection<MemberDescription> members = groupDesc.members();
- if (containsFirstPartition(members, currentAssignedPartitions)) { ...
}
- }
```
It never inspected the control group, so it cannot have been "ensuring the
Worker's `cg-control`
consumer had joined".
**2. `put()` is still called when the data topic is idle.** Step 3 assumes
the control consumer's
`poll()` is not called during the block. It is: in `WorkerSinkTask.poll()`,
`deliverMessages()` —
and therefore `task.put(...)` — is invoked **unconditionally** after
`convertMessages(msgs)`, with
no non-empty guard:
```java
convertMessages(msgs);
deliverMessages(); // -> task.put(new ArrayList<>(messageBatch)), even
when empty
```
So `Channel.consumeAvailable` still runs on every Connect poll cycle on an
idle topic.
**3. The 60s figure is `offset.flush.interval.ms`, not
`max.poll.interval.ms`.**
`WorkerSinkTask.iteration()` polls with the time remaining until the next
offset commit:
```java
long timeoutMs = Math.max(nextCommit - now, 0);
poll(timeoutMs);
```
`nextCommit` advances by `OFFSET_COMMIT_INTERVAL_MS_CONFIG`
(`offset.flush.interval.ms`), whose
default is `60000L` in `WorkerConfig`. `max.poll.interval.ms` defaults to
**300000**, not 60000
(`ConsumerConfig`, line 607). So the idle gap between `put()` calls is ~60s
and bounded by a Connect
worker setting.
**4. A 60s gap between polls does not trip `session.timeout.ms`.** Since
KIP-62 the consumer
heartbeats from a background thread, so `session.timeout.ms` (default 45000,
confirmed in
`ConsumerConfig`) covers heartbeat loss, not time between `poll()` calls.
The config that evicts a
member for not polling is `max.poll.interval.ms` — 300s here, which a 60s
gap does not breach. That
is also why raising `heartbeat.interval.ms`, as suggested, would not be the
lever even if the timing
were as described.
**What I could not explain, and what would pin it down**
The Worker's control group is created per worker instance as
`config.controlGroupIdPrefix() + UUID.randomUUID()` (`Worker.java:53`), i.e.
a fresh
**single-member** group named `cg-control-<uuid>`. A single-member group
that owns its own group id
reaching a non-STABLE state indefinitely is genuinely odd, and the
`UnknownMemberIdException` you
saw is real evidence of *something*, so I would rather find the actual cause
than hand-wave.
Two things would settle it:
1. The exact group id in the `UnknownMemberIdException` — is it
`cg-control-<uuid>`, the
`<connectGroupId>-coord` group the Coordinator uses
(`Coordinator.java:97`), or the Connect group
itself? These are three different groups and the fix differs for each.
2. Whether a fresh `cg-control-<uuid>` group is created on every task
restart. If restarts are
frequent, abandoned single-member groups accumulate, and it is worth
checking whether the group
being described as "not STABLE" is a previous incarnation rather than the
live one.
If the real problem turns out to be that the coordinator can now start a
commit cycle before workers
have joined — which is a plausible consequence of #14395, just not via
`cg-control` liveness — then
the fix belongs in the leader-election/commit-start path, and I am happy to
work on it. But I did
not want to write a patch against a mechanism I had just shown does not hold.
*(Config defaults and the `WorkerSinkTask` behaviour above were read from
the Kafka 3.9 sources,
matching the 3.9.2 runtime in your environment section.)*
--
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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]