Skip to content

Commit 2d1435f

Browse files
committed
KAFKA-18569: New consumer close may wait on unneeded FindCoordinator
JIRA: KAFKA-18569 Please refer to ticker for further details
1 parent 78e3545 commit 2d1435f

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

clients/src/main/java/org/apache/kafka/clients/consumer/internals/CoordinatorRequestManager.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class CoordinatorRequestManager implements RequestManager {
5959
private final RequestState coordinatorRequestState;
6060
private long timeMarkedUnknownMs = -1L; // starting logging a warning only after unable to connect for a while
6161
private long totalDisconnectedMin = 0;
62+
private boolean closing = false;
6263
private Node coordinator;
6364

6465
public CoordinatorRequestManager(
@@ -92,7 +93,7 @@ public CoordinatorRequestManager(
9293
*/
9394
@Override
9495
public NetworkClientDelegate.PollResult poll(final long currentTimeMs) {
95-
if (this.coordinator != null)
96+
if (closing || this.coordinator != null)
9697
return EMPTY;
9798

9899
if (coordinatorRequestState.canSendRequest(currentTimeMs)) {
@@ -103,6 +104,12 @@ public NetworkClientDelegate.PollResult poll(final long currentTimeMs) {
103104
return new NetworkClientDelegate.PollResult(coordinatorRequestState.remainingBackoffMs(currentTimeMs));
104105
}
105106

107+
@Override
108+
public NetworkClientDelegate.PollResult pollOnClose(long currentTimeMs) {
109+
closing = true;
110+
return EMPTY;
111+
}
112+
106113
NetworkClientDelegate.UnsentRequest makeFindCoordinatorRequest(final long currentTimeMs) {
107114
coordinatorRequestState.onSendAttempt(currentTimeMs);
108115
FindCoordinatorRequestData data = new FindCoordinatorRequestData()

clients/src/test/java/org/apache/kafka/clients/consumer/internals/CoordinatorRequestManagerTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,26 @@ public void testNetworkTimeout() {
254254
assertEquals(1, res2.unsentRequests.size());
255255
}
256256

257+
@Test
258+
public void testSignalOnClose() {
259+
CoordinatorRequestManager coordinatorManager = setupCoordinatorManager(GROUP_ID);
260+
261+
expectFindCoordinatorRequest(coordinatorManager, Errors.NONE);
262+
assertTrue(coordinatorManager.coordinator().isPresent());
263+
264+
coordinatorManager.markCoordinatorUnknown("coordinator changed", time.milliseconds());
265+
assertEquals(Collections.emptyList(), coordinatorManager.poll(time.milliseconds()).unsentRequests);
266+
267+
coordinatorManager.pollOnClose(time.milliseconds());
268+
269+
time.sleep(RETRY_BACKOFF_MS - 1);
270+
assertEquals(Collections.emptyList(), coordinatorManager.poll(time.milliseconds()).unsentRequests);
271+
272+
time.sleep(RETRY_BACKOFF_MS);
273+
assertEquals(Collections.emptyList(), coordinatorManager.poll(time.milliseconds()).unsentRequests,
274+
"Should not generate find coordinator request during close");
275+
}
276+
257277
private void expectFindCoordinatorRequest(
258278
CoordinatorRequestManager coordinatorManager,
259279
Errors error

0 commit comments

Comments
 (0)