Skip to content

Commit 6968177

Browse files
authored
Merge pull request #33084 from vespa-engine/hmusum/add-feature-flag-for-distribution-bits
Add feature flag and use it for overriding distribution bits in dev z…
2 parents 3a1c2e9 + 6788d2f commit 6968177

File tree

7 files changed

+56
-8
lines changed

7 files changed

+56
-8
lines changed

config-model-api/abi-spec.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,8 @@
13431343
"public boolean distributionConfigFromClusterController()",
13441344
"public boolean useLegacyWandQueryParsing()",
13451345
"public boolean forwardAllLogLevels()",
1346-
"public long zookeeperPreAllocSize()"
1346+
"public long zookeeperPreAllocSize()",
1347+
"public int distributionBitsInDev()"
13471348
],
13481349
"fields" : [ ]
13491350
},
@@ -1812,8 +1813,8 @@
18121813
"public final java.lang.String toString()",
18131814
"public final int hashCode()",
18141815
"public final boolean equals(java.lang.Object)",
1815-
"public java.lang.String name()",
1816-
"public java.lang.String id()"
1816+
"public java.lang.String id()",
1817+
"public java.lang.String name()"
18171818
],
18181819
"fields" : [ ]
18191820
},

config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ interface FeatureFlags {
125125
@ModelFeatureFlag(owners = {"arnej"}) default boolean useLegacyWandQueryParsing() { return true; }
126126
@ModelFeatureFlag(owners = {"hmusum"}) default boolean forwardAllLogLevels() { return true; }
127127
@ModelFeatureFlag(owners = {"hmusum"}) default long zookeeperPreAllocSize() { return 65536L; }
128+
@ModelFeatureFlag(owners = {"hmusum"}) default int distributionBitsInDev() { return 0; }
128129
}
129130

130131
/** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */

config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
8888
private boolean symmetricPutAndActivateReplicaSelection = false;
8989
private boolean enforceStrictlyIncreasingClusterStateVersions = false;
9090
private boolean distributionConfigFromClusterController = false;
91+
private int distributionBitsInDev = 0;
9192

9293
@Override public ModelContext.FeatureFlags featureFlags() { return this; }
9394
@Override public boolean multitenant() { return multitenant; }
@@ -150,6 +151,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
150151
@Override public boolean symmetricPutAndActivateReplicaSelection() { return symmetricPutAndActivateReplicaSelection; }
151152
@Override public boolean enforceStrictlyIncreasingClusterStateVersions() { return enforceStrictlyIncreasingClusterStateVersions; }
152153
@Override public boolean distributionConfigFromClusterController() { return distributionConfigFromClusterController; }
154+
@Override public int distributionBitsInDev() { return distributionBitsInDev; }
153155

