[ https://issues.apache.org/jira/browse/CASSANDRA-9519?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14620367#comment-14620367 ]
Sylvain Lebresne commented on CASSANDRA-9519: --------------------------------------------- bq. I think this should be enough to fix it. If it is, I don't understand why, so you might want to elaborate what the problem is and why that fixes it. What I personally think the problem is is that while CASSANDRA-8448 made the {{scores}} map copy-on-write, we're still accessing the volatile/shared {{scores}} reference in {{compareEndpoints}}, so successive calls to that method may return different results for the same inputs (because scores have changed) and to the best of my knowledge that's the "contract" that {{Collections.sort}} bitch about breaking. In other words, we need to ensure that during a given call to {{Collections.sort}}, the result of {{compareEndpoints}} should be stable (return the same output for the same inputs). In other words, all calls to {{compareEndpoints}} used by a call to {{sortByProximity}} should use the same scores. Meaning that we should grabe a reference to the {{scores}} map at the beginning of {{sortByProximity}} and only use that. I've pushed a patch doing that [here|https://github.com/pcmanus/cassandra/commits/9519]. It's worth noting that we can't do that with the {{compareEndpoints}} signature exposed by {{IEndpointSnitch}} since we need to pass it the (immutable) {{scores}} map. So the public {{DynamicEndpointSnitch.compareEndpoints()}} method now throw an {{UnsupportedOperationException}}. Which, is worth noting, could be a problem if custom snitch implementation are wrapping the dynamic snitch and use that {{compareEndpoints}} method (or if something wrap a dynamic snitch with a dynamic snitch, but I think we're cool with refusing that). I don't see why you'd wrap the dynamic snitch so it's probably fine, but worth mentioning nonetheless. > CASSANDRA-8448 Doesn't seem to be fixed > --------------------------------------- > > Key: CASSANDRA-9519 > URL: https://issues.apache.org/jira/browse/CASSANDRA-9519 > Project: Cassandra > Issue Type: Bug > Components: Core > Reporter: Jeremiah Jordan > Fix For: 2.1.x, 2.2.x > > Attachments: 9519.txt > > > Still seeing the "Comparison method violates its general contract!" in 2.1.5 > {code} > java.lang.IllegalArgumentException: Comparison method violates its general > contract! > at java.util.TimSort.mergeHi(TimSort.java:895) ~[na:1.8.0_45] > at java.util.TimSort.mergeAt(TimSort.java:512) ~[na:1.8.0_45] > at java.util.TimSort.mergeCollapse(TimSort.java:437) ~[na:1.8.0_45] > at java.util.TimSort.sort(TimSort.java:241) ~[na:1.8.0_45] > at java.util.Arrays.sort(Arrays.java:1512) ~[na:1.8.0_45] > at java.util.ArrayList.sort(ArrayList.java:1454) ~[na:1.8.0_45] > at java.util.Collections.sort(Collections.java:175) ~[na:1.8.0_45] > at > org.apache.cassandra.locator.AbstractEndpointSnitch.sortByProximity(AbstractEndpointSnitch.java:49) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.locator.DynamicEndpointSnitch.sortByProximityWithScore(DynamicEndpointSnitch.java:158) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.locator.DynamicEndpointSnitch.sortByProximityWithBadness(DynamicEndpointSnitch.java:187) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.locator.DynamicEndpointSnitch.sortByProximity(DynamicEndpointSnitch.java:152) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.service.StorageProxy.getLiveSortedEndpoints(StorageProxy.java:1530) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.service.StorageProxy.getRangeSlice(StorageProxy.java:1688) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:256) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:209) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:63) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:238) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:260) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > at > org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:272) > ~[cassandra-all-2.1.5.469.jar:2.1.5.469] > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)