xds: Implement equals in RingHashConfig
Lack of equals causes cluster_resolver to consider every update a
different configuration and restart itself.
b/430347751
diff --git a/xds/src/main/java/io/grpc/xds/RingHashLoadBalancer.java b/xds/src/main/java/io/grpc/xds/RingHashLoadBalancer.java
index 4f314e5..96ce5b9 100644
--- a/xds/src/main/java/io/grpc/xds/RingHashLoadBalancer.java
+++ b/xds/src/main/java/io/grpc/xds/RingHashLoadBalancer.java
@@ -51,6 +51,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
@@ -524,6 +525,22 @@
}
@Override
+ public boolean equals(Object o) {
+ if (!(o instanceof RingHashConfig)) {
+ return false;
+ }
+ RingHashConfig that = (RingHashConfig) o;
+ return this.minRingSize == that.minRingSize
+ && this.maxRingSize == that.maxRingSize
+ && Objects.equals(this.requestHashHeader, that.requestHashHeader);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(minRingSize, maxRingSize, requestHashHeader);
+ }
+
+ @Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("minRingSize", minRingSize)
diff --git a/xds/src/test/java/io/grpc/xds/RingHashLoadBalancerTest.java b/xds/src/test/java/io/grpc/xds/RingHashLoadBalancerTest.java
index f27cb77..fc5f211 100644
--- a/xds/src/test/java/io/grpc/xds/RingHashLoadBalancerTest.java
+++ b/xds/src/test/java/io/grpc/xds/RingHashLoadBalancerTest.java
@@ -42,6 +42,7 @@
import com.google.common.collect.Iterables;
import com.google.common.primitives.UnsignedInteger;
+import com.google.common.testing.EqualsTester;
import io.grpc.Attributes;
import io.grpc.CallOptions;
import io.grpc.ConnectivityState;
@@ -1113,6 +1114,19 @@
assertThat(picks).containsExactly(subchannel1);
}
+ @Test
+ public void config_equalsTester() {
+ new EqualsTester()
+ .addEqualityGroup(
+ new RingHashConfig(1, 2, "headerA"),
+ new RingHashConfig(1, 2, "headerA"))
+ .addEqualityGroup(new RingHashConfig(1, 1, "headerA"))
+ .addEqualityGroup(new RingHashConfig(2, 2, "headerA"))
+ .addEqualityGroup(new RingHashConfig(1, 2, "headerB"))
+ .addEqualityGroup(new RingHashConfig(1, 2, ""))
+ .testEquals();
+ }
+
private List<Subchannel> initializeLbSubchannels(RingHashConfig config,
List<EquivalentAddressGroup> servers, InitializationFlags... initFlags) {