Skip to content

Commit 4b58827

Browse files
committed
Make DiscoveryNodeRole into a value object (#43257)
Adds `equals()` and `hashcode()` methods to `DiscoveryNodeRole` to compare these objects' values for equality, and adds a field to allow us to distinguish unknown roles from known ones with the same name and abbreviation, for clearer test failures. Relates #43175
1 parent 3effe26 commit 4b58827

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

server/src/main/java/org/elasticsearch/cluster/node/DiscoveryNodeRole.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,48 @@ public final String roleNameAbbreviation() {
5656
return roleNameAbbreviation;
5757
}
5858

59+
private final boolean isKnownRole;
60+
61+
/**
62+
* Whether this role is known by this node, or is an {@link DiscoveryNodeRole.UnknownRole}.
63+
*/
64+
public final boolean isKnownRole() {
65+
return isKnownRole;
66+
}
67+
5968
protected DiscoveryNodeRole(final String roleName, final String roleNameAbbreviation) {
69+
this(true, roleName, roleNameAbbreviation);
70+
}
71+
72+
private DiscoveryNodeRole(final boolean isKnownRole, final String roleName, final String roleNameAbbreviation) {
73+
this.isKnownRole = isKnownRole;
6074
this.roleName = Objects.requireNonNull(roleName);
6175
this.roleNameAbbreviation = Objects.requireNonNull(roleNameAbbreviation);
6276
}
6377

6478
protected abstract Setting<Boolean> roleSetting();
6579

6680
@Override
67-
public String toString() {
81+
public final boolean equals(Object o) {
82+
if (this == o) return true;
83+
if (o == null || getClass() != o.getClass()) return false;
84+
DiscoveryNodeRole that = (DiscoveryNodeRole) o;
85+
return roleName.equals(that.roleName) &&
86+
roleNameAbbreviation.equals(that.roleNameAbbreviation) &&
87+
isKnownRole == that.isKnownRole;
88+
}
89+
90+
@Override
91+
public final int hashCode() {
92+
return Objects.hash(isKnownRole, roleName(), roleNameAbbreviation());
93+
}
94+
95+
@Override
96+
public final String toString() {
6897
return "DiscoveryNodeRole{" +
6998
"roleName='" + roleName + '\'' +
7099
", roleNameAbbreviation='" + roleNameAbbreviation + '\'' +
100+
(isKnownRole ? "" : ", isKnownRole=false") +
71101
'}';
72102
}
73103

@@ -126,7 +156,7 @@ static class UnknownRole extends DiscoveryNodeRole {
126156
* @param roleNameAbbreviation the role name abbreviation
127157
*/
128158
UnknownRole(final String roleName, final String roleNameAbbreviation) {
129-
super(roleName, roleNameAbbreviation);
159+
super(false, roleName, roleNameAbbreviation);
130160
}
131161

132162
@Override

server/src/test/java/org/elasticsearch/cluster/node/DiscoveryNodeRoleTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.elasticsearch.common.settings.Setting;
2323
import org.elasticsearch.test.ESTestCase;
24+
import org.elasticsearch.test.EqualsHashCodeTestUtils;
2425

2526
import java.util.Arrays;
2627
import java.util.HashSet;
@@ -76,4 +77,25 @@ protected Setting<Boolean> roleSetting() {
7677
assertThat(e, hasToString(containsString("Duplicate key")));
7778
}
7879

80+
public void testDiscoveryNodeRoleEqualsHashCode() {
81+
EqualsHashCodeTestUtils.checkEqualsAndHashCode(new DiscoveryNodeRole.UnknownRole(randomAlphaOfLength(10), randomAlphaOfLength(1)),
82+
r -> new DiscoveryNodeRole.UnknownRole(r.roleName(), r.roleNameAbbreviation()),
83+
r -> {
84+
if (randomBoolean()) {
85+
return new DiscoveryNodeRole.UnknownRole(randomAlphaOfLength(21 - r.roleName().length()), r.roleNameAbbreviation());
86+
} else {
87+
return new DiscoveryNodeRole.UnknownRole(r.roleName(), randomAlphaOfLength(3 - r.roleNameAbbreviation().length()));
88+
}
89+
});
90+
91+
}
92+
93+
public void testUnknownRoleIsDistinctFromKnownRoles() {
94+
for (DiscoveryNodeRole buildInRole : DiscoveryNodeRole.BUILT_IN_ROLES) {
95+
final DiscoveryNodeRole.UnknownRole unknownDataRole
96+
= new DiscoveryNodeRole.UnknownRole(buildInRole.roleName(), buildInRole.roleNameAbbreviation());
97+
assertNotEquals(buildInRole, unknownDataRole);
98+
assertNotEquals(buildInRole.toString(), unknownDataRole.toString());
99+
}
100+
}
79101
}

0 commit comments

Comments
 (0)