Martin Weiler created DROOLS-2347:
-------------------------------------
Summary: ProtobufOutputMarshaller.orderFacts causes a "Comparison method
violates its general contract" error
Key: DROOLS-2347
URL:
https://issues.jboss.org/browse/DROOLS-2347
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 7.6.0.Final
Reporter: Martin Weiler
Assignee: Mario Fusco
When marshalling kieSession in production (long running kieSession with a lot of fact
insertion), we encountered the following error :
{noformat}
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:777)
at java.util.TimSort.mergeAt(TimSort.java:514)
at java.util.TimSort.mergeCollapse(TimSort.java:439)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1438)
at
org.drools.core.marshalling.impl.ProtobufOutputMarshaller.orderFacts(ProtobufOutputMarshaller.java:776)
at
org.drools.core.marshalling.impl.ProtobufOutputMarshaller.writeFactHandles(ProtobufOutputMarshaller.java:707)
at
org.drools.core.marshalling.impl.ProtobufOutputMarshaller.serializeSession(ProtobufOutputMarshaller.java:176)
at
org.drools.core.marshalling.impl.ProtobufOutputMarshaller.writeSession(ProtobufOutputMarshaller.java:120)
at
org.drools.core.marshalling.impl.ProtobufMarshaller.marshall(ProtobufMarshaller.java:164)
at
org.drools.core.marshalling.impl.ProtobufMarshaller.marshall(ProtobufMarshaller.java:148)
{noformat}
Indeed, the orderFacts method in ProtobufoutputMarshaller uses a HandleSorter as
comparator, which returns the result of o1.getId() - o2.getId() where o1 and o2 are
InternalFactHandle.
Since the id of InternalFactHandle is an int, this comparator can cause "Comparison
method violates its general contract!" IllegalArgumentException because
Integer.MAX_INT + 1 < 0.
The comparator should return the result of Integer.compare(o1.getId(), o2.getId())
The root cause is that InternalFactHandle.getId() is an int and should be a long for long
running kieSession.
This id is generated by the FactHandleFactory (in AbstractFactHandleFactory) and is an
AtomicInteger incremented at each fact creation.
With long running kieSession a lot of fact handles can be created (inserted in memory or
with "from") so this id can overflow Integer.MAX_INT and become negative,
causing this issue when ordering.
--
This message was sent by Atlassian JIRA
(v7.5.0#75005)