You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by cm...@apache.org on 2021/06/15 23:06:24 UTC

[kafka] branch trunk updated: KAFKA-12877: Make flexibleVersions mandatory (#10804)

This is an automated email from the ASF dual-hosted git repository.

cmccabe pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 135de58  KAFKA-12877: Make flexibleVersions mandatory (#10804)
135de58 is described below

commit 135de5801ecaa1812e1677588025bb42878e0611
Author: Colin Patrick McCabe <cm...@confluent.io>
AuthorDate: Tue Jun 15 16:04:30 2021 -0700

    KAFKA-12877: Make flexibleVersions mandatory (#10804)
    
    Many Kafka protocol JSON files were accidentally configured to not use
    flexible versions, since it was not on by default.  This PR requires
    JSON files to specify a flexibleVersions value. If the JSON file does
    not specify the flexibleVersions value, display an error message
    suggesting the correct value to use for new messages.
    
    Reviewers: Jason Gustafson <ja...@confluent.io>
---
 .../src/main/resources/common/message/BeginQuorumEpochRequest.json    | 1 +
 .../src/main/resources/common/message/BeginQuorumEpochResponse.json   | 1 +
 .../src/main/resources/common/message/ConsumerProtocolAssignment.json | 1 +
 .../main/resources/common/message/ConsumerProtocolSubscription.json   | 1 +
 clients/src/main/resources/common/message/EndQuorumEpochRequest.json  | 1 +
 clients/src/main/resources/common/message/EndQuorumEpochResponse.json | 1 +
 clients/src/main/resources/common/message/OffsetDeleteRequest.json    | 1 +
 clients/src/main/resources/common/message/OffsetDeleteResponse.json   | 1 +
 clients/src/main/resources/common/message/SaslHandshakeRequest.json   | 1 +
 clients/src/main/resources/common/message/SaslHandshakeResponse.json  | 1 +
 core/src/main/resources/common/message/GroupMetadataKey.json          | 1 +
 core/src/main/resources/common/message/GroupMetadataValue.json        | 1 +
 core/src/main/resources/common/message/OffsetCommitKey.json           | 1 +
 core/src/main/resources/common/message/OffsetCommitValue.json         | 1 +
 core/src/main/resources/common/message/TransactionLogKey.json         | 1 +
 core/src/main/resources/common/message/TransactionLogValue.json       | 1 +
 generator/src/main/java/org/apache/kafka/message/MessageSpec.java     | 4 ++++
 .../test/java/org/apache/kafka/message/MessageDataGeneratorTest.java  | 4 ++++
 .../src/test/java/org/apache/kafka/message/StructRegistryTest.java    | 4 ++++
 metadata/src/main/resources/common/metadata/ConfigRecord.json         | 1 +
 .../src/main/resources/common/metadata/DelegationTokenRecord.json     | 1 +
 metadata/src/main/resources/common/metadata/FeatureLevelRecord.json   | 1 +
 metadata/src/main/resources/common/metadata/FenceBrokerRecord.json    | 1 +
 metadata/src/main/resources/common/metadata/PartitionRecord.json      | 1 +
 metadata/src/main/resources/common/metadata/ProducerIdsRecord.json    | 1 +
 metadata/src/main/resources/common/metadata/QuotaRecord.json          | 1 +
 metadata/src/main/resources/common/metadata/RegisterBrokerRecord.json | 1 +
 metadata/src/main/resources/common/metadata/RemoveTopicRecord.json    | 1 +
 metadata/src/main/resources/common/metadata/TopicRecord.json          | 1 +
 metadata/src/main/resources/common/metadata/UnfenceBrokerRecord.json  | 1 +
 .../src/main/resources/common/metadata/UnregisterBrokerRecord.json    | 1 +
 .../src/main/resources/common/metadata/UserScramCredentialRecord.json | 1 +
 streams/src/main/resources/common/message/SubscriptionInfoData.json   | 1 +
 33 files changed, 42 insertions(+)

diff --git a/clients/src/main/resources/common/message/BeginQuorumEpochRequest.json b/clients/src/main/resources/common/message/BeginQuorumEpochRequest.json
index f419589..d9d6d92 100644
--- a/clients/src/main/resources/common/message/BeginQuorumEpochRequest.json
+++ b/clients/src/main/resources/common/message/BeginQuorumEpochRequest.json
@@ -19,6 +19,7 @@
   "listeners": ["controller"],
   "name": "BeginQuorumEpochRequest",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ClusterId", "type": "string", "versions": "0+",
       "nullableVersions": "0+", "default": "null"},
diff --git a/clients/src/main/resources/common/message/BeginQuorumEpochResponse.json b/clients/src/main/resources/common/message/BeginQuorumEpochResponse.json
index 923cd1d..4b7d7f5 100644
--- a/clients/src/main/resources/common/message/BeginQuorumEpochResponse.json
+++ b/clients/src/main/resources/common/message/BeginQuorumEpochResponse.json
@@ -18,6 +18,7 @@
   "type": "response",
   "name": "BeginQuorumEpochResponse",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ErrorCode", "type": "int16", "versions": "0+",
       "about": "The top level error code."},
diff --git a/clients/src/main/resources/common/message/ConsumerProtocolAssignment.json b/clients/src/main/resources/common/message/ConsumerProtocolAssignment.json
index d148085..50a9706 100644
--- a/clients/src/main/resources/common/message/ConsumerProtocolAssignment.json
+++ b/clients/src/main/resources/common/message/ConsumerProtocolAssignment.json
@@ -22,6 +22,7 @@
   // it encounters a newer version, it parses it using the current format. This basically means
   // that new versions cannot remove or reorder any of the existing fields.
   "validVersions": "0-1",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "AssignedPartitions", "type": "[]TopicPartition", "versions": "0+",
       "fields": [
diff --git a/clients/src/main/resources/common/message/ConsumerProtocolSubscription.json b/clients/src/main/resources/common/message/ConsumerProtocolSubscription.json
index 81ed7f7..e33c16f 100644
--- a/clients/src/main/resources/common/message/ConsumerProtocolSubscription.json
+++ b/clients/src/main/resources/common/message/ConsumerProtocolSubscription.json
@@ -22,6 +22,7 @@
   // it encounters a newer version, it parses it using the current format. This basically means
   // that new versions cannot remove or reorder any of the existing fields.
   "validVersions": "0-1",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Topics", "type": "[]string", "versions": "0+" },
     { "name": "UserData", "type": "bytes", "versions": "0+", "nullableVersions": "0+",
diff --git a/clients/src/main/resources/common/message/EndQuorumEpochRequest.json b/clients/src/main/resources/common/message/EndQuorumEpochRequest.json
index 25bb57a..a6e4076 100644
--- a/clients/src/main/resources/common/message/EndQuorumEpochRequest.json
+++ b/clients/src/main/resources/common/message/EndQuorumEpochRequest.json
@@ -19,6 +19,7 @@
   "listeners": ["controller"],
   "name": "EndQuorumEpochRequest",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ClusterId", "type": "string", "versions": "0+",
       "nullableVersions": "0+", "default": "null"},
diff --git a/clients/src/main/resources/common/message/EndQuorumEpochResponse.json b/clients/src/main/resources/common/message/EndQuorumEpochResponse.json
index 62f67bd..cd23247 100644
--- a/clients/src/main/resources/common/message/EndQuorumEpochResponse.json
+++ b/clients/src/main/resources/common/message/EndQuorumEpochResponse.json
@@ -18,6 +18,7 @@
   "type": "response",
   "name": "EndQuorumEpochResponse",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ErrorCode", "type": "int16", "versions": "0+",
       "about": "The top level error code."},
diff --git a/clients/src/main/resources/common/message/OffsetDeleteRequest.json b/clients/src/main/resources/common/message/OffsetDeleteRequest.json
index 394d1bb..4a9dea6 100644
--- a/clients/src/main/resources/common/message/OffsetDeleteRequest.json
+++ b/clients/src/main/resources/common/message/OffsetDeleteRequest.json
@@ -19,6 +19,7 @@
   "listeners": ["zkBroker", "broker"],
   "name": "OffsetDeleteRequest",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "GroupId", "type": "string", "versions": "0+", "entityType": "groupId",
       "about": "The unique group identifier." },
