util: In OutlierDetectionLb, don't box longs if they can't be null

Changed the builder pattern to pass the builder to the constructor,
since I was changing almost all the arguments of the constructor anyway.
This commit is contained in:
Eric Anderson 2025-06-10 14:32:26 -07:00
parent 13fe008044
commit 6cc2ff1ced
1 changed files with 59 additions and 83 deletions

View File

@ -142,7 +142,7 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
// If outlier detection is actually configured, start a timer that will periodically try to // If outlier detection is actually configured, start a timer that will periodically try to
// detect outliers. // detect outliers.
if (config.outlierDetectionEnabled()) { if (config.outlierDetectionEnabled()) {
Long initialDelayNanos; long initialDelayNanos;
if (detectionTimerStartNanos == null) { if (detectionTimerStartNanos == null) {
// On the first go we use the configured interval. // On the first go we use the configured interval.
@ -723,7 +723,7 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
* that don't have ejected subchannels and uneject ones that have spent the maximum ejection * that don't have ejected subchannels and uneject ones that have spent the maximum ejection
* time allowed. * time allowed.
*/ */
void maybeUnejectOutliers(Long detectionTimerStartNanos) { void maybeUnejectOutliers(long detectionTimerStartNanos) {
for (EndpointTracker tracker : trackerMap.values()) { for (EndpointTracker tracker : trackerMap.values()) {
if (!tracker.subchannelsEjected()) { if (!tracker.subchannelsEjected()) {
tracker.decrementEjectionTimeMultiplier(); tracker.decrementEjectionTimeMultiplier();
@ -951,64 +951,54 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
*/ */
public static final class OutlierDetectionLoadBalancerConfig { public static final class OutlierDetectionLoadBalancerConfig {
public final Long intervalNanos; public final long intervalNanos;
public final Long baseEjectionTimeNanos; public final long baseEjectionTimeNanos;
public final Long maxEjectionTimeNanos; public final long maxEjectionTimeNanos;
public final Integer maxEjectionPercent; public final int maxEjectionPercent;
public final SuccessRateEjection successRateEjection; public final SuccessRateEjection successRateEjection;
public final FailurePercentageEjection failurePercentageEjection; public final FailurePercentageEjection failurePercentageEjection;
public final Object childConfig; public final Object childConfig;
private OutlierDetectionLoadBalancerConfig(Long intervalNanos, private OutlierDetectionLoadBalancerConfig(Builder builder) {
Long baseEjectionTimeNanos, this.intervalNanos = builder.intervalNanos;
Long maxEjectionTimeNanos, this.baseEjectionTimeNanos = builder.baseEjectionTimeNanos;
Integer maxEjectionPercent, this.maxEjectionTimeNanos = builder.maxEjectionTimeNanos;
SuccessRateEjection successRateEjection, this.maxEjectionPercent = builder.maxEjectionPercent;
FailurePercentageEjection failurePercentageEjection, this.successRateEjection = builder.successRateEjection;
Object childConfig) { this.failurePercentageEjection = builder.failurePercentageEjection;
this.intervalNanos = intervalNanos; this.childConfig = builder.childConfig;
this.baseEjectionTimeNanos = baseEjectionTimeNanos;
this.maxEjectionTimeNanos = maxEjectionTimeNanos;
this.maxEjectionPercent = maxEjectionPercent;
this.successRateEjection = successRateEjection;
this.failurePercentageEjection = failurePercentageEjection;
this.childConfig = childConfig;
} }
/** Builds a new {@link OutlierDetectionLoadBalancerConfig}. */ /** Builds a new {@link OutlierDetectionLoadBalancerConfig}. */
public static class Builder { public static class Builder {
Long intervalNanos = 10_000_000_000L; // 10s long intervalNanos = 10_000_000_000L; // 10s
Long baseEjectionTimeNanos = 30_000_000_000L; // 30s long baseEjectionTimeNanos = 30_000_000_000L; // 30s
Long maxEjectionTimeNanos = 300_000_000_000L; // 300s long maxEjectionTimeNanos = 300_000_000_000L; // 300s
Integer maxEjectionPercent = 10; int maxEjectionPercent = 10;
SuccessRateEjection successRateEjection; SuccessRateEjection successRateEjection;
FailurePercentageEjection failurePercentageEjection; FailurePercentageEjection failurePercentageEjection;
Object childConfig; Object childConfig;
/** The interval between outlier detection sweeps. */ /** The interval between outlier detection sweeps. */
public Builder setIntervalNanos(Long intervalNanos) { public Builder setIntervalNanos(long intervalNanos) {
checkArgument(intervalNanos != null);
this.intervalNanos = intervalNanos; this.intervalNanos = intervalNanos;
return this; return this;
} }
/** The base time an address is ejected for. */ /** The base time an address is ejected for. */
public Builder setBaseEjectionTimeNanos(Long baseEjectionTimeNanos) { public Builder setBaseEjectionTimeNanos(long baseEjectionTimeNanos) {
checkArgument(baseEjectionTimeNanos != null);
this.baseEjectionTimeNanos = baseEjectionTimeNanos; this.baseEjectionTimeNanos = baseEjectionTimeNanos;
return this; return this;
} }
/** The longest time an address can be ejected. */ /** The longest time an address can be ejected. */
public Builder setMaxEjectionTimeNanos(Long maxEjectionTimeNanos) { public Builder setMaxEjectionTimeNanos(long maxEjectionTimeNanos) {
checkArgument(maxEjectionTimeNanos != null);
this.maxEjectionTimeNanos = maxEjectionTimeNanos; this.maxEjectionTimeNanos = maxEjectionTimeNanos;
return this; return this;
} }
/** The algorithm agnostic maximum percentage of addresses that can be ejected. */ /** The algorithm agnostic maximum percentage of addresses that can be ejected. */
public Builder setMaxEjectionPercent(Integer maxEjectionPercent) { public Builder setMaxEjectionPercent(int maxEjectionPercent) {
checkArgument(maxEjectionPercent != null);
this.maxEjectionPercent = maxEjectionPercent; this.maxEjectionPercent = maxEjectionPercent;
return this; return this;
} }
@ -1040,64 +1030,57 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
/** Builds a new instance of {@link OutlierDetectionLoadBalancerConfig}. */ /** Builds a new instance of {@link OutlierDetectionLoadBalancerConfig}. */
public OutlierDetectionLoadBalancerConfig build() { public OutlierDetectionLoadBalancerConfig build() {
checkState(childConfig != null); checkState(childConfig != null);
return new OutlierDetectionLoadBalancerConfig(intervalNanos, baseEjectionTimeNanos, return new OutlierDetectionLoadBalancerConfig(this);
maxEjectionTimeNanos, maxEjectionPercent, successRateEjection,
failurePercentageEjection, childConfig);
} }
} }
/** The configuration for success rate ejection. */ /** The configuration for success rate ejection. */
public static class SuccessRateEjection { public static class SuccessRateEjection {
public final Integer stdevFactor; public final int stdevFactor;
public final Integer enforcementPercentage; public final int enforcementPercentage;
public final Integer minimumHosts; public final int minimumHosts;
public final Integer requestVolume; public final int requestVolume;
SuccessRateEjection(Integer stdevFactor, Integer enforcementPercentage, Integer minimumHosts, SuccessRateEjection(Builder builder) {
Integer requestVolume) { this.stdevFactor = builder.stdevFactor;
this.stdevFactor = stdevFactor; this.enforcementPercentage = builder.enforcementPercentage;
this.enforcementPercentage = enforcementPercentage; this.minimumHosts = builder.minimumHosts;
this.minimumHosts = minimumHosts; this.requestVolume = builder.requestVolume;
this.requestVolume = requestVolume;
} }
/** Builds new instances of {@link SuccessRateEjection}. */ /** Builds new instances of {@link SuccessRateEjection}. */
public static final class Builder { public static final class Builder {
Integer stdevFactor = 1900; int stdevFactor = 1900;
Integer enforcementPercentage = 100; int enforcementPercentage = 100;
Integer minimumHosts = 5; int minimumHosts = 5;
Integer requestVolume = 100; int requestVolume = 100;
/** The product of this and the standard deviation of success rates determine the ejection /** The product of this and the standard deviation of success rates determine the ejection
* threshold. * threshold.
*/ */
public Builder setStdevFactor(Integer stdevFactor) { public Builder setStdevFactor(int stdevFactor) {
checkArgument(stdevFactor != null);
this.stdevFactor = stdevFactor; this.stdevFactor = stdevFactor;
return this; return this;
} }
/** Only eject this percentage of outliers. */ /** Only eject this percentage of outliers. */
public Builder setEnforcementPercentage(Integer enforcementPercentage) { public Builder setEnforcementPercentage(int enforcementPercentage) {
checkArgument(enforcementPercentage != null);
checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100); checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100);
this.enforcementPercentage = enforcementPercentage; this.enforcementPercentage = enforcementPercentage;
return this; return this;
} }
/** The minimum amount of hosts needed for success rate ejection. */ /** The minimum amount of hosts needed for success rate ejection. */
public Builder setMinimumHosts(Integer minimumHosts) { public Builder setMinimumHosts(int minimumHosts) {
checkArgument(minimumHosts != null);
checkArgument(minimumHosts >= 0); checkArgument(minimumHosts >= 0);
this.minimumHosts = minimumHosts; this.minimumHosts = minimumHosts;
return this; return this;
} }
/** The minimum address request volume to be considered for success rate ejection. */ /** The minimum address request volume to be considered for success rate ejection. */
public Builder setRequestVolume(Integer requestVolume) { public Builder setRequestVolume(int requestVolume) {
checkArgument(requestVolume != null);
checkArgument(requestVolume >= 0); checkArgument(requestVolume >= 0);
this.requestVolume = requestVolume; this.requestVolume = requestVolume;
return this; return this;
@ -1105,53 +1088,48 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
/** Builds a new instance of {@link SuccessRateEjection}. */ /** Builds a new instance of {@link SuccessRateEjection}. */
public SuccessRateEjection build() { public SuccessRateEjection build() {
return new SuccessRateEjection(stdevFactor, enforcementPercentage, minimumHosts, return new SuccessRateEjection(this);
requestVolume);
} }
} }
} }
/** The configuration for failure percentage ejection. */ /** The configuration for failure percentage ejection. */
public static class FailurePercentageEjection { public static class FailurePercentageEjection {
public final Integer threshold; public final int threshold;
public final Integer enforcementPercentage; public final int enforcementPercentage;
public final Integer minimumHosts; public final int minimumHosts;
public final Integer requestVolume; public final int requestVolume;
FailurePercentageEjection(Integer threshold, Integer enforcementPercentage, FailurePercentageEjection(Builder builder) {
Integer minimumHosts, Integer requestVolume) { this.threshold = builder.threshold;
this.threshold = threshold; this.enforcementPercentage = builder.enforcementPercentage;
this.enforcementPercentage = enforcementPercentage; this.minimumHosts = builder.minimumHosts;
this.minimumHosts = minimumHosts; this.requestVolume = builder.requestVolume;
this.requestVolume = requestVolume;
} }
/** For building new {@link FailurePercentageEjection} instances. */ /** For building new {@link FailurePercentageEjection} instances. */
public static class Builder { public static class Builder {
Integer threshold = 85; int threshold = 85;
Integer enforcementPercentage = 100; int enforcementPercentage = 100;
Integer minimumHosts = 5; int minimumHosts = 5;
Integer requestVolume = 50; int requestVolume = 50;
/** The failure percentage that will result in an address being considered an outlier. */ /** The failure percentage that will result in an address being considered an outlier. */
public Builder setThreshold(Integer threshold) { public Builder setThreshold(int threshold) {
checkArgument(threshold != null);
checkArgument(threshold >= 0 && threshold <= 100); checkArgument(threshold >= 0 && threshold <= 100);
this.threshold = threshold; this.threshold = threshold;
return this; return this;
} }
/** Only eject this percentage of outliers. */ /** Only eject this percentage of outliers. */
public Builder setEnforcementPercentage(Integer enforcementPercentage) { public Builder setEnforcementPercentage(int enforcementPercentage) {
checkArgument(enforcementPercentage != null);
checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100); checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100);
this.enforcementPercentage = enforcementPercentage; this.enforcementPercentage = enforcementPercentage;
return this; return this;
} }
/** The minimum amount of host for failure percentage ejection to be enabled. */ /** The minimum amount of host for failure percentage ejection to be enabled. */
public Builder setMinimumHosts(Integer minimumHosts) { public Builder setMinimumHosts(int minimumHosts) {
checkArgument(minimumHosts != null);
checkArgument(minimumHosts >= 0); checkArgument(minimumHosts >= 0);
this.minimumHosts = minimumHosts; this.minimumHosts = minimumHosts;
return this; return this;
@ -1161,8 +1139,7 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
* The request volume required for an address to be considered for failure percentage * The request volume required for an address to be considered for failure percentage
* ejection. * ejection.
*/ */
public Builder setRequestVolume(Integer requestVolume) { public Builder setRequestVolume(int requestVolume) {
checkArgument(requestVolume != null);
checkArgument(requestVolume >= 0); checkArgument(requestVolume >= 0);
this.requestVolume = requestVolume; this.requestVolume = requestVolume;
return this; return this;
@ -1170,8 +1147,7 @@ public final class OutlierDetectionLoadBalancer extends LoadBalancer {
/** Builds a new instance of {@link FailurePercentageEjection}. */ /** Builds a new instance of {@link FailurePercentageEjection}. */
public FailurePercentageEjection build() { public FailurePercentageEjection build() {
return new FailurePercentageEjection(threshold, enforcementPercentage, minimumHosts, return new FailurePercentageEjection(this);
requestVolume);
} }
} }
} }