[
https://issues.apache.org/jira/browse/COLLECTIONS-770?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17227715#comment-17227715
]
Bruno P. Kinoshita commented on COLLECTIONS-770:
------------------------------------------------
Reproduced the issue in a unit test. I suspect it's related to how the
SetUtils#union method creates a new SetView, with an iterator. Each iterator
appears to be chained by another iterator, that's used in the toString method.
Not sure if there's an easy fix.
> ToString method is unresponsive after multiple SetUtils union calls
> -------------------------------------------------------------------
>
> Key: COLLECTIONS-770
> URL: https://issues.apache.org/jira/browse/COLLECTIONS-770
> Project: Commons Collections
> Issue Type: Bug
> Affects Versions: 4.4
> Reporter: Thomas Bürli
> Priority: Minor
> Attachments: SetUtilsTest.java, stackdump.txt
>
>
> I had the following code and my application stopped responsing as soon the
> number of names for a userId got too big.
> {code:java}
> Map<String, Set<String>> stringMap = new TreeMap<>();
> for (String name : names) {
> for (String userId : userIds) {
> stringMap.merge(userId, Collections.singleton(name),
> SetUtils::union);
> }
> }
> {code}
> I did some debugging and it occurs when the toString method of one the set is
> called. It looks like the issues is with the iterator of "SetUtils.SetView".
> Here just the method I used to create test sets and in the attachment you
> find the full tests class and a stack dump. The execution time is growing
> exponentially with the numbers of times the SetUtils.union is called. So for
> 29 elements it took 16 seconds to execute toString, and with 30 it took 32
> seconds.
> {code:java}
> @Test
> void setWith20Elements() {
> assertTimeout(ofSeconds(2), () -> createSet(30).toString());
> }
> Set<String> createSet(int number) {
> List<String> inputs = new ArrayList<>();
> for (int i = 0; i < number; i++) {
> inputs.add("Test"+ i);
> }
> Set<String> testSet = Collections.singleton("String1");
> for (String element : inputs) {
> Set<String> part = Collections.singleton(element);
> testSet = SetUtils.union(testSet,part);
> }
> return testSet;
> }
> {code}
> Thanks for your support
--
This message was sent by Atlassian Jira
(v8.3.4#803005)