diff --git a/clients/src/main/resources/common/message/OffsetDeleteResponse.json b/clients/src/main/resources/common/message/OffsetDeleteResponse.json
index 1cdc6ad..d32b36f 100644
--- a/clients/src/main/resources/common/message/OffsetDeleteResponse.json
+++ b/clients/src/main/resources/common/message/OffsetDeleteResponse.json
@@ -18,6 +18,7 @@
   "type": "response",
   "name": "OffsetDeleteResponse",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ErrorCode", "type": "int16", "versions": "0+",
       "about": "The top-level error code, or 0 if there was no error." },
diff --git a/clients/src/main/resources/common/message/SaslHandshakeRequest.json b/clients/src/main/resources/common/message/SaslHandshakeRequest.json
index 3384db8..a370a80 100644
--- a/clients/src/main/resources/common/message/SaslHandshakeRequest.json
+++ b/clients/src/main/resources/common/message/SaslHandshakeRequest.json
@@ -23,6 +23,7 @@
   // client negotiation for clients <= 2.4.
   // See https://issues.apache.org/jira/browse/KAFKA-9577
   "validVersions": "0-1",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Mechanism", "type": "string", "versions": "0+",
       "about": "The SASL mechanism chosen by the client." }
diff --git a/clients/src/main/resources/common/message/SaslHandshakeResponse.json b/clients/src/main/resources/common/message/SaslHandshakeResponse.json
index 039841f..a1567c6 100644
--- a/clients/src/main/resources/common/message/SaslHandshakeResponse.json
+++ b/clients/src/main/resources/common/message/SaslHandshakeResponse.json
@@ -22,6 +22,7 @@
   // client negotiation for clients <= 2.4.
   // See https://issues.apache.org/jira/browse/KAFKA-9577
   "validVersions": "0-1",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ErrorCode", "type": "int16", "versions": "0+",
       "about": "The error code, or 0 if there was no error." },
