diff --git a/metadata/src/main/java/org/apache/kafka/controller/QuorumController.java b/metadata/src/main/java/org/apache/kafka/controller/QuorumController.java index bad7c8fbb84..fc5f99358f2 100644 --- a/metadata/src/main/java/org/apache/kafka/controller/QuorumController.java +++ b/metadata/src/main/java/org/apache/kafka/controller/QuorumController.java @@ -2004,14 +2004,17 @@ public final class QuorumController implements Controller { ControllerRequestContext context, BrokerRegistrationRequestData request ) { - // populate finalized features map with latest known kraft version for validation - Map controllerFeatures = new HashMap<>(featureControl.finalizedFeatures(Long.MAX_VALUE).featureMap()); - controllerFeatures.put(KRaftVersion.FEATURE_NAME, raftClient.kraftVersion().featureLevel()); return appendWriteEvent("registerBroker", context.deadlineNs(), - () -> clusterControl. - registerBroker(request, offsetControl.nextWriteOffset(), - new FinalizedControllerFeatures(controllerFeatures, Long.MAX_VALUE), - context.requestHeader().requestApiVersion() >= 3), + () -> { + // Read and write data in the controller event handling thread to avoid stale information. + Map controllerFeatures = new HashMap<>(featureControl.finalizedFeatures(Long.MAX_VALUE).featureMap()); + // Populate finalized features map with latest known kraft version for validation. + controllerFeatures.put(KRaftVersion.FEATURE_NAME, raftClient.kraftVersion().featureLevel()); + return clusterControl. + registerBroker(request, offsetControl.nextWriteOffset(), + new FinalizedControllerFeatures(controllerFeatures, Long.MAX_VALUE), + context.requestHeader().requestApiVersion() >= 3); + }, EnumSet.noneOf(ControllerOperationFlag.class)); }