junrao commented on code in PR #22620:
URL: https://github.com/apache/kafka/pull/22620#discussion_r3716031553
##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -219,56 +424,116 @@ private Optional<VoterSet> updateVoters(
voters.updateVoterIgnoringDirectoryId(updatedVoter);
}
- private CompletionStage<UpdateRaftVoterResponseData> storeUpdatedVoters(
+ private void storeUpdatedVoters(
LeaderState<?> leaderState,
- ReplicaKey voterKey,
+ UpdateVoterHandlerState current,
Optional<KRaftVersionUpgrade.Voters> inMemoryVoters,
VoterSet newVoters,
- ListenerName requestListenerName,
long currentTimeMs
) {
+ var changeVoterState = leaderState.changeVoterState();
+
if (inMemoryVoters.isEmpty()) {
- // Since the partition support reconfig then just write the update
voter set directly to the log
- leaderState.appendVotersRecord(newVoters, currentTimeMs);
+ /* Since the partition supports reconfig, write the updated voter
set directly to the log.
+ *
+ * Complete the RPC but don't reset the handler state. This allows
the follower to send a FETCH
+ * request and help to commit the voter set change.
+ */
+ current.setLastOffset(leaderState.appendVotersRecord(newVoters,
currentTimeMs));
+ current.completeFuture(
+ RaftUtil.updateVoterResponse(
+ Errors.NONE,
+ current.requestListenerName(),
+ leaderState.leaderAndEpoch(),
+ leaderState.leaderEndpoints()
+ )
+ );
} else {
// Store the new voters set in the leader state since it cannot be
written to the log
var successful = leaderState.compareAndSetVolatileVoters(
inMemoryVoters.get(),
new KRaftVersionUpgrade.Voters(newVoters)
);
if (successful) {
- log.info(
+ logger.info(
"Updated in-memory voters from {} to {}",
inMemoryVoters.get().voters(),
newVoters
);
+
+ // Reset the check quorum state since the leader received a
successful request
+
leaderState.updateCheckQuorumForFollowingVoter(current.voterKey(),
currentTimeMs);
Review Comment:
This used to happen when inMemoryVoters.isEmpty() is true too. Is it
intentional to omit it now?
##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -155,50 +192,218 @@ public CompletionStage<UpdateRaftVoterResponseData>
handleUpdateVoterRequest(
);
}
- // Check that endpoints includes the default listener
- if (voterEndpoints.address(defaultListenerName).isEmpty()) {
+ // Send API_VERSIONS request to new voter to test new default endpoint
Review Comment:
Claude found the following. Is that a real issue?
Routine UpdateVoter traffic can block admin voter changes
UpdateVoter is periodic at fetchTimeoutMs (default 2000 ms,
FollowerState.java:157-161), has no backoff on failure (the timer resets when
the request is sent, KafkaRaftClient.java:3352; only NONE/UNSUPPORTED_VERSION
set hasUpdatedLeader, :2596-2602), and now holds the exclusive slot for an
API_VERSIONS round trip bounded by the request timeout (also 2000 ms).
isOperationPending (ChangeVoterHandlerState.java:318) now includes the update
state, so AddVoter/RemoveVoter get REQUEST_TIMED_OUT.
A voter advertising an endpoint the leader can't reach retries every 2 s
forever with a near-100% duty cycle on the slot — and the operator's remedy
(remove-controller) is exactly what's blocked. Both timers are fixed with no
jitter, so they can beat against each other.
##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -155,50 +140,193 @@ public CompletionStage<UpdateRaftVoterResponseData>
handleUpdateVoterRequest(
);
}
- // Check that endpoints includes the default listener
- if (voterEndpoints.address(defaultListenerName).isEmpty()) {
+ // Send API_VERSIONS request to new voter to test new default endpoint
+ var timeout = requestSender.send(
+ voterEndpoints
+ .address(requestSender.listenerName())
+ .map(address -> new Node(voterKey.id(), address.getHostName(),
address.getPort()))
+ .orElseThrow(
+ () -> new IllegalStateException(
+ String.format(
+ "Provided listeners %s do not contain a listener
for %s",
+ voterEndpoints,
+ requestSender.listenerName()
+ )
+ )
+ ),
+ this::buildApiVersionsRequest,
+ currentTimeMs
+ );
+ if (timeout.isEmpty()) {
return CompletableFuture.completedFuture(
RaftUtil.updateVoterResponse(
- Errors.INVALID_REQUEST,
+ Errors.REQUEST_TIMED_OUT,
requestListenerName,
leaderState.leaderAndEpoch(),
leaderState.leaderEndpoints()
)
);
}
+ var state = new UpdateVoterHandlerState(
+ voterKey,
+ voterEndpoints,
+ requestListenerName,
+ new SupportedVersionRange(
+ supportedKraftVersions.minSupportedVersion(),
+ supportedKraftVersions.maxSupportedVersion()
+ ),
+ time.timer(timeout.getAsLong())
+ );
+ changeVoterState.resetUpdateVoterHandlerState(
+ Errors.UNKNOWN_SERVER_ERROR,
+ leaderState.leaderAndEpoch(),
+ leaderState.leaderEndpoints(),
+ Optional.of(state)
+ );
+
+ return state.future();
+ }
+
+ /**
+ * Handle the API_VERSIONS response for an update voter operation.
+ *
+ * @param leaderState the leader state
+ * @param source the node that sent the response
+ * @param error the error from the response
+ * @param supportedKraftVersions the supported kraft version range from
the response
+ * @param currentTimeMs the current time in milliseconds
+ * @return true if the update voter operation should continue, false if it
was aborted
+ */
+ public boolean handleApiVersionsResponse(
+ LeaderState<?> leaderState,
+ Node source,
+ Errors error,
+ Optional<ApiVersionsResponseData.SupportedFeatureKey>
supportedKraftVersions,
+ long currentTimeMs
+ ) {
+ var changeVoterState = leaderState.changeVoterState();
+ var handlerState = changeVoterState.updateVoterHandlerState();
+ if (handlerState.isEmpty()) {
+ // There are no pending add operation just ignore the api response
+ return true;
+ }
+
+ // Check that the API_VERSIONS response matches the id of the voter
getting added
+ var current = handlerState.get();
+ if (!current.expectingApiResponse(source.id())) {
+ logger.info(
+ "API_VERSIONS response is not expected from {}: voterKey is
{}, lastOffset is {}",
+ source,
+ current.voterKey(),
+ current.lastOffset()
+ );
+
+ return true;
+ } else if (error != Errors.NONE) {
+ // Abort operation if the API_VERSIONS returned an error
+ logger.info(
+ "Aborting update voter operation for {} at {} since
API_VERSIONS returned an error {}",
+ current.voterKey(),
+ current.voterEndpoints(),
+ error
+ );
+
+ changeVoterState.resetUpdateVoterHandlerState(
+ Errors.REQUEST_TIMED_OUT,
+ leaderState.leaderAndEpoch(),
+ leaderState.leaderEndpoints(),
+ Optional.empty()
+ );
+
+ return false;
+ } else if (
+ !Optional.of(current.supportedKraftVersions())
+
.equals(supportedKraftVersions.map(this::convertToVersionRange))
Review Comment:
Claude reported a potential issue on this in the future.
<h2 class="mt-6 mb-2 font-semibold text-2xl" data-streamdown="heading-2"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop
-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ;
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box;
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235);
font-size: 1.5em; font-weight: 600; margin: 0px; padding: 0.8em 0px 0.4em;
line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255, 255, 255);
font-family: -apple-system, "system-ui", "Segoe UI",
Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal;
font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align:
start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;
-webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(26,
26, 26); text-decoration-thickness: initial; text-decoration-style: initial;
text-decoration-color: initial;">1. Latent fata
l crash: the version-range equality check will kill every voter when
kraft.version 2 lands</h2><p style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0;
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y:
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness:
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brig
htness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); margin: 0px; line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255,
255, 255); font-family: -apple-system, "system-ui", "Segoe
UI", Roboto, sans-serif; font-size: 13px; font-style: normal;
font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px;
text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width:
0px; white-space: normal; background-color: rgb(26, 26, 26);
text-decoration-thickness: initial; text-decoration-style: initial;
text-decoration-color: initial;"><code class="round
ed bg-muted px-1.5 py-0.5 font-mono text-sm" data-streamdown="inline-code"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop
-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ;
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box;
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
font-feature-settings: normal; font-variation-settings: normal; font-size:
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem;
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255,
0.8) !important; direction: ltr; text-align: left; unicode-bidi:
isolate;">UpdateVoterHandler.java:304-323</code><span> </span>aborts with<span>
</span><code class="rounded bg-muted px-1.5 py-0.5 font-
mono text-sm" data-streamdown="inline-code" style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0;
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y:
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness:
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-gray
scale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ;
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace,
SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace; font-feature-settings: normal;
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500;
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem;
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127,
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important;
direction: ltr; text-align: left; unicode-bidi:
isolate;">INVALID_REQUEST</code><span> </span>when the API_VERSIONS range
isn't<span> </span><code class="rounded bg-muted px-1.5 py-0.5 font-mono
text-sm" data-stream
down="inline-code" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0;
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0;
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hu
e-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
font-feature-settings: normal; font-variation-settings: normal; font-size:
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem;
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255,
0.8) !important; direction: ltr; text-align: left; unicode-bidi:
isolate;">equals()</code><span> </span>to the range from the UpdateVoter
request. Those two values come from<span> </span><span class="font-semibold"
data-streamdown="strong" style="--tw-borde
r-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ;
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); font-weight: 600;">different sources
on the same node</span>:</p><div class="my-4 flex flex-col space-y-2"
data-streamdown="table-wrapper" style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0;
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y:
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness:
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-of
fset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast:
; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ;
--tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); padding: 0.5em 0px; overflow-x: auto; margin-top: 0px; margin-bottom:
0px; display: flex; flex-direction: column; --tw-space-y-reverse: 0; color:
rgb(255, 255, 255); font-family: -apple-system, "system-ui",
"Segoe UI", Roboto, sans-serif; font-size: 13px; font-style: normal;
font-variant-ligatures: n
ormal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal;
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows:
2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal;
background-color: rgb(26, 26, 26); text-decoration-thickness: initial;
text-decoration-style: initial; text-decoration-color: initial;"><div
class="flex items-center justify-end gap-1" style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0;
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y:
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness:
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .
5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ;
--tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ;
--tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ;
--tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ;
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); display: flex; align-items: center;
justify-content: flex-end; gap: 0.25rem;"><div class="relative"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan
-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate:
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ;
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; bo
rder-width: 0px; border-style: solid; border-color: rgb(229, 231, 235);
position: relative;"><button class="cursor-pointer p-1 text-muted-foreground
transition-all hover:text-foreground disabled:cursor-not-allowed
disabled:opacity-50" title="Copy table" type="button"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brig
htness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); font-family: inherit; font-feature-settings: inherit;
font-variation-settings: inherit; font-size: 13px; font-weight: inherit;
line-height: inherit; letter-spacing: inherit; color: inherit; margin: 0px;
padding: 0.25rem; text-transform: none; appearance: button; background-color:
transparent; background-image: none; cursor: pointer; transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration:
0.15s;"><svg
color="currentColor" height="16" stroke-linejoin="round" viewBox="0 0 16 16"
width="16" size="14"><path clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835
1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10
2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5
2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835
4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15
14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5
6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5
13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z"
fill="currentColor" fill-rule="evenodd"></path></svg></button></div><div
class="relative" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0;
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0;
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ;
--tw-pi
nch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate:
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ;
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box;
border-width: 0
px; border-style: solid; border-color: rgb(229, 231, 235); position:
relative;"><button class="cursor-pointer p-1 text-muted-foreground
transition-all hover:text-foreground disabled:cursor-not-allowed
disabled:opacity-50" title="Download table" type="button"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); font-family: inherit; font-feature-settings: inherit;
font-variation-settings: inherit; font-size: 13px; font-weight: inherit;
line-height: inherit; letter-spacing: inherit; color: inherit; margin: 0px;
padding: 0.25rem; text-transform: none; appearance: button; background-color:
transparent; background-image: none; cursor: pointer; transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration:
0.15s;"><svg color="c
urrentColor" height="16" stroke-linejoin="round" viewBox="0 0 16 16"
width="16" size="14"><path clip-rule="evenodd" d="M8.75 1V1.75V8.68934L10.7197
6.71967L11.25 6.18934L12.3107 7.25L11.7803 7.78033L8.70711 10.8536C8.31658
11.2441 7.68342 11.2441 7.29289 10.8536L4.21967 7.78033L3.68934 7.25L4.75
6.18934L5.28033 6.71967L7.25 8.68934V1.75V1H8.75ZM13.5
9.25V13.5H2.5V9.25V8.5H1V9.25V14C1 14.5523 1.44771 15 2 15H14C14.5523 15 15
14.5523 15 14V9.25V8.5H13.5V9.25Z" fill="currentColor"
fill-rule="evenodd"></path></svg></button></div></div><div
class="overflow-x-auto" style="--tw-border-spacing-x: 0; --tw-border-spacing-y:
0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0;
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeri
c-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ;
--tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color:
rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0
#0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ;
--tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ;
--tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ;
--tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ;
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); overflow-x: auto;
--tw-space-y-reverse: 0; margin-top: 6.5px; margin-bottom: 0px;">
| Source | Value
-- | -- | --
UpdateVoter request | Feature.KRAFT_VERSION.supportedVersionRange()
(KafkaRaftManager.scala:180) | (minimumProduction, latestTesting) —
Feature.java:130-135
API_VERSIONS response |
BrokerFeatures.defaultSupportedFeatures(enableUnstable) | caps at
latestProduction unless unstable is enabled
</div></div><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0;
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0;
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-
rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); margin: 0px; line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255,
255, 255); font-family: -apple-system, "system-ui", "Segoe
UI", Roboto, sans-serif; font-size: 13px; font-style: normal;
font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px;
text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width:
0px; white-space: normal; background-color: rgb(26, 26, 26);
text-decoration-thickness: initial; text-decoration-style: initial;
text-decoration-color: initial;">Today they coincide —<span> </span><code
class="rounded bg-muted px-1.5 py-0.5 font-mono text-sm
" data-streamdown="inline-code" style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0;
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y:
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness:
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --t
w-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ;
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing:
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231,
235); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
font-feature-settings: normal; font-variation-settings: normal; font-size:
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem;
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255,
0.8) !important; direction: ltr; text-align: left; unicode-bidi:
isolate;">KRaftVersion.values()</code><span> </span>is<span> </span><code
class="rounded bg-muted px-1.5 py-0.5 font-mono text-sm"
data-streamdown="inline-code" style="--tw-border
-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; -
-tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ;
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace,
SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace; font-feature-settings: normal;
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500;
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem;
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127,
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important;
direction: ltr; text-align: left; unicode-bidi: isolate;">{0, 1}</code><span>
</span>and<span> </span><code class="rounded bg-muted px-1.5 py-0.5 font-mono
text-sm" data-streamdown="inline-code" style="--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-translate-x: 0; --
tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom:
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ;
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5);
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ;
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale:
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-
sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ;
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style:
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace,
SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace; font-feature-settings: normal;
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500;
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem;
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127,
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important;
direction: ltr; text-align: left; unicode-bidi: isolate;">LATEST_PRODUCTION =
KRAFT_VERSION_1</code>, so<span> </span><code class="rounded bg-muted px-1.5
py-0.5 font-mono text-sm" data-streamdown="inline-code"
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0;
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0
; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y:
; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ; --tw-gradient-via-position: ;
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate:
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout
: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box;
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
font-feature-settings: normal; font-variation-settings: normal; font-size:
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem;
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255,
0.8) !important; direction: ltr; text-align: left; unicode-bidi:
isolate;">latestTesting() == latestProduction() == 1</code>.</p>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]