Ensure MapperService#getAllMetaFields elements order is deterministic (#36739)
MapperService#getAllMetaFields returns an array, which is created out of an `ObjectHashSet`. Such set does not guarantee deterministic hash ordering. The array returned by its toArray may be sorted differently at each run. This caused some repeatability issues in our tests (see #29080) as we pick random fields from the array of possible metadata fields, but that won't be repeatable if the input array is sorted differently at every run. Once setting the tests seed, hppc picks that up and the sorting is deterministic, but failures don't repeat with the seed that gets printed out originally (as a seed was not originally set). See also https://issues.carrot2.org/projects/HPPC/issues/HPPC-173. With this commit, we simply create a static sorted array that is used for `getAllMetaFields`. The change is in production code but really affects only testing as the only production usage of this method was to iterate through all values when parsing fields in the high-level REST client code. Anyways, this seems like a good change as returning an array would imply that it's deterministically sorted.
This commit is contained in:
parent
00521a5b36
commit
8a412c6a26
|
@ -109,10 +109,11 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
|||
|
||||
//TODO this needs to be cleaned up: _timestamp and _ttl are not supported anymore, _field_names, _seq_no, _version and _source are
|
||||
//also missing, not sure if on purpose. See IndicesModule#getMetadataMappers
|
||||
private static ObjectHashSet<String> META_FIELDS = ObjectHashSet.from(
|
||||
"_id", "_type", "_routing", "_index",
|
||||
"_size", "_timestamp", "_ttl", IgnoredFieldMapper.NAME
|
||||
);
|
||||
private static final String[] SORTED_META_FIELDS = new String[]{
|
||||
"_id", IgnoredFieldMapper.NAME, "_index", "_routing", "_size", "_timestamp", "_ttl", "_type"
|
||||
};
|
||||
|
||||
private static final ObjectHashSet<String> META_FIELDS = ObjectHashSet.from(SORTED_META_FIELDS);
|
||||
|
||||
private static final DeprecationLogger deprecationLogger = new DeprecationLogger(LogManager.getLogger(MapperService.class));
|
||||
|
||||
|
@ -762,7 +763,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
|||
}
|
||||
|
||||
public static String[] getAllMetaFields() {
|
||||
return META_FIELDS.toArray(String.class);
|
||||
return Arrays.copyOf(SORTED_META_FIELDS, SORTED_META_FIELDS.length);
|
||||
}
|
||||
|
||||
/** An analyzer wrapper that can lookup fields within the index mappings */
|
||||
|
@ -789,5 +790,4 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
|||
return defaultAnalyzer;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue