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:
parent
481f8a9a07
commit
34379887b4
|
@ -42,17 +42,12 @@ public class DiffableStringMap extends AbstractMap<String, String> implements Di
|
||||||
private final Map<String, String> innerMap;
|
private final Map<String, String> innerMap;
|
||||||
|
|
||||||
DiffableStringMap(final Map<String, String> map) {
|
DiffableStringMap(final Map<String, String> map) {
|
||||||
this.innerMap = map;
|
this.innerMap = Collections.unmodifiableMap(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
DiffableStringMap(final StreamInput in) throws IOException {
|
DiffableStringMap(final StreamInput in) throws IOException {
|
||||||
this.innerMap = (Map<String, String>) (Map) in.readMap();
|
this((Map<String, String>) (Map) in.readMap());
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String put(String key, String value) {
|
|
||||||
return innerMap.put(key, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,32 +70,6 @@ public class DiffableStringMap extends AbstractMap<String, String> implements Di
|
||||||
return new DiffableStringMapDiff(in);
|
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.
|
* Represents differences between two DiffableStringMaps.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -466,7 +466,7 @@ public class IndexMetaData implements Diffable<IndexMetaData>, ToXContentFragmen
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getCustomData(final String key) {
|
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() {
|
public ImmutableOpenIntMap<Set<String>> getInSyncAllocationIds() {
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class DiffableStringMapTests extends ESTestCase {
|
||||||
m.put("2", "2");
|
m.put("2", "2");
|
||||||
m.put("3", "3");
|
m.put("3", "3");
|
||||||
DiffableStringMap dsm = new DiffableStringMap(m);
|
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++) {
|
for (int i = 0; i < randomIntBetween(5, 50); i++) {
|
||||||
if (randomBoolean() && expected.size() > 1) {
|
if (randomBoolean() && expected.size() > 1) {
|
||||||
|
@ -80,7 +80,7 @@ public class DiffableStringMapTests extends ESTestCase {
|
||||||
} else {
|
} else {
|
||||||
expected.put(randomAlphaOfLength(2), randomAlphaOfLength(4));
|
expected.put(randomAlphaOfLength(2), randomAlphaOfLength(4));
|
||||||
}
|
}
|
||||||
dsm = expected.diff(dsm).apply(dsm);
|
dsm = new DiffableStringMap(expected).diff(dsm).apply(dsm);
|
||||||
}
|
}
|
||||||
assertThat(expected, equalTo(dsm));
|
assertThat(expected, equalTo(dsm));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue