Skip to content

Commit 77bed78

Browse files
Merge branch 'grpc:master' into Issue_fixed_12142
2 parents 3f241f8 + 6cc2ff1 commit 77bed78

15 files changed

+810
-1147
lines changed

binder/src/main/java/io/grpc/binder/internal/BinderTransport.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,10 @@ protected boolean setOutgoingBinder(OneWayBinderProxy binder) {
300300

301301
@Override
302302
public synchronized void binderDied() {
303-
shutdownInternal(Status.UNAVAILABLE.withDescription("Peer process crashed, exited or was killed (binderDied)"), true);
303+
shutdownInternal(
304+
Status.UNAVAILABLE.withDescription(
305+
"Peer process crashed, exited or was killed (binderDied)"),
306+
true);
304307
}
305308

306309
@GuardedBy("this")

rls/src/main/java/io/grpc/rls/LinkedHashLruCache.java

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ abstract class LinkedHashLruCache<K, V> implements LruCache<K, V> {
4343

4444
private final LinkedHashMap<K, SizedValue> delegate;
4545
private final Ticker ticker;
46-
private final EvictionListener<K, SizedValue> evictionListener;
46+
@Nullable
47+
private final EvictionListener<K, V> evictionListener;
4748
private long estimatedSizeBytes;
4849
private long estimatedMaxSizeBytes;
4950

@@ -53,7 +54,7 @@ abstract class LinkedHashLruCache<K, V> implements LruCache<K, V> {
5354
final Ticker ticker) {
5455
checkState(estimatedMaxSizeBytes > 0, "max estimated cache size should be positive");
5556
this.estimatedMaxSizeBytes = estimatedMaxSizeBytes;
56-
this.evictionListener = new SizeHandlingEvictionListener(evictionListener);
57+
this.evictionListener = evictionListener;
5758
this.ticker = checkNotNull(ticker, "ticker");
5859
delegate = new LinkedHashMap<K, SizedValue>(
5960
// rough estimate or minimum hashmap default
@@ -135,7 +136,7 @@ public final V cache(K key, V value) {
135136
estimatedSizeBytes += size;
136137
existing = delegate.put(key, new SizedValue(size, value));
137138
if (existing != null) {
138-
evictionListener.onEviction(key, existing, EvictionType.REPLACED);
139+
fireOnEviction(key, existing, EvictionType.REPLACED);
139140
}
140141
return existing == null ? null : existing.value;
141142
}
@@ -174,7 +175,7 @@ private V invalidate(K key, EvictionType cause) {
174175
checkNotNull(cause, "cause");
175176
SizedValue existing = delegate.remove(key);
176177
if (existing != null) {
177-
evictionListener.onEviction(key, existing, cause);
178+
fireOnEviction(key, existing, cause);
178179
}
179180
return existing == null ? null : existing.value;
180181
}
@@ -185,7 +186,7 @@ public final void invalidateAll() {
185186
while (iterator.hasNext()) {
186187
Map.Entry<K, SizedValue> entry = iterator.next();
187188
if (entry.getValue() != null) {
188-
evictionListener.onEviction(entry.getKey(), entry.getValue(), EvictionType.EXPLICIT);
189+
fireOnEviction(entry.getKey(), entry.getValue(), EvictionType.EXPLICIT);
189190
}
190191
iterator.remove();
191192
}
@@ -215,23 +216,22 @@ public final List<V> values() {
215216
protected final boolean fitToLimit() {
216217
boolean removedAnyUnexpired = false;
217218
if (estimatedSizeBytes <= estimatedMaxSizeBytes) {
218-
// new size is larger no need to do cleanup
219219
return false;
220220
}
221221
// cleanup expired entries
222222
long now = ticker.read();
223223
cleanupExpiredEntries(now);
224224

225-
// cleanup eldest entry until new size limit
225+
// cleanup eldest entry until the size of all entries fits within the limit
226226
Iterator<Map.Entry<K, SizedValue>> lruIter = delegate.entrySet().iterator();
227227
while (lruIter.hasNext() && estimatedMaxSizeBytes < this.estimatedSizeBytes) {
228228
Map.Entry<K, SizedValue> entry = lruIter.next();
229229
if (!shouldInvalidateEldestEntry(entry.getKey(), entry.getValue().value, now)) {
230230
break; // Violates some constraint like minimum age so stop our cleanup
231231
}
232232
lruIter.remove();
233-
// eviction listener will update the estimatedSizeBytes
234-
evictionListener.onEviction(entry.getKey(), entry.getValue(), EvictionType.SIZE);
233+
// fireOnEviction will update the estimatedSizeBytes
234+
fireOnEviction(entry.getKey(), entry.getValue(), EvictionType.SIZE);
235235
removedAnyUnexpired = true;
236236
}
237237
return removedAnyUnexpired;
@@ -270,7 +270,7 @@ private boolean cleanupExpiredEntries(int maxExpiredEntries, long now) {
270270
Map.Entry<K, SizedValue> entry = lruIter.next();
271271
if (isExpired(entry.getKey(), entry.getValue().value, now)) {
272272
lruIter.remove();
273-
evictionListener.onEviction(entry.getKey(), entry.getValue(), EvictionType.EXPIRED);
273+
fireOnEviction(entry.getKey(), entry.getValue(), EvictionType.EXPIRED);
274274
removedAny = true;
275275
maxExpiredEntries--;
276276
}
@@ -283,21 +283,10 @@ public final void close() {
283283
invalidateAll();
284284
}
285285

286-
/** A {@link EvictionListener} keeps track of size. */
287-
private final class SizeHandlingEvictionListener implements EvictionListener<K, SizedValue> {
288-
289-
private final EvictionListener<K, V> delegate;
290-
291-
SizeHandlingEvictionListener(@Nullable EvictionListener<K, V> delegate) {
292-
this.delegate = delegate;
293-
}
294-
295-
@Override
296-
public void onEviction(K key, SizedValue value, EvictionType cause) {
297-
estimatedSizeBytes -= value.size;
298-
if (delegate != null) {
299-
delegate.onEviction(key, value.value, cause);
300-
}
286+
private void fireOnEviction(K key, SizedValue value, EvictionType cause) {
287+
estimatedSizeBytes -= value.size;
288+
if (evictionListener != null) {
289+
evictionListener.onEviction(key, value.value, cause);
301290
}
302291
}
303292

util/src/main/java/io/grpc/util/OutlierDetectionLoadBalancer.java

Lines changed: 61 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public Status acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
142142
// If outlier detection is actually configured, start a timer that will periodically try to
143143
// detect outliers.
144144
if (config.outlierDetectionEnabled()) {
145-
Long initialDelayNanos;
145+
long initialDelayNanos;
146146

147147
if (detectionTimerStartNanos == null) {
148148
// On the first go we use the configured interval.
@@ -723,7 +723,7 @@ void swapCounters() {
723723
* that don't have ejected subchannels and uneject ones that have spent the maximum ejection
724724
* time allowed.
725725
*/
726-
void maybeUnejectOutliers(Long detectionTimerStartNanos) {
726+
void maybeUnejectOutliers(long detectionTimerStartNanos) {
727727
for (EndpointTracker tracker : trackerMap.values()) {
728728
if (!tracker.subchannelsEjected()) {
729729
tracker.decrementEjectionTimeMultiplier();
@@ -951,64 +951,54 @@ private static boolean hasSingleAddress(List<EquivalentAddressGroup> addressGrou
951951
*/
952952
public static final class OutlierDetectionLoadBalancerConfig {
953953

954-
public final Long intervalNanos;
955-
public final Long baseEjectionTimeNanos;
956-
public final Long maxEjectionTimeNanos;
957-
public final Integer maxEjectionPercent;
954+
public final long intervalNanos;
955+
public final long baseEjectionTimeNanos;
956+
public final long maxEjectionTimeNanos;
957+
public final int maxEjectionPercent;
958958
public final SuccessRateEjection successRateEjection;
959959
public final FailurePercentageEjection failurePercentageEjection;
960960
public final Object childConfig;
961961

962-
private OutlierDetectionLoadBalancerConfig(Long intervalNanos,
963-
Long baseEjectionTimeNanos,
964-
Long maxEjectionTimeNanos,
965-
Integer maxEjectionPercent,
966-
SuccessRateEjection successRateEjection,
967-
FailurePercentageEjection failurePercentageEjection,
968-
Object childConfig) {
969-
this.intervalNanos = intervalNanos;
970-
this.baseEjectionTimeNanos = baseEjectionTimeNanos;
971-
this.maxEjectionTimeNanos = maxEjectionTimeNanos;
972-
this.maxEjectionPercent = maxEjectionPercent;
973-
this.successRateEjection = successRateEjection;
974-
this.failurePercentageEjection = failurePercentageEjection;
975-
this.childConfig = childConfig;
962+
private OutlierDetectionLoadBalancerConfig(Builder builder) {
963+
this.intervalNanos = builder.intervalNanos;
964+
this.baseEjectionTimeNanos = builder.baseEjectionTimeNanos;
965+
this.maxEjectionTimeNanos = builder.maxEjectionTimeNanos;
966+
this.maxEjectionPercent = builder.maxEjectionPercent;
967+
this.successRateEjection = builder.successRateEjection;
968+
this.failurePercentageEjection = builder.failurePercentageEjection;
969+
this.childConfig = builder.childConfig;
976970
}
977971

978972
/** Builds a new {@link OutlierDetectionLoadBalancerConfig}. */
979973
public static class Builder {
980-
Long intervalNanos = 10_000_000_000L; // 10s
981-
Long baseEjectionTimeNanos = 30_000_000_000L; // 30s
982-
Long maxEjectionTimeNanos = 300_000_000_000L; // 300s
983-
Integer maxEjectionPercent = 10;
974+
long intervalNanos = 10_000_000_000L; // 10s
975+
long baseEjectionTimeNanos = 30_000_000_000L; // 30s
976+
long maxEjectionTimeNanos = 300_000_000_000L; // 300s
977+
int maxEjectionPercent = 10;
984978
SuccessRateEjection successRateEjection;
985979
FailurePercentageEjection failurePercentageEjection;
986980
Object childConfig;
987981

988982
/** The interval between outlier detection sweeps. */
989-
public Builder setIntervalNanos(Long intervalNanos) {
990-
checkArgument(intervalNanos != null);
983+
public Builder setIntervalNanos(long intervalNanos) {
991984
this.intervalNanos = intervalNanos;
992985
return this;
993986
}
994987

995988
/** The base time an address is ejected for. */
996-
public Builder setBaseEjectionTimeNanos(Long baseEjectionTimeNanos) {
997-
checkArgument(baseEjectionTimeNanos != null);
989+
public Builder setBaseEjectionTimeNanos(long baseEjectionTimeNanos) {
998990
this.baseEjectionTimeNanos = baseEjectionTimeNanos;
999991
return this;
1000992
}
1001993

1002994
/** The longest time an address can be ejected. */
1003-
public Builder setMaxEjectionTimeNanos(Long maxEjectionTimeNanos) {
1004-
checkArgument(maxEjectionTimeNanos != null);
995+
public Builder setMaxEjectionTimeNanos(long maxEjectionTimeNanos) {
1005996
this.maxEjectionTimeNanos = maxEjectionTimeNanos;
1006997
return this;
1007998
}
1008999

10091000
/** The algorithm agnostic maximum percentage of addresses that can be ejected. */
1010-
public Builder setMaxEjectionPercent(Integer maxEjectionPercent) {
1011-
checkArgument(maxEjectionPercent != null);
1001+
public Builder setMaxEjectionPercent(int maxEjectionPercent) {
10121002
this.maxEjectionPercent = maxEjectionPercent;
10131003
return this;
10141004
}
@@ -1040,118 +1030,106 @@ public Builder setChildConfig(Object childConfig) {
10401030
/** Builds a new instance of {@link OutlierDetectionLoadBalancerConfig}. */
10411031
public OutlierDetectionLoadBalancerConfig build() {
10421032
checkState(childConfig != null);
1043-
return new OutlierDetectionLoadBalancerConfig(intervalNanos, baseEjectionTimeNanos,
1044-
maxEjectionTimeNanos, maxEjectionPercent, successRateEjection,
1045-
failurePercentageEjection, childConfig);
1033+
return new OutlierDetectionLoadBalancerConfig(this);
10461034
}
10471035
}
10481036

10491037
/** The configuration for success rate ejection. */
10501038
public static class SuccessRateEjection {
10511039

1052-
public final Integer stdevFactor;
1053-
public final Integer enforcementPercentage;
1054-
public final Integer minimumHosts;
1055-
public final Integer requestVolume;
1056-
1057-
SuccessRateEjection(Integer stdevFactor, Integer enforcementPercentage, Integer minimumHosts,
1058-
Integer requestVolume) {
1059-
this.stdevFactor = stdevFactor;
1060-
this.enforcementPercentage = enforcementPercentage;
1061-
this.minimumHosts = minimumHosts;
1062-
this.requestVolume = requestVolume;
1040+
public final int stdevFactor;
1041+
public final int enforcementPercentage;
1042+
public final int minimumHosts;
1043+
public final int requestVolume;
1044+
1045+
SuccessRateEjection(Builder builder) {
1046+
this.stdevFactor = builder.stdevFactor;
1047+
this.enforcementPercentage = builder.enforcementPercentage;
1048+
this.minimumHosts = builder.minimumHosts;
1049+
this.requestVolume = builder.requestVolume;
10631050
}
10641051

10651052
/** Builds new instances of {@link SuccessRateEjection}. */
10661053
public static final class Builder {
10671054

1068-
Integer stdevFactor = 1900;
1069-
Integer enforcementPercentage = 100;
1070-
Integer minimumHosts = 5;
1071-
Integer requestVolume = 100;
1055+
int stdevFactor = 1900;
1056+
int enforcementPercentage = 100;
1057+
int minimumHosts = 5;
1058+
int requestVolume = 100;
10721059

10731060
/** The product of this and the standard deviation of success rates determine the ejection
10741061
* threshold.
10751062
*/
1076-
public Builder setStdevFactor(Integer stdevFactor) {
1077-
checkArgument(stdevFactor != null);
1063+
public Builder setStdevFactor(int stdevFactor) {
10781064
this.stdevFactor = stdevFactor;
10791065
return this;
10801066
}
10811067

10821068
/** Only eject this percentage of outliers. */
1083-
public Builder setEnforcementPercentage(Integer enforcementPercentage) {
1084-
checkArgument(enforcementPercentage != null);
1069+
public Builder setEnforcementPercentage(int enforcementPercentage) {
10851070
checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100);
10861071
this.enforcementPercentage = enforcementPercentage;
10871072
return this;
10881073
}
10891074

10901075
/** The minimum amount of hosts needed for success rate ejection. */
1091-
public Builder setMinimumHosts(Integer minimumHosts) {
1092-
checkArgument(minimumHosts != null);
1076+
public Builder setMinimumHosts(int minimumHosts) {
10931077
checkArgument(minimumHosts >= 0);
10941078
this.minimumHosts = minimumHosts;
10951079
return this;
10961080
}
10971081

10981082
/** The minimum address request volume to be considered for success rate ejection. */
1099-
public Builder setRequestVolume(Integer requestVolume) {
1100-
checkArgument(requestVolume != null);
1083+
public Builder setRequestVolume(int requestVolume) {
11011084
checkArgument(requestVolume >= 0);
11021085
this.requestVolume = requestVolume;
11031086
return this;
11041087
}
11051088

11061089
/** Builds a new instance of {@link SuccessRateEjection}. */
11071090
public SuccessRateEjection build() {
1108-
return new SuccessRateEjection(stdevFactor, enforcementPercentage, minimumHosts,
1109-
requestVolume);
1091+
return new SuccessRateEjection(this);
11101092
}
11111093
}
11121094
}
11131095

11141096
/** The configuration for failure percentage ejection. */
11151097
public static class FailurePercentageEjection {
1116-
public final Integer threshold;
1117-
public final Integer enforcementPercentage;
1118-
public final Integer minimumHosts;
1119-
public final Integer requestVolume;
1120-
1121-
FailurePercentageEjection(Integer threshold, Integer enforcementPercentage,
1122-
Integer minimumHosts, Integer requestVolume) {
1123-
this.threshold = threshold;
1124-
this.enforcementPercentage = enforcementPercentage;
1125-
this.minimumHosts = minimumHosts;
1126-
this.requestVolume = requestVolume;
1098+
public final int threshold;
1099+
public final int enforcementPercentage;
1100+
public final int minimumHosts;
1101+
public final int requestVolume;
1102+
1103+
FailurePercentageEjection(Builder builder) {
1104+
this.threshold = builder.threshold;
1105+
this.enforcementPercentage = builder.enforcementPercentage;
1106+
this.minimumHosts = builder.minimumHosts;
1107+
this.requestVolume = builder.requestVolume;
11271108
}
11281109

11291110
/** For building new {@link FailurePercentageEjection} instances. */
11301111
public static class Builder {
1131-
Integer threshold = 85;
1132-
Integer enforcementPercentage = 100;
1133-
Integer minimumHosts = 5;
1134-
Integer requestVolume = 50;
1112+
int threshold = 85;
1113+
int enforcementPercentage = 100;
1114+
int minimumHosts = 5;
1115+
int requestVolume = 50;
11351116

11361117
/** The failure percentage that will result in an address being considered an outlier. */
1137-
public Builder setThreshold(Integer threshold) {
1138-
checkArgument(threshold != null);
1118+
public Builder setThreshold(int threshold) {
11391119
checkArgument(threshold >= 0 && threshold <= 100);
11401120
this.threshold = threshold;
11411121
return this;
11421122
}
11431123

11441124
/** Only eject this percentage of outliers. */
1145-
public Builder setEnforcementPercentage(Integer enforcementPercentage) {
1146-
checkArgument(enforcementPercentage != null);
1125+
public Builder setEnforcementPercentage(int enforcementPercentage) {
11471126
checkArgument(enforcementPercentage >= 0 && enforcementPercentage <= 100);
11481127
this.enforcementPercentage = enforcementPercentage;
11491128
return this;
11501129
}
11511130

11521131
/** The minimum amount of host for failure percentage ejection to be enabled. */
1153-
public Builder setMinimumHosts(Integer minimumHosts) {
1154-
checkArgument(minimumHosts != null);
1132+
public Builder setMinimumHosts(int minimumHosts) {
11551133
checkArgument(minimumHosts >= 0);
11561134
this.minimumHosts = minimumHosts;
11571135
return this;
@@ -1161,17 +1139,15 @@ public Builder setMinimumHosts(Integer minimumHosts) {
11611139
* The request volume required for an address to be considered for failure percentage
11621140
* ejection.
11631141
*/
1164-
public Builder setRequestVolume(Integer requestVolume) {
1165-
checkArgument(requestVolume != null);
1142+
public Builder setRequestVolume(int requestVolume) {
11661143
checkArgument(requestVolume >= 0);
11671144
this.requestVolume = requestVolume;
11681145
return this;
11691146
}
11701147

11711148
/** Builds a new instance of {@link FailurePercentageEjection}. */
11721149
public FailurePercentageEjection build() {
1173-
return new FailurePercentageEjection(threshold, enforcementPercentage, minimumHosts,
1174-
requestVolume);
1150+
return new FailurePercentageEjection(this);
11751151
}
11761152
}
11771153
}

0 commit comments

Comments
 (0)