154156
public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) {
155157
this.sharedStringRepoNoReclaim = sharedStringRepoNoReclaim;
@@ -410,6 +412,11 @@ public TestProperties setContainerEndpoints(Set<ContainerEndpoint> containerEndp
410412
return this;
411413
}
412414

415+
public TestProperties setDistributionBitsInDev(int bits) {
416+
this.distributionBitsInDev = bits;
417+
return this;
418+
}
419+
413420
public static class Spec implements ConfigServerSpec {
414421

415422
private final String hostName;

config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.base.Preconditions;
55
import com.yahoo.config.application.api.DeployLogger;
66
import com.yahoo.config.model.ConfigModelContext;
7+
import com.yahoo.config.model.api.ModelContext;
78
import com.yahoo.config.model.deploy.DeployState;
89
import com.yahoo.config.model.producer.AnyConfigProducer;
910
import com.yahoo.config.model.producer.TreeConfigProducer;
@@ -63,9 +64,9 @@
6364
import java.util.Optional;
6465
import java.util.Set;
6566
import java.util.TreeMap;
66-
import java.util.logging.Level;
6767

6868
import static com.yahoo.vespa.model.content.DistributionBitCalculator.getDistributionBits;
69+
import static java.util.logging.Level.INFO;
6970
import static java.util.logging.Level.WARNING;
7071

7172
/**
@@ -98,6 +99,7 @@ public class ContentCluster extends TreeConfigProducer<AnyConfigProducer> implem
9899
private Integer maxNodesPerMerge;
99100
private final Zone zone;
100101
private final Optional<Integer> distributionBitsInPreviousModel;
102+
private final ModelContext.FeatureFlags featureFlags;
101103

102104
public enum DistributionMode { LEGACY, STRICT, LOOSE }
103105
private DistributionMode distributionMode;
@@ -339,7 +341,7 @@ else if (admin.multitenant()) { // system tests: cluster controllers on logserve
339341
if (hosts.size() > 1) {
340342
var message = "When having content clusters and more than 1 config server " +
341343
"it is recommended to configure cluster controllers explicitly.";
342-
deployState.getDeployLogger().logApplicationPackage(Level.INFO, message);
344+
deployState.getDeployLogger().logApplicationPackage(INFO, message);
343345
}
344346
admin.setClusterControllers(createClusterControllers(admin,
345347
hosts,
@@ -438,6 +440,7 @@ private ContentCluster(TreeConfigProducer<?> parent, String clusterId,
438440
this.documentSelection = routingSelection;
439441
this.zone = deployState.zone();
440442
this.distributionBitsInPreviousModel = distributionBitsInPreviousModel(deployState, clusterId);
443+
this.featureFlags = deployState.featureFlags();
441444
}
442445

443446
public ClusterSpec.Id id() { return ClusterSpec.Id.from(clusterId); }
@@ -561,8 +564,17 @@ public int distributionBits() {
561564
// Avoid number of distribution bits being reduced
562565
if (distributionBitsInPreviousModel.isPresent() && distributionBitsInPreviousModel.get() > distributionBits)
563566
return distributionBitsInPreviousModel.get();
564-
else
567+
568+
if (isHosted && zone.environment() == Environment.dev) {
569+
var overriddenDistributionBits = featureFlags.distributionBitsInDev();
570+
if (overriddenDistributionBits == 0) return distributionBits;
571+
572+
log.log(INFO, "Overriding distribution bits to be " + overriddenDistributionBits);
573+
return overriddenDistributionBits;
574+
}
575+
else {
565576
return distributionBits;
577+
}
566578
}
567579

568580
private boolean zoneEnvImplies16DistributionBits() {

config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,14 @@ void testZoneDependentDistributionBits() throws Exception {
643643

644644
ContentCluster stagingNot16Bits = createWithZone(xml, new Zone(Environment.staging, RegionName.from("us-east-3")));
645645
assertDistributionBitsInConfig(stagingNot16Bits, 8);
646+
647+
// Default should be 8 bits
648+
ContentCluster dev8Bits = createWithZone(xml, new Zone(Environment.dev, RegionName.from("us-east-3")));
649+
assertDistributionBitsInConfig(dev8Bits, 8);
650+
651+
// Overriding feature flag with 16 bits
652+
ContentCluster dev16Bits = createWithZone(xml, new Zone(Environment.dev, RegionName.from("us-east-3")), 16);
653+
assertDistributionBitsInConfig(dev16Bits, 16);
646654
}
647655

648656
@Test
@@ -1194,10 +1202,19 @@ void test_routing_with_multiple_clusters() {
11941202
assertRoute(spec.getRoute(9), "storage/cluster.foo_c", "route:foo_c");
11951203
}
11961204

1205+
11971206
private ContentCluster createWithZone(String clusterXml, Zone zone) throws Exception {
1207+
return createWithZone(clusterXml, zone, 0);
1208+
}
1209+
1210+
private ContentCluster createWithZone(String clusterXml, Zone zone, int bitsInDev) throws Exception {
11981211
DeployState.Builder deployStateBuilder = new DeployState.Builder()
1199-
.zone(zone)
1200-
.properties(new TestProperties().setHostedVespa(true));
1212+
.zone(zone);
1213+
var properties = new TestProperties().setHostedVespa(true);
1214+
if (bitsInDev != 0)
1215+
properties.setDistributionBitsInDev(bitsInDev);
1216+
deployStateBuilder.properties(properties);
1217+
12011218
List<String> schemas = SchemaBuilder.createSchemas("test");
12021219
MockRoot root = ContentClusterUtils.createMockRoot(schemas, deployStateBuilder);
12031220
ContentCluster cluster = ContentClusterUtils.createCluster(clusterXml, root);

configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ public static class FeatureFlags implements ModelContext.FeatureFlags {
216216
private final boolean useLegacyWandQueryParsing;
217217
private final boolean forwardAllLogLevels;
218218
private final long zookeeperPreAllocSize;
219+
private final int distributionBitsInDev;
219220

220221
public FeatureFlags(FlagSource source, ApplicationId appId, Version version) {
221222
this.defaultTermwiseLimit = Flags.DEFAULT_TERM_WISE_LIMIT.bindTo(source).with(appId).with(version).value();
@@ -268,6 +269,7 @@ public FeatureFlags(FlagSource source, ApplicationId appId, Version version) {
268269
this.useLegacyWandQueryParsing = Flags.USE_LEGACY_WAND_QUERY_PARSING.bindTo(source).with(appId).with(version).value();
269270
this.forwardAllLogLevels = PermanentFlags.FORWARD_ALL_LOG_LEVELS.bindTo(source).with(appId).with(version).value();
270271
this.zookeeperPreAllocSize = Flags.ZOOKEEPER_PRE_ALLOC_SIZE_KIB.bindTo(source).value();
272+
this.distributionBitsInDev = Flags.DISTRIBUTION_BITS_IN_DEV.bindTo(source).value();
271273
}
272274

273275
@Override public int heapSizePercentage() { return heapPercentage; }
@@ -326,6 +328,7 @@ public FeatureFlags(FlagSource source, ApplicationId appId, Version version) {
326328
@Override public boolean useLegacyWandQueryParsing() { return useLegacyWandQueryParsing; }
327329
@Override public boolean forwardAllLogLevels() { return forwardAllLogLevels; }
328330
@Override public long zookeeperPreAllocSize() { return zookeeperPreAllocSize; }
331+
@Override public int distributionBitsInDev() { return distributionBitsInDev; }
329332
}
330333

331334
public static class Properties implements ModelContext.Properties {

flags/src/main/java/com/yahoo/vespa/flags/Flags.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,13 @@ public class Flags {
461461
"Use new RPC method for triggering download of file reference",
462462
"Takes effect immediately");
463463

464+
public static final UnboundIntFlag DISTRIBUTION_BITS_IN_DEV = defineIntFlag(
465+
"distribution-bits-in-dev", 0,
466+
List.of("hmusum", "vekterli"), "2025-01-06", "2025-02-01",
467+
"If non-zero, override number of distribution bits to use in dev zone in hosted Vespa for an application.",
468+
"Takes effect at redeployment",
469+
INSTANCE_ID);
470+
464471
/** WARNING: public for testing: All flags should be defined in {@link Flags}. */
465472
public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners,
466473
String createdAt, String expiresAt, String description,

0 commit comments

Comments
 (0)