diff --git a/core/src/main/resources/common/message/GroupMetadataKey.json b/core/src/main/resources/common/message/GroupMetadataKey.json
index 2c39e68..fa0c9ff 100644
--- a/core/src/main/resources/common/message/GroupMetadataKey.json
+++ b/core/src/main/resources/common/message/GroupMetadataKey.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "GroupMetadataKey",
   "validVersions": "2",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "group", "type": "string", "versions": "2" }
   ]
diff --git a/core/src/main/resources/common/message/GroupMetadataValue.json b/core/src/main/resources/common/message/GroupMetadataValue.json
index 4d0f34d..826a7c8 100644
--- a/core/src/main/resources/common/message/GroupMetadataValue.json
+++ b/core/src/main/resources/common/message/GroupMetadataValue.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "GroupMetadataValue",
   "validVersions": "0-3",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "protocolType", "versions": "0+", "type": "string"},
     { "name": "generation", "versions": "0+", "type": "int32" },
diff --git a/core/src/main/resources/common/message/OffsetCommitKey.json b/core/src/main/resources/common/message/OffsetCommitKey.json
index 1ddd20a..a9d1bc3 100644
--- a/core/src/main/resources/common/message/OffsetCommitKey.json
+++ b/core/src/main/resources/common/message/OffsetCommitKey.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "OffsetCommitKey",
   "validVersions": "0-1",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "group", "type": "string", "versions": "0-1" },
     { "name": "topic", "type": "string", "versions": "0-1" },
diff --git a/core/src/main/resources/common/message/OffsetCommitValue.json b/core/src/main/resources/common/message/OffsetCommitValue.json
index df524d0..db8a628 100644
--- a/core/src/main/resources/common/message/OffsetCommitValue.json
+++ b/core/src/main/resources/common/message/OffsetCommitValue.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "OffsetCommitValue",
   "validVersions": "0-3",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "offset", "type": "int64", "versions": "0+" },
     { "name": "leaderEpoch", "type": "int32", "versions": "3+", "default": -1, "ignorable": true},
diff --git a/core/src/main/resources/common/message/TransactionLogKey.json b/core/src/main/resources/common/message/TransactionLogKey.json
index f6fdbfb..7a5d3e5 100644
--- a/core/src/main/resources/common/message/TransactionLogKey.json
+++ b/core/src/main/resources/common/message/TransactionLogKey.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "TransactionLogKey",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "TransactionalId", "type": "string", "versions": "0"}
   ]
diff --git a/core/src/main/resources/common/message/TransactionLogValue.json b/core/src/main/resources/common/message/TransactionLogValue.json
index 153dc31..7915c3d 100644
--- a/core/src/main/resources/common/message/TransactionLogValue.json
+++ b/core/src/main/resources/common/message/TransactionLogValue.json
@@ -17,6 +17,7 @@
   "type": "data",
   "name": "TransactionLogValue",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ProducerId", "type": "int64", "versions": "0",
       "about": "Producer id in use by the transactional id"},
diff --git a/generator/src/main/java/org/apache/kafka/message/MessageSpec.java b/generator/src/main/java/org/apache/kafka/message/MessageSpec.java
index fdcd7cd..82866be 100644
--- a/generator/src/main/java/org/apache/kafka/message/MessageSpec.java
+++ b/generator/src/main/java/org/apache/kafka/message/MessageSpec.java
@@ -53,6 +53,10 @@ public final class MessageSpec {
         this.type = Objects.requireNonNull(type);
         this.commonStructs = commonStructs == null ? Collections.emptyList() :
                 Collections.unmodifiableList(new ArrayList<>(commonStructs));
+        if (flexibleVersions == null) {
+            throw new RuntimeException("You must specify a value for flexibleVersions. " +
+                    "Please use 0+ for all new messages.");
+        }
         this.flexibleVersions = Versions.parse(flexibleVersions, Versions.NONE);
         if ((!this.flexibleVersions().empty()) &&
                 (this.flexibleVersions.highest() < Short.MAX_VALUE)) {
diff --git a/generator/src/test/java/org/apache/kafka/message/MessageDataGeneratorTest.java b/generator/src/test/java/org/apache/kafka/message/MessageDataGeneratorTest.java
index 5d2d442..a51aacc 100644
--- a/generator/src/test/java/org/apache/kafka/message/MessageDataGeneratorTest.java
+++ b/generator/src/test/java/org/apache/kafka/message/MessageDataGeneratorTest.java
@@ -36,6 +36,7 @@ public class MessageDataGeneratorTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"FooBar\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"none\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\" },",
                 "    { \"name\": \"field2\", \"type\": \"[]TestStruct\", \"versions\": \"1+\", ",
@@ -61,6 +62,7 @@ public class MessageDataGeneratorTest {
             "  \"type\": \"request\",",
             "  \"name\": \"FooBar\",",
             "  \"validVersions\": \"0-2\",",
+            "  \"flexibleVersions\": \"none\",",
             "  \"fields\": [",
             "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\", \"default\": \"null\" }",
             "  ]",
@@ -78,6 +80,7 @@ public class MessageDataGeneratorTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"FooBar\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"none\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"[]int32\", \"versions\": \"0+\", \"nullableVersions\": \"1+\", ",
                 "    \"default\": \"null\" }",
@@ -103,6 +106,7 @@ public class MessageDataGeneratorTest {
                     "  \"type\": \"request\",",
                     "  \"name\": \"FooBar\",",
                     "  \"validVersions\": \"0-2\",",
+                    "  \"flexibleVersions\": \"0+\",",
                     "  \"fields\": [",
                     "    { \"name\": \"_badName\", \"type\": \"[]int32\", \"versions\": \"0+\" }",
                     "  ]",
diff --git a/generator/src/test/java/org/apache/kafka/message/StructRegistryTest.java b/generator/src/test/java/org/apache/kafka/message/StructRegistryTest.java
index 9a2f8e3..478a72a 100644
--- a/generator/src/test/java/org/apache/kafka/message/StructRegistryTest.java
+++ b/generator/src/test/java/org/apache/kafka/message/StructRegistryTest.java
@@ -38,6 +38,7 @@ public class StructRegistryTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"LeaderAndIsrRequest\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"0+\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\" },",
                 "    { \"name\": \"field2\", \"type\": \"[]TestCommonStruct\", \"versions\": \"1+\" },",
@@ -68,6 +69,7 @@ public class StructRegistryTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"LeaderAndIsrRequest\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"0+\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\" },",
                 "    { \"name\": \"field2\", \"type\": \"[]TestCommonStruct\", \"versions\": \"0+\", ",
@@ -98,6 +100,7 @@ public class StructRegistryTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"LeaderAndIsrRequest\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"0+\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\" }",
                 "  ],",
@@ -126,6 +129,7 @@ public class StructRegistryTest {
                 "  \"type\": \"request\",",
                 "  \"name\": \"LeaderAndIsrRequest\",",
                 "  \"validVersions\": \"0-2\",",
+                "  \"flexibleVersions\": \"0+\",",
                 "  \"fields\": [",
                 "    { \"name\": \"field1\", \"type\": \"int32\", \"versions\": \"0+\" },",
                 "    { \"name\": \"field2\", \"type\": \"TestInlineStruct\", \"versions\": \"0+\", ",
diff --git a/metadata/src/main/resources/common/metadata/ConfigRecord.json b/metadata/src/main/resources/common/metadata/ConfigRecord.json
index 5a3d97e..27140ab 100644
--- a/metadata/src/main/resources/common/metadata/ConfigRecord.json
+++ b/metadata/src/main/resources/common/metadata/ConfigRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "ConfigRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "ResourceType", "type": "int8", "versions": "0+",
       "about": "The type of resource this configuration applies to." },
diff --git a/metadata/src/main/resources/common/metadata/DelegationTokenRecord.json b/metadata/src/main/resources/common/metadata/DelegationTokenRecord.json
index d9d2ea6..77f4b3c 100644
--- a/metadata/src/main/resources/common/metadata/DelegationTokenRecord.json
+++ b/metadata/src/main/resources/common/metadata/DelegationTokenRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "DelegationTokenRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Owner", "type": "string", "versions": "0+",
       "about": "The delegation token owner." },
diff --git a/metadata/src/main/resources/common/metadata/FeatureLevelRecord.json b/metadata/src/main/resources/common/metadata/FeatureLevelRecord.json
index 542578a..53876c2 100644
--- a/metadata/src/main/resources/common/metadata/FeatureLevelRecord.json
+++ b/metadata/src/main/resources/common/metadata/FeatureLevelRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "FeatureLevelRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Name", "type": "string", "versions": "0+",
       "about": "The feature name." },
diff --git a/metadata/src/main/resources/common/metadata/FenceBrokerRecord.json b/metadata/src/main/resources/common/metadata/FenceBrokerRecord.json
index e8be19e..d784395 100644
--- a/metadata/src/main/resources/common/metadata/FenceBrokerRecord.json
+++ b/metadata/src/main/resources/common/metadata/FenceBrokerRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "FenceBrokerRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Id", "type": "int32", "versions": "0+", "entityType": "brokerId",
       "about": "The broker ID to fence. It will be removed from all ISRs." },
diff --git a/metadata/src/main/resources/common/metadata/PartitionRecord.json b/metadata/src/main/resources/common/metadata/PartitionRecord.json
index 4dc924a..243fde8 100644
--- a/metadata/src/main/resources/common/metadata/PartitionRecord.json
+++ b/metadata/src/main/resources/common/metadata/PartitionRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "PartitionRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "PartitionId", "type": "int32", "versions": "0+", "default": "-1",
       "about": "The partition id." },
diff --git a/metadata/src/main/resources/common/metadata/ProducerIdsRecord.json b/metadata/src/main/resources/common/metadata/ProducerIdsRecord.json
index 09e6b53..0467871 100644
--- a/metadata/src/main/resources/common/metadata/ProducerIdsRecord.json
+++ b/metadata/src/main/resources/common/metadata/ProducerIdsRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "ProducerIdsRecord",
   "validVersions": "0",
+  "flexibleVersions": "0+",
   "fields": [
     { "name": "BrokerId", "type": "int32", "versions": "0+", "entityType": "brokerId",
       "about": "The ID of the requesting broker" },
diff --git a/metadata/src/main/resources/common/metadata/QuotaRecord.json b/metadata/src/main/resources/common/metadata/QuotaRecord.json
index efdb9f6..a6eed74 100644
--- a/metadata/src/main/resources/common/metadata/QuotaRecord.json
+++ b/metadata/src/main/resources/common/metadata/QuotaRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "QuotaRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Entity", "type": "[]EntityData", "versions": "0+",
       "about": "The quota entity to alter.", "fields": [
diff --git a/metadata/src/main/resources/common/metadata/RegisterBrokerRecord.json b/metadata/src/main/resources/common/metadata/RegisterBrokerRecord.json
index b457093..ba9a0d3 100644
--- a/metadata/src/main/resources/common/metadata/RegisterBrokerRecord.json
+++ b/metadata/src/main/resources/common/metadata/RegisterBrokerRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "RegisterBrokerRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "BrokerId", "type": "int32", "versions": "0+", "entityType": "brokerId",
       "about": "The broker id." },
diff --git a/metadata/src/main/resources/common/metadata/RemoveTopicRecord.json b/metadata/src/main/resources/common/metadata/RemoveTopicRecord.json
index 8a11329..efc4ad6 100644
--- a/metadata/src/main/resources/common/metadata/RemoveTopicRecord.json
+++ b/metadata/src/main/resources/common/metadata/RemoveTopicRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "RemoveTopicRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "TopicId", "type": "uuid", "versions": "0+",
       "about": "The topic to remove. All associated partitions will be removed as well." }
diff --git a/metadata/src/main/resources/common/metadata/TopicRecord.json b/metadata/src/main/resources/common/metadata/TopicRecord.json
index dae550f..de4f7a7 100644
--- a/metadata/src/main/resources/common/metadata/TopicRecord.json
+++ b/metadata/src/main/resources/common/metadata/TopicRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "TopicRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Name", "type": "string", "versions": "0+", "entityType": "topicName",
       "about": "The topic name." },
diff --git a/metadata/src/main/resources/common/metadata/UnfenceBrokerRecord.json b/metadata/src/main/resources/common/metadata/UnfenceBrokerRecord.json
index 23ed22a..15e3f90c 100644
--- a/metadata/src/main/resources/common/metadata/UnfenceBrokerRecord.json
+++ b/metadata/src/main/resources/common/metadata/UnfenceBrokerRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "UnfenceBrokerRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Id", "type": "int32", "versions": "0+", "entityType": "brokerId",
       "about": "The broker ID to unfence." },
diff --git a/metadata/src/main/resources/common/metadata/UnregisterBrokerRecord.json b/metadata/src/main/resources/common/metadata/UnregisterBrokerRecord.json
index 5f5989af..58569bf 100644
--- a/metadata/src/main/resources/common/metadata/UnregisterBrokerRecord.json
+++ b/metadata/src/main/resources/common/metadata/UnregisterBrokerRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "UnregisterBrokerRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "BrokerId", "type": "int32", "versions": "0+", "entityType": "brokerId",
       "about": "The broker id." },
diff --git a/metadata/src/main/resources/common/metadata/UserScramCredentialRecord.json b/metadata/src/main/resources/common/metadata/UserScramCredentialRecord.json
index 1dd7e0a..264e92c 100644
--- a/metadata/src/main/resources/common/metadata/UserScramCredentialRecord.json
+++ b/metadata/src/main/resources/common/metadata/UserScramCredentialRecord.json
@@ -18,6 +18,7 @@
   "type": "metadata",
   "name": "UserScramCredentialRecord",
   "validVersions": "0",
+  "flexibleVersions": "none",
   "fields": [
     { "name": "Name", "type": "string", "versions": "0+",
       "about": "The user name." },
diff --git a/streams/src/main/resources/common/message/SubscriptionInfoData.json b/streams/src/main/resources/common/message/SubscriptionInfoData.json
index 1586863..f9a830e 100644
--- a/streams/src/main/resources/common/message/SubscriptionInfoData.json
+++ b/streams/src/main/resources/common/message/SubscriptionInfoData.json
@@ -16,6 +16,7 @@
 {
   "name": "SubscriptionInfoData",
   "validVersions": "1-10",
+  "flexibleVersions": "none",
   "fields": [
     {
       "name": "version",