@@ -84,6 +84,15 @@ public class CoordinatorDynamicConfig
8484 */
8585 private final Map <String , Set <String >> historicalTierAliases ;
8686
87+ /**
88+ * Deployment groups the coordinator enforces per-group replication and handoff for.
89+ * When non-empty, the coordinator ensures {@code requiredReplicas} per listed group rather than
90+ * per tier, and the handoff endpoint requires at least one server in each listed group (that has
91+ * online servers) to serve the segment before declaring handoff complete.
92+ * An empty set disables this behavior and restores default tier-wide replication.
93+ */
94+ private final Set <String > coordinatingVersions ;
95+
8796 /**
8897 * Stale pending segments belonging to the data sources in this list are not killed by {@code
8998 * KillStalePendingSegments}. In other words, segments in these data sources are "protected".
@@ -135,7 +144,8 @@ public CoordinatorDynamicConfig(
135144 @ JsonProperty ("debugDimensions" ) @ Nullable Map <String , String > debugDimensions ,
136145 @ JsonProperty ("turboLoadingNodes" ) @ Nullable Set <String > turboLoadingNodes ,
137146 @ JsonProperty ("cloneServers" ) @ Nullable Map <String , String > cloneServers ,
138- @ JsonProperty ("historicalTierAliases" ) @ Nullable Map <String , Set <String >> historicalTierAliases
147+ @ JsonProperty ("historicalTierAliases" ) @ Nullable Map <String , Set <String >> historicalTierAliases ,
148+ @ JsonProperty ("coordinatingVersions" ) @ Nullable Set <String > coordinatingVersions
139149 )
140150 {
141151 this .markSegmentAsUnusedDelayMillis =
@@ -183,6 +193,7 @@ public CoordinatorDynamicConfig(
183193 this .cloneServers = Configs .valueOrDefault (cloneServers , Map .of ());
184194
185195 this .historicalTierAliases = Configs .valueOrDefault (historicalTierAliases , Map .of ());
196+ this .coordinatingVersions = Configs .valueOrDefault (coordinatingVersions , Set .of ());
186197 final Set <String > aliasKeys = this .historicalTierAliases .keySet ();
187198 for (Set <String > mappedTiers : this .historicalTierAliases .values ()) {
188199 if (!Sets .intersection (mappedTiers , aliasKeys ).isEmpty ()) {
@@ -364,6 +375,12 @@ public Map<String, Set<String>> getHistoricalTierAliases()
364375 return historicalTierAliases ;
365376 }
366377
378+ @ JsonProperty
379+ public Set <String > getCoordinatingVersions ()
380+ {
381+ return coordinatingVersions ;
382+ }
383+
367384 /**
368385 * List of servers to put in turbo-loading mode. These servers will use a larger thread pool to load
369386 * segments. This causes decreases the average time taken to load segments. However, this also means less resources
@@ -398,6 +415,7 @@ public String toString()
398415 ", turboLoadingNodes=" + turboLoadingNodes +
399416 ", cloneServers=" + cloneServers +
400417 ", historicalTierAliases=" + historicalTierAliases +
418+ ", coordinatingVersions=" + coordinatingVersions +
401419 '}' ;
402420 }
403421
@@ -435,7 +453,8 @@ public boolean equals(Object o)
435453 && Objects .equals (turboLoadingNodes , that .turboLoadingNodes )
436454 && Objects .equals (debugDimensions , that .debugDimensions )
437455 && Objects .equals (cloneServers , that .cloneServers )
438- && Objects .equals (historicalTierAliases , that .historicalTierAliases );
456+ && Objects .equals (historicalTierAliases , that .historicalTierAliases )
457+ && Objects .equals (coordinatingVersions , that .coordinatingVersions );
439458 }
440459
441460 @ Override
@@ -460,7 +479,8 @@ public int hashCode()
460479 debugDimensions ,
461480 turboLoadingNodes ,
462481 cloneServers ,
463- historicalTierAliases
482+ historicalTierAliases ,
483+ coordinatingVersions
464484 );
465485 }
466486
@@ -518,6 +538,7 @@ public static class Builder
518538 private Set <String > turboLoadingNodes ;
519539 private Map <String , String > cloneServers ;
520540 private Map <String , Set <String >> historicalTierAliases ;
541+ private Set <String > coordinatingVersions ;
521542
522543 public Builder ()
523544 {
@@ -543,7 +564,8 @@ public Builder(
543564 @ JsonProperty ("debugDimensions" ) @ Nullable Map <String , String > debugDimensions ,
544565 @ JsonProperty ("turboLoadingNodes" ) @ Nullable Set <String > turboLoadingNodes ,
545566 @ JsonProperty ("cloneServers" ) @ Nullable Map <String , String > cloneServers ,
546- @ JsonProperty ("historicalTierAliases" ) @ Nullable Map <String , Set <String >> historicalTierAliases
567+ @ JsonProperty ("historicalTierAliases" ) @ Nullable Map <String , Set <String >> historicalTierAliases ,
568+ @ JsonProperty ("coordinatingVersions" ) @ Nullable Set <String > coordinatingVersions
547569 )
548570 {
549571 this .markSegmentAsUnusedDelayMillis = markSegmentAsUnusedDelayMillis ;
@@ -565,6 +587,7 @@ public Builder(
565587 this .turboLoadingNodes = turboLoadingNodes ;
566588 this .cloneServers = cloneServers ;
567589 this .historicalTierAliases = historicalTierAliases ;
590+ this .coordinatingVersions = coordinatingVersions ;
568591 }
569592
570593 public Builder withMarkSegmentAsUnusedDelayMillis (long leadingTimeMillis )
@@ -669,6 +692,12 @@ public Builder withHistoricalTierAliases(Map<String, Set<String>> historicalTier
669692 return this ;
670693 }
671694
695+ public Builder withCoordinatingVersions (Set <String > coordinatingVersions )
696+ {
697+ this .coordinatingVersions = coordinatingVersions ;
698+ return this ;
699+ }
700+
672701 /**
673702 * Builds a CoordinatoryDynamicConfig using either the configured values, or
674703 * the default value if not configured.
@@ -697,7 +726,8 @@ public CoordinatorDynamicConfig build()
697726 debugDimensions ,
698727 turboLoadingNodes ,
699728 cloneServers ,
700- historicalTierAliases
729+ historicalTierAliases ,
730+ coordinatingVersions
701731 );
702732 }
703733
@@ -730,7 +760,8 @@ public CoordinatorDynamicConfig build(CoordinatorDynamicConfig defaults)
730760 valueOrDefault (debugDimensions , defaults .getDebugDimensions ()),
731761 valueOrDefault (turboLoadingNodes , defaults .getTurboLoadingNodes ()),
732762 valueOrDefault (cloneServers , defaults .getCloneServers ()),
733- valueOrDefault (historicalTierAliases , defaults .getHistoricalTierAliases ())
763+ valueOrDefault (historicalTierAliases , defaults .getHistoricalTierAliases ()),
764+ valueOrDefault (coordinatingVersions , defaults .getCoordinatingVersions ())
734765 );
735766 }
736767 }
0 commit comments