mirror of https://github.com/apache/kafka.git
KAFKA-17338 ConsumerConfig should prevent using partition assignors with CONSUMER group protocol (#16899)
Reviewers: Kirk True <ktrue@confluent.io>, Chia-Ping Tsai <chia7712@gmail.com>, Lianet Magrans <lmagrans@confluent.io>
This commit is contained in:
parent
e7bbcdb251
commit
9d23f89e05
|
@ -35,7 +35,7 @@ import org.apache.kafka.common.security.auth.SecurityProtocol;
|
||||||
import org.apache.kafka.common.serialization.Deserializer;
|
import org.apache.kafka.common.serialization.Deserializer;
|
||||||
import org.apache.kafka.common.utils.Utils;
|
import org.apache.kafka.common.utils.Utils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -61,8 +61,12 @@ public class ConsumerConfig extends AbstractConfig {
|
||||||
|
|
||||||
// a list contains all the assignor names that only assign subscribed topics to consumer. Should be updated when new assignor added.
|
// a list contains all the assignor names that only assign subscribed topics to consumer. Should be updated when new assignor added.
|
||||||
// This is to help optimize ConsumerCoordinator#performAssignment method
|
// This is to help optimize ConsumerCoordinator#performAssignment method
|
||||||
public static final List<String> ASSIGN_FROM_SUBSCRIBED_ASSIGNORS =
|
public static final List<String> ASSIGN_FROM_SUBSCRIBED_ASSIGNORS = List.of(
|
||||||
List.of(RANGE_ASSIGNOR_NAME, ROUNDROBIN_ASSIGNOR_NAME, STICKY_ASSIGNOR_NAME, COOPERATIVE_STICKY_ASSIGNOR_NAME);
|
RANGE_ASSIGNOR_NAME,
|
||||||
|
ROUNDROBIN_ASSIGNOR_NAME,
|
||||||
|
STICKY_ASSIGNOR_NAME,
|
||||||
|
COOPERATIVE_STICKY_ASSIGNOR_NAME
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: DO NOT CHANGE EITHER CONFIG STRINGS OR THEIR JAVA VARIABLE NAMES AS
|
* NOTE: DO NOT CHANGE EITHER CONFIG STRINGS OR THEIR JAVA VARIABLE NAMES AS
|
||||||
|
@ -376,6 +380,22 @@ public class ConsumerConfig extends AbstractConfig {
|
||||||
|
|
||||||
private static final AtomicInteger CONSUMER_CLIENT_ID_SEQUENCE = new AtomicInteger(1);
|
private static final AtomicInteger CONSUMER_CLIENT_ID_SEQUENCE = new AtomicInteger(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of configuration keys not supported for CLASSIC protocol.
|
||||||
|
*/
|
||||||
|
private static final List<String> CLASSIC_PROTOCOL_UNSUPPORTED_CONFIGS = Collections.singletonList(
|
||||||
|
GROUP_REMOTE_ASSIGNOR_CONFIG
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of configuration keys not supported for CONSUMER protocol.
|
||||||
|
*/
|
||||||
|
private static final List<String> CONSUMER_PROTOCOL_UNSUPPORTED_CONFIGS = List.of(
|
||||||
|
PARTITION_ASSIGNMENT_STRATEGY_CONFIG,
|
||||||
|
HEARTBEAT_INTERVAL_MS_CONFIG,
|
||||||
|
SESSION_TIMEOUT_MS_CONFIG
|
||||||
|
);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
CONFIG = new ConfigDef().define(BOOTSTRAP_SERVERS_CONFIG,
|
CONFIG = new ConfigDef().define(BOOTSTRAP_SERVERS_CONFIG,
|
||||||
Type.LIST,
|
Type.LIST,
|
||||||
|
@ -409,7 +429,7 @@ public class ConsumerConfig extends AbstractConfig {
|
||||||
HEARTBEAT_INTERVAL_MS_DOC)
|
HEARTBEAT_INTERVAL_MS_DOC)
|
||||||
.define(PARTITION_ASSIGNMENT_STRATEGY_CONFIG,
|
.define(PARTITION_ASSIGNMENT_STRATEGY_CONFIG,
|
||||||
Type.LIST,
|
Type.LIST,
|
||||||
Arrays.asList(RangeAssignor.class, CooperativeStickyAssignor.class),
|
List.of(RangeAssignor.class, CooperativeStickyAssignor.class),
|
||||||
new ConfigDef.NonNullValidator(),
|
new ConfigDef.NonNullValidator(),
|
||||||
Importance.MEDIUM,
|
Importance.MEDIUM,
|
||||||
PARTITION_ASSIGNMENT_STRATEGY_DOC)
|
PARTITION_ASSIGNMENT_STRATEGY_DOC)
|
||||||
|
@ -667,7 +687,7 @@ public class ConsumerConfig extends AbstractConfig {
|
||||||
Map<String, Object> refinedConfigs = CommonClientConfigs.postProcessReconnectBackoffConfigs(this, parsedValues);
|
Map<String, Object> refinedConfigs = CommonClientConfigs.postProcessReconnectBackoffConfigs(this, parsedValues);
|
||||||
maybeOverrideClientId(refinedConfigs);
|
maybeOverrideClientId(refinedConfigs);
|
||||||
maybeOverrideEnableAutoCommit(refinedConfigs);
|
maybeOverrideEnableAutoCommit(refinedConfigs);
|
||||||
checkGroupRemoteAssignor();
|
checkUnsupportedConfigs();
|
||||||
return refinedConfigs;
|
return refinedConfigs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -714,9 +734,28 @@ public class ConsumerConfig extends AbstractConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkGroupRemoteAssignor() {
|
private void checkUnsupportedConfigs() {
|
||||||
if (getString(GROUP_PROTOCOL_CONFIG).equalsIgnoreCase(GroupProtocol.CLASSIC.name()) && getString(GROUP_REMOTE_ASSIGNOR_CONFIG) != null && !getString(GROUP_REMOTE_ASSIGNOR_CONFIG).isEmpty()) {
|
String groupProtocol = getString(GROUP_PROTOCOL_CONFIG);
|
||||||
throw new ConfigException(GROUP_REMOTE_ASSIGNOR_CONFIG + " cannot be set when " + GROUP_PROTOCOL_CONFIG + "=" + GroupProtocol.CLASSIC.name());
|
if (GroupProtocol.CLASSIC.name().equalsIgnoreCase(groupProtocol)) {
|
||||||
|
checkUnsupportedConfigs(GroupProtocol.CLASSIC, CLASSIC_PROTOCOL_UNSUPPORTED_CONFIGS);
|
||||||
|
} else if (GroupProtocol.CONSUMER.name().equalsIgnoreCase(groupProtocol)) {
|
||||||
|
checkUnsupportedConfigs(GroupProtocol.CONSUMER, CONSUMER_PROTOCOL_UNSUPPORTED_CONFIGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkUnsupportedConfigs(GroupProtocol groupProtocol, List<String> unsupportedConfigs) {
|
||||||
|
if (getString(GROUP_PROTOCOL_CONFIG).equalsIgnoreCase(groupProtocol.name())) {
|
||||||
|
List<String> invalidConfigs = new ArrayList<>();
|
||||||
|
unsupportedConfigs.forEach(configName -> {
|
||||||
|
Object config = originals().get(configName);
|
||||||
|
if (config != null && !Utils.isBlank(config.toString())) {
|
||||||
|
invalidConfigs.add(configName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!invalidConfigs.isEmpty()) {
|
||||||
|
throw new ConfigException(String.join(", ", invalidConfigs) +
|
||||||
|
" cannot be set when " + GROUP_PROTOCOL_CONFIG + "=" + groupProtocol.name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -237,4 +237,23 @@ public class ConsumerConfigTest {
|
||||||
assertThrows(ConfigException.class, () -> new ConsumerConfig(configs));
|
assertThrows(ConfigException.class, () -> new ConsumerConfig(configs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnsupportedConfigsWithConsumerGroupProtocol() {
|
||||||
|
testUnsupportedConfigsWithConsumerGroupProtocol(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "RoundRobinAssignor");
|
||||||
|
testUnsupportedConfigsWithConsumerGroupProtocol(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 1000);
|
||||||
|
testUnsupportedConfigsWithConsumerGroupProtocol(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 30000);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testUnsupportedConfigsWithConsumerGroupProtocol(String configName, Object value) {
|
||||||
|
final Map<String, Object> configs = Map.of(
|
||||||
|
ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, keyDeserializerClass,
|
||||||
|
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializerClass,
|
||||||
|
ConsumerConfig.GROUP_PROTOCOL_CONFIG, GroupProtocol.CONSUMER.name(),
|
||||||
|
configName, value
|
||||||
|
);
|
||||||
|
ConfigException exception = assertThrows(ConfigException.class, () -> new ConsumerConfig(configs));
|
||||||
|
assertEquals(configName + " cannot be set when " +
|
||||||
|
ConsumerConfig.GROUP_PROTOCOL_CONFIG + "=" + GroupProtocol.CONSUMER.name(), exception.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3065,7 +3065,10 @@ public class KafkaConsumerTest {
|
||||||
configs.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, minBytes);
|
configs.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, minBytes);
|
||||||
configs.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
|
configs.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
|
||||||
configs.put(ConsumerConfig.GROUP_PROTOCOL_CONFIG, groupProtocol.name());
|
configs.put(ConsumerConfig.GROUP_PROTOCOL_CONFIG, groupProtocol.name());
|
||||||
|
if (groupProtocol == GroupProtocol.CLASSIC) {
|
||||||
configs.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, heartbeatIntervalMs);
|
configs.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, heartbeatIntervalMs);
|
||||||
|
configs.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeoutMs);
|
||||||
|
}
|
||||||
configs.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, IsolationLevel.READ_UNCOMMITTED.toString());
|
configs.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, IsolationLevel.READ_UNCOMMITTED.toString());
|
||||||
configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
|
configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
|
||||||
configs.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, fetchSize);
|
configs.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, fetchSize);
|
||||||
|
@ -3074,7 +3077,6 @@ public class KafkaConsumerTest {
|
||||||
configs.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, requestTimeoutMs);
|
configs.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, requestTimeoutMs);
|
||||||
configs.put(ConsumerConfig.RETRY_BACKOFF_MAX_MS_CONFIG, retryBackoffMaxMs);
|
configs.put(ConsumerConfig.RETRY_BACKOFF_MAX_MS_CONFIG, retryBackoffMaxMs);
|
||||||
configs.put(ConsumerConfig.RETRY_BACKOFF_MS_CONFIG, retryBackoffMs);
|
configs.put(ConsumerConfig.RETRY_BACKOFF_MS_CONFIG, retryBackoffMs);
|
||||||
configs.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeoutMs);
|
|
||||||
configs.put(ConsumerConfig.THROW_ON_FETCH_STABLE_OFFSET_UNSUPPORTED, throwOnStableOffsetNotSupported);
|
configs.put(ConsumerConfig.THROW_ON_FETCH_STABLE_OFFSET_UNSUPPORTED, throwOnStableOffsetNotSupported);
|
||||||
configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializer.getClass());
|
configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, valueDeserializer.getClass());
|
||||||
groupInstanceId.ifPresent(gi -> configs.put(ConsumerConfig.GROUP_INSTANCE_ID_CONFIG, gi));
|
groupInstanceId.ifPresent(gi -> configs.put(ConsumerConfig.GROUP_INSTANCE_ID_CONFIG, gi));
|
||||||
|
|
|
@ -1535,18 +1535,6 @@ public class AsyncKafkaConsumerTest {
|
||||||
assertFalse(config.unused().contains(ConsumerConfig.GROUP_REMOTE_ASSIGNOR_CONFIG));
|
assertFalse(config.unused().contains(ConsumerConfig.GROUP_REMOTE_ASSIGNOR_CONFIG));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPartitionAssignmentStrategyUnusedInAsyncConsumer() {
|
|
||||||
final Properties props = requiredConsumerConfig();
|
|
||||||
props.put(ConsumerConfig.GROUP_ID_CONFIG, "consumerGroup1");
|
|
||||||
props.put(ConsumerConfig.GROUP_PROTOCOL_CONFIG, GroupProtocol.CONSUMER.name().toLowerCase(Locale.ROOT));
|
|
||||||
props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "CooperativeStickyAssignor");
|
|
||||||
final ConsumerConfig config = new ConsumerConfig(props);
|
|
||||||
consumer = newConsumer(config);
|
|
||||||
|
|
||||||
assertTrue(config.unused().contains(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGroupIdNull() {
|
public void testGroupIdNull() {
|
||||||
final Properties props = requiredConsumerConfig();
|
final Properties props = requiredConsumerConfig();
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
package kafka.api
|
package kafka.api
|
||||||
|
|
||||||
import kafka.utils.TestInfoUtils
|
import kafka.utils.TestInfoUtils
|
||||||
import org.apache.kafka.clients.consumer.{Consumer, ConsumerConfig}
|
import org.apache.kafka.clients.consumer.{Consumer, ConsumerConfig, GroupProtocol}
|
||||||
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig}
|
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig}
|
||||||
import org.apache.kafka.common.header.Headers
|
import org.apache.kafka.common.header.Headers
|
||||||
import org.apache.kafka.common.{ClusterResource, ClusterResourceListener, PartitionInfo}
|
import org.apache.kafka.common.{ClusterResource, ClusterResourceListener, PartitionInfo}
|
||||||
|
@ -85,8 +85,10 @@ abstract class BaseConsumerTest extends AbstractConsumerTest {
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testCoordinatorFailover(quorum: String, groupProtocol: String): Unit = {
|
def testCoordinatorFailover(quorum: String, groupProtocol: String): Unit = {
|
||||||
val listener = new TestConsumerReassignmentListener()
|
val listener = new TestConsumerReassignmentListener()
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "5001")
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "5001")
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "1000")
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "1000")
|
||||||
|
}
|
||||||
// Use higher poll timeout to avoid consumer leaving the group due to timeout
|
// Use higher poll timeout to avoid consumer leaving the group due to timeout
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "15000")
|
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "15000")
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
|
|
@ -2386,7 +2386,9 @@ class PlaintextAdminIntegrationTest extends BaseAdminIntegrationTest {
|
||||||
newConsumerConfig.setProperty(ConsumerConfig.CLIENT_ID_CONFIG, testClientId)
|
newConsumerConfig.setProperty(ConsumerConfig.CLIENT_ID_CONFIG, testClientId)
|
||||||
// Increase timeouts to avoid having a rebalance during the test
|
// Increase timeouts to avoid having a rebalance during the test
|
||||||
newConsumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.MAX_VALUE.toString)
|
newConsumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.MAX_VALUE.toString)
|
||||||
|
if (GroupProtocol.CLASSIC.name.equalsIgnoreCase(groupProtocol)) {
|
||||||
newConsumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, GroupCoordinatorConfig.GROUP_MAX_SESSION_TIMEOUT_MS_DEFAULT.toString)
|
newConsumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, GroupCoordinatorConfig.GROUP_MAX_SESSION_TIMEOUT_MS_DEFAULT.toString)
|
||||||
|
}
|
||||||
|
|
||||||
Using.resource(createConsumer(configOverrides = newConsumerConfig)) { consumer =>
|
Using.resource(createConsumer(configOverrides = newConsumerConfig)) { consumer =>
|
||||||
consumer.subscribe(Collections.singletonList(testTopicName))
|
consumer.subscribe(Collections.singletonList(testTopicName))
|
||||||
|
|
|
@ -61,8 +61,10 @@ class PlaintextConsumerPollTest extends AbstractConsumerTest {
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testMaxPollIntervalMs(quorum: String, groupProtocol: String): Unit = {
|
def testMaxPollIntervalMs(quorum: String, groupProtocol: String): Unit = {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 1000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 1000.toString)
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 2000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 2000.toString)
|
||||||
|
}
|
||||||
|
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
|
||||||
|
@ -87,8 +89,10 @@ class PlaintextConsumerPollTest extends AbstractConsumerTest {
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testMaxPollIntervalMsDelayInRevocation(quorum: String, groupProtocol: String): Unit = {
|
def testMaxPollIntervalMsDelayInRevocation(quorum: String, groupProtocol: String): Unit = {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 5000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 5000.toString)
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 1000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 1000.toString)
|
||||||
|
}
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false.toString)
|
||||||
|
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
@ -129,8 +133,10 @@ class PlaintextConsumerPollTest extends AbstractConsumerTest {
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testMaxPollIntervalMsDelayInAssignment(quorum: String, groupProtocol: String): Unit = {
|
def testMaxPollIntervalMsDelayInAssignment(quorum: String, groupProtocol: String): Unit = {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 5000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 5000.toString)
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 1000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 1000.toString)
|
||||||
|
}
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false.toString)
|
||||||
|
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
@ -154,7 +160,9 @@ class PlaintextConsumerPollTest extends AbstractConsumerTest {
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testMaxPollIntervalMsShorterThanPollTimeout(quorum: String, groupProtocol: String): Unit = {
|
def testMaxPollIntervalMsShorterThanPollTimeout(quorum: String, groupProtocol: String): Unit = {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 1000.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 1000.toString)
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 500.toString)
|
||||||
|
}
|
||||||
|
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
val listener = new TestConsumerReassignmentListener
|
val listener = new TestConsumerReassignmentListener
|
||||||
|
|
|
@ -211,8 +211,10 @@ class PlaintextConsumerSubscriptionTest extends AbstractConsumerTest {
|
||||||
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
|
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testUnsubscribeTopic(quorum: String, groupProtocol: String): Unit = {
|
def testUnsubscribeTopic(quorum: String, groupProtocol: String): Unit = {
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "100") // timeout quickly to avoid slow test
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "100") // timeout quickly to avoid slow test
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "30")
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "30")
|
||||||
|
}
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
|
||||||
val listener = new TestConsumerReassignmentListener()
|
val listener = new TestConsumerReassignmentListener()
|
||||||
|
|
|
@ -388,8 +388,10 @@ class PlaintextConsumerTest extends BaseConsumerTest {
|
||||||
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
|
@ParameterizedTest(name = TestInfoUtils.TestWithParameterizedQuorumAndGroupProtocolNames)
|
||||||
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
@MethodSource(Array("getTestQuorumAndGroupProtocolParametersAll"))
|
||||||
def testPauseStateNotPreservedByRebalance(quorum: String, groupProtocol: String): Unit = {
|
def testPauseStateNotPreservedByRebalance(quorum: String, groupProtocol: String): Unit = {
|
||||||
|
if (groupProtocol.equals(GroupProtocol.CLASSIC.name)) {
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "100") // timeout quickly to avoid slow test
|
this.consumerConfig.setProperty(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "100") // timeout quickly to avoid slow test
|
||||||
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "30")
|
this.consumerConfig.setProperty(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "30")
|
||||||
|
}
|
||||||
val consumer = createConsumer()
|
val consumer = createConsumer()
|
||||||
|
|
||||||
val producer = createProducer()
|
val producer = createProducer()
|
||||||
|
|
|
@ -337,8 +337,9 @@ public class DeleteConsumerGroupsTest {
|
||||||
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol);
|
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol);
|
||||||
|
if (GroupProtocol.CLASSIC.name.equalsIgnoreCase(groupProtocol)) {
|
||||||
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
||||||
|
}
|
||||||
configs.putAll(customConfigs);
|
configs.putAll(customConfigs);
|
||||||
return configs;
|
return configs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,7 +251,9 @@ public class DeleteOffsetsConsumerGroupCommandIntegrationTest {
|
||||||
consumerConfig.putIfAbsent(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class.getName());
|
consumerConfig.putIfAbsent(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class.getName());
|
||||||
// Increase timeouts to avoid having a rebalance during the test
|
// Increase timeouts to avoid having a rebalance during the test
|
||||||
consumerConfig.putIfAbsent(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.toString(Integer.MAX_VALUE));
|
consumerConfig.putIfAbsent(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.toString(Integer.MAX_VALUE));
|
||||||
|
if (groupProtocol == GroupProtocol.CLASSIC) {
|
||||||
consumerConfig.putIfAbsent(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, Integer.toString(GroupCoordinatorConfig.GROUP_MAX_SESSION_TIMEOUT_MS_DEFAULT));
|
consumerConfig.putIfAbsent(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, Integer.toString(GroupCoordinatorConfig.GROUP_MAX_SESSION_TIMEOUT_MS_DEFAULT));
|
||||||
|
}
|
||||||
|
|
||||||
return new KafkaConsumer<>(consumerConfig);
|
return new KafkaConsumer<>(consumerConfig);
|
||||||
}
|
}
|
||||||
|
|
|
@ -992,7 +992,6 @@ public class DescribeConsumerGroupTest {
|
||||||
configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(ConsumerConfig.GROUP_PROTOCOL_CONFIG, groupProtocol);
|
configs.put(ConsumerConfig.GROUP_PROTOCOL_CONFIG, groupProtocol);
|
||||||
configs.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
|
||||||
|
|
||||||
configs.putAll(customConfigs);
|
configs.putAll(customConfigs);
|
||||||
return configs;
|
return configs;
|
||||||
|
|
|
@ -511,7 +511,9 @@ public class ListConsumerGroupTest {
|
||||||
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol);
|
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol);
|
||||||
|
if (GroupProtocol.CLASSIC.name.equalsIgnoreCase(groupProtocol)) {
|
||||||
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
||||||
|
}
|
||||||
|
|
||||||
configs.putAll(customConfigs);
|
configs.putAll(customConfigs);
|
||||||
return configs;
|
return configs;
|
||||||
|
|
|
@ -800,9 +800,11 @@ public class ResetConsumerGroupOffsetTest {
|
||||||
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol.name);
|
configs.put(GROUP_PROTOCOL_CONFIG, groupProtocol.name);
|
||||||
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
configs.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
|
||||||
configs.put(AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000);
|
configs.put(AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000);
|
||||||
configs.put(GROUP_INITIAL_REBALANCE_DELAY_MS_CONFIG, 1000);
|
configs.put(GROUP_INITIAL_REBALANCE_DELAY_MS_CONFIG, 1000);
|
||||||
|
if (GroupProtocol.CLASSIC == groupProtocol) {
|
||||||
|
configs.put(PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RangeAssignor.class.getName());
|
||||||
|
}
|
||||||
return configs;
|
return configs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue