]
William Burns updated ISPN-7656:
--------------------------------
Status: Pull Request Sent (was: Coding In Progress)
Git Pull Request:
DefaultDataContainer.entrySet().stream().toArray(Object[]::new) may
fail
------------------------------------------------------------------------
Key: ISPN-7656
URL:
https://issues.jboss.org/browse/ISPN-7656
Project: Infinispan
Issue Type: Bug
Components: Core
Reporter: Radim Vansa
Assignee: William Burns
Fix For: 9.0.0.Final
When the default Spliterator estimates size of the array, it calls
{{DefaultDataContainer.EntrySet#size()}} that returns directly the size of container
(including expired entries). Then the container is iterated using
{{ImmutableEntryIterator}} which excludes expired entries by default, and this may return
less elements than the original size() provided. That causes failure like this:
{code}
java.lang.IllegalStateException: End size 1 is less than fixed size 2
at java.util.stream.Nodes$FixedNodeBuilder.end(Nodes.java:1232)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
{code}
Note that this can also happen without expiration upon concurrent modification. We have
to adjust the characteristics (remove {{#SIZED}}) of provided spliterators.