Chris M. Hostetter created SOLR-16751:
-----------------------------------------
Summary: ClusterState.collectionFromObjects() stores copy of
shards in DocCollection.getProperties()
Key: SOLR-16751
URL: https://issues.apache.org/jira/browse/SOLR-16751
Project: Solr
Issue Type: Bug
Security Level: Public (Default Security Level. Issues are Public)
Reporter: Chris M. Hostetter
The way a {{DocCollection}} is created by
{{ClusterState.collectionFromObjects()}} ( ie: {{ClusterState}} is read from a
JSON payload – such as {{state.json}} ) a copy of the original {{"shards"}}
mappings is left in the {{props}} argument (where it's carried around in
{{DocCollection.getProperties()}} ) in addition to the (correct) {{slices}}
argument (which is used to build {{DocCollection.getSlices()}} )
This is due to the following lines of code, which AFAICT should have been done
in reverse order...
{code:java}
props = new HashMap<>(objs);
objs.remove(CollectionStateProps.SHARDS);
{code}
This bug seems to have existed for a while, but seems to have slipped under the
radar since nothing has any reason to be looking for a {{"shards"}} key in
{{DocCollection.getProperties()}} .
Recently however, noble committed 2ac7ed29563a33d9f9a31737996a1d4cfb0fca0d
which changed the serialization logic for {{DocCollection}} to eliminate a
temporary map...
{noformat}
- LinkedHashMap<String, Object> all =
CollectionUtil.newLinkedHashMap(slices.size() + 1);
- all.putAll(propMap);
- all.put(CollectionStateProps.SHARDS, slices);
- jsonWriter.write(all);
+ jsonWriter.write(
+ (MapWriter)
+ ew -> {
+ propMap.forEach(ew.getBiConsumer());
+ ew.put(CollectionStateProps.SHARDS, slices);
+ });
{noformat}
... so now, instead of an {{all}} Map where the {{"shards"}} key from
{{propMap}} being (correctly) overridden by {{slices}} and then serialized, now
the JSON output contains two entries with the {{"shards"}} key.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]