Make custom index metadata completely immutable (#33735)

Currently `IndexMetadata#getCustomData(...)` wraps the custom metadata
in an unmodifiable map, but in case there is no entry for the specified
key then a NPE is thrown by Collections.unmodifiableMap(...). This is not
ideal in case callers like to throw an exception with a specific message.
(like in the case for ccr to indicate that the follow index was not created
by the create_and_follow api and therefor incompatible as follow index)

I think making `DiffableStringMap` itself immutable is better then just wrapping
custom metadata with `Collections.unmodifiableMap(...)` in all methods that access it.

Also removed the `equals()`, `hashcode()` and to `toString()` methods of
`DiffableStringMap`, because `AbstractMap` already implements these methods.
This commit is contained in:
Martijn van Groningen 2018-09-17 07:51:34 +02:00 committed by GitHub
parent 481f8a9a07
commit 34379887b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 5 additions and 36 deletions

View File

@ -42,17 +42,12 @@ public class DiffableStringMap extends AbstractMap<String, String> implements Di
private final Map<String, String> innerMap;
DiffableStringMap(final Map<String, String> map) {
this.innerMap = map;
this.innerMap = Collections.unmodifiableMap(map);
}
@SuppressWarnings("unchecked")
DiffableStringMap(final StreamInput in) throws IOException {
this.innerMap = (Map<String, String>) (Map) in.readMap();
}
@Override
public String put(String key, String value) {
return innerMap.put(key, value);
this((Map<String, String>) (Map) in.readMap());
}
@Override
@ -75,32 +70,6 @@ public class DiffableStringMap extends AbstractMap<String, String> implements Di
return new DiffableStringMapDiff(in);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj instanceof DiffableStringMap) {
DiffableStringMap other = (DiffableStringMap) obj;
return innerMap.equals(other.innerMap);
} else if (obj instanceof Map) {
Map other = (Map) obj;
return innerMap.equals(other);
} else {
return false;
}
}
@Override
public int hashCode() {
return innerMap.hashCode();
}
@Override
public String toString() {
return "DiffableStringMap[" + innerMap.toString() + "]";
}
/**
* Represents differences between two DiffableStringMaps.
*/

View File

@ -466,7 +466,7 @@ public class IndexMetaData implements Diffable<IndexMetaData>, ToXContentFragmen
}
public Map<String, String> getCustomData(final String key) {
return Collections.unmodifiableMap(this.customData.get(key));
return this.customData.get(key);
}
public ImmutableOpenIntMap<Set<String>> getInSyncAllocationIds() {

View File

@ -70,7 +70,7 @@ public class DiffableStringMapTests extends ESTestCase {
m.put("2", "2");
m.put("3", "3");
DiffableStringMap dsm = new DiffableStringMap(m);
DiffableStringMap expected = new DiffableStringMap(m);
Map<String, String> expected = new HashMap<>(m);
for (int i = 0; i < randomIntBetween(5, 50); i++) {
if (randomBoolean() && expected.size() > 1) {
@ -80,7 +80,7 @@ public class DiffableStringMapTests extends ESTestCase {
} else {
expected.put(randomAlphaOfLength(2), randomAlphaOfLength(4));
}
dsm = expected.diff(dsm).apply(dsm);
dsm = new DiffableStringMap(expected).diff(dsm).apply(dsm);
}
assertThat(expected, equalTo(dsm));
}