Error "Comparison method violates its general contract!" with "mvn -P cargo.run"

Hi,

In one of my Hippo projects I keep running into the error “Comparison method violates its general contract!” at the end of the command “mvn -P cargo.run” on my local machine.
This is resulting in an error 500 with no repository found at vm//: when I try to visit the site at localhost.

Any idea where to start to look for… what might cause this error and how to solve this issue?

Here is the stack I get:

localhost-startStop-1 [RepositoryServlet.init:229] Error while setting up JCR repository:
javax.jcr.RepositoryException: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at org.hippoecm.repository.LocalHippoRepository.initialize(LocalHippoRepository.java:352)
at org.hippoecm.repository.LocalHippoRepository.create(LocalHippoRepository.java:140)
org.apache.catalina.core.StandardContext loadOnStartup
at org.hippoecm.repository.LocalHippoRepository.create(LocalHippoRepository.java:130)
SEVERE: Servlet [Repository] in web application [/cms] threw load() exception
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
javax.servlet.ServletException: RepositoryException: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.hippoecm.repository.RepositoryServlet.init(RepositoryServlet.java:230)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1227)
at org.hippoecm.repository.HippoRepositoryFactory.getHippoRepository(HippoRepositoryFactory.java:147)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1140)
at org.hippoecm.repository.RepositoryServlet.init(RepositoryServlet.java:189)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1027)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5038)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1227)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5348)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1140)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1027)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5038)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5348)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.lang.Thread.run(Thread.java:748)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
org.apache.catalina.startup.HostConfig deployWAR
at java.util.TimSort.mergeLo(TimSort.java:777)
at java.util.TimSort.mergeAt(TimSort.java:514)
Deployment of web application archive /Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/cms.war has finished in 23,850 ms
at java.util.TimSort.mergeCollapse(TimSort.java:441)
org.apache.catalina.startup.HostConfig deployDirectory
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1462)
at java.util.Collections.sort(Collections.java:177)
Deploying web application directory /Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/manager
at org.onehippo.repository.bootstrap.InitializationProcessorImpl.doProcessInitializeItems(InitializationProcessorImpl.java:175)
org.apache.catalina.startup.SetContextPropertiesRule begin
at org.onehippo.repository.bootstrap.InitializationProcessorImpl.processInitializeItems(InitializationProcessorImpl.java:93)
[SetContextPropertiesRule]{Context} Setting property ‘disableURLRewriting’ to ‘true’ did not find a matching property.
at org.hippoecm.repository.LocalHippoRepository.contentBootstrap(LocalHippoRepository.java:386)
at org.hippoecm.repository.LocalHippoRepository.initialize(LocalHippoRepository.java:329)
… 24 more
org.apache.jasper.servlet.TldScanner scanJars
At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
org.apache.catalina.startup.HostConfig deployDirectory
Deployment of web application directory /Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/manager has finished in 1,094 ms
org.apache.catalina.startup.HostConfig deployDirectory
Deploying web application directory /Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/host-manager
org.apache.catalina.startup.SetContextPropertiesRule begin
WARNING: [SetContextPropertiesRule]{Context} Setting property ‘disableURLRewriting’ to ‘true’ did not find a matching property.
org.apache.jasper.servlet.TldScanner scanJars
At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
org.apache.catalina.startup.HostConfig deployDirectory
Deployment of web application directory /Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/host-manager has finished in 884 ms
org.apache.coyote.AbstractProtocol start
Starting ProtocolHandler [“http-nio-8080”]
org.apache.coyote.AbstractProtocol start
Starting ProtocolHandler [“http-nio-8443”]
org.apache.coyote.AbstractProtocol start
Starting ProtocolHandler [“ajp-nio-8009”]
org.apache.catalina.startup.Catalina start
Server startup in 58168 ms
Tomcat 8.x started on port [8080]

Hmm strange… something wrong with list of InitializeItems it seems.
This is on 11 with XML, correct? On empty or on existing local storage?

Maybe you can get more information by starting up with log level to INFO of org.onehippo.repository.bootstrap.InitializationProcessorImpl and org.hippoecm.repository.LocalHippoRepository

HTH
Jeroen

Yes, it is still Hippo 11 - with XML bootstrap - and starting with an empty local storage.
I’ll try your suggestion tomorrow, by starting up with to INFO log level, and keep you posted!

This was the additional logging before the error shows up, afterwards the logging of the exception was the same as mentioned in my opening post:

19.03.2020 08:28:30 INFO localhost-startStop-1 [LocalHippoRepository.initialize:298] Initializing Hippo Repository
19.03.2020 08:28:30 INFO localhost-startStop-1 [LocalHippoRepository.getRepositoryConfigAsStream:240] Using resource repository config: jar:file:/Users/edwinb/Workspaces/my-project/target/tomcat8x/webapps/cms/WEB-INF/lib/hippo-repository-resources-4.2.8.jar!/org/hippoecm/repository/repository.xml
19.03.2020 08:28:30 INFO localhost-startStop-1 [LocalHippoRepository.getRepositoryPath:212] Using repository path: /Users/edwinb/Workspaces/my-project/target/storage
19.03.2020 08:28:32 INFO localhost-startStop-1 [LocalHippoRepository.initializeSystemNodeTypes:415] Initializing nodetypes from: hippo.cnd
19.03.2020 08:28:32 INFO localhost-startStop-1 [LocalHippoRepository.initializeSystemNodeTypes:415] Initializing nodetypes from: hipposys.cnd
19.03.2020 08:28:33 INFO localhost-startStop-1 [LocalHippoRepository.initializeSystemNodeTypes:415] Initializing nodetypes from: hipposysedit.cnd
19.03.2020 08:28:33 INFO localhost-startStop-1 [LocalHippoRepository.initializeSystemNodeTypes:415] Initializing nodetypes from: hippofacnav.cnd
19.03.2020 08:28:33 INFO localhost-startStop-1 [LocalHippoRepository.initializeSystemNodeTypes:415] Initializing nodetypes from: hipposched.cnd
19.03.2020 08:28:45 ERROR localhost-startStop-1 [RepositoryServlet.init:229] Error while setting up JCR repository:
javax.jcr.RepositoryException: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at org.hippoecm.repository.LocalHippoRepository.initialize(LocalHippoRepository.java:352)
at org.hippoecm.repository.LocalHippoRepository.create(LocalHippoRepository.java:140)
at org.hippoecm.repository.LocalHippoRepository.create(LocalHippoRepository.java:130)

No clue yet…

The violation seems to come from a “Collections.sort” call in InitializationProcessorImpl#doProcessInitializeItems (line 188). I suggest a local debug session to have a look at the list of initializeItems involved.

Regards, Jeroen

jeroen.hoffman
March 19

No clue yet…

The violation seems to come from a “Collections.sort” call in InitializationProcessorImpl#doProcessInitializeItems (line 188). I suggest a local debug session to have a look at the list of initializeItems involved.

I am not sure how long ago this has been but I do not recall any more
against which java version version 11 was supported. The problem you
are running in seems to me the following:

  1. InitializeItemComparator violates the transitivity relation (aka is
    implemented incorrectly)
  2. Edwin is using a newer JDK than we originally used with version 11

IIRC with the introduction of streams also quite some comparators
invocations started to be used differently. In general never a problem
if code implementing a Comparator (and in general also classes
implementing equals) were implemented correctly. However, the new JDK
was less lenient to incorrect implementations. I did not check the
details of InitializeItemComparator but you can be pretty sure it
violates the transitivity contract. Spotting such problems isn’t
trivial since in general implementing a correct equals and/or
comparator is not trivial (if you think so you most likely don’t
understand it well enough).

So, I am not gonna check the InitializeItemComparator since it is hard
work (and 11 is not supported any more), but with pencil and paper you
should be able to find the problem (nice assessment for homework :slight_smile: )

HTH

Regards Ard