MINOR: Disalow using a group id with only whitespaces in the new consumer group protocol (#15173)
This patch strengthen the validation of the group id when the new consumer group protocol is used.
Reviewers: Divij Vaidya <diviv@amazon.com>
diff --git a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/GroupMetadataManager.java b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/GroupMetadataManager.java
index dca6af9..206aaf2 100644
--- a/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/GroupMetadataManager.java
+++ b/group-coordinator/src/main/java/org/apache/kafka/coordinator/group/GroupMetadataManager.java
@@ -702,6 +702,7 @@
/**
* Throws an InvalidRequestException if the value is non-null and empty.
+ * A string containing only whitespaces is also considered empty.
*
* @param value The value.
* @param error The error message.
@@ -711,7 +712,7 @@
String value,
String error
) throws InvalidRequestException {
- if (value != null && value.isEmpty()) {
+ if (value != null && value.trim().isEmpty()) {
throw new InvalidRequestException(error);
}
}
diff --git a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/GroupMetadataManagerTest.java b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/GroupMetadataManagerTest.java
index 1710f3b..9041028 100644
--- a/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/GroupMetadataManagerTest.java
+++ b/group-coordinator/src/test/java/org/apache/kafka/coordinator/group/GroupMetadataManagerTest.java
@@ -1263,6 +1263,12 @@
new ConsumerGroupHeartbeatRequestData()));
assertEquals("GroupId can't be empty.", ex.getMessage());
+ // GroupId can't be all whitespaces.
+ ex = assertThrows(InvalidRequestException.class, () -> context.consumerGroupHeartbeat(
+ new ConsumerGroupHeartbeatRequestData()
+ .setGroupId(" ")));
+ assertEquals("GroupId can't be empty.", ex.getMessage());
+
// RebalanceTimeoutMs must be present in the first request (epoch == 0).
ex = assertThrows(InvalidRequestException.class, () -> context.consumerGroupHeartbeat(
new ConsumerGroupHeartbeatRequestData()