There have been some people that have been reporting code that was working for weeks, etc. not working in the last week or so. I'm beginning to wonder if maybe behind the scenes a switch to Java 7 or some other Java switch is occurring. In relation to your error, it looks like what I've found so far that Java 7 (not sure) is switching to using TimSort for ArrayList sorting. This TimSort is also used on Android from what I'm reading. If you look at the source code to TimSort you will see the exception you are seeing being thrown. It seems to me and further reading needs to be done that this type of error shouldn't occur for a Comparator used outside of a Set or Map as you suggest but should only occur when used in conjunction with a Set or Map. I'm including a couple of links to help you and other readers out as I'm sure your not the only one doing sorts this way (I know I am).
http://news.ycombinator.com/item?id=752677 http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/TimSort.java?view=co On Sun, Mar 27, 2011 at 1:19 AM, ZeroCool <[email protected]> wrote: > Hi App Engine Team, > > I see 100% error rate for a servlet in my application. > The function had been working well for months. > The lines of code that generate errors are as following: > > List<Key<User>> memKeys = userDao.getUserKeys(); > Map<Key<User>, User> mem = userDao.get(memKeys); > List<User> memList = new ArrayList<User>(mem.values()); > Collections.sort(memList, comp); > > Comparator<User> comp = new Comparator<User>() > { > @Override > public int compare(User user1, User user2) > { > > int ret = user2.getGroupRank() - user1.getGroupRank(); > if (ret == 0) > { > ret = ((user2.getRep() - user1.getRep()) >= 0 ? 1 : > -1); > } > return ret; > } > }; > > The error is: > > > [27/Mar/2011:00:45:28 -0700] "POST /GM HTTP/1.1" 500 0 - "a. > 2.3.0,gzip(gfe)" "pe-server2.appspot.com" ms=76 cpu_ms=140 > api_cpu_ms=0 cpm_usd=0.003913 > W 2011-03-27 00:45:28.770 > /GM > java.lang.IllegalArgumentException: Comparison method violates its > general contract! > at java.util.TimSort.mergeLo(TimSort.java:747) > at java.util.TimSort.mergeAt(TimSort.java:483) > at java.util.TimSort.mergeCollapse(TimSort.java:408) > at java.util.TimSort.sort(TimSort.java:214) > at java.util.TimSort.sort(TimSort.java:173) > at java.util.Arrays.sort(Arrays.java:1347) > at java.util.Collections.sort(Collections.java:217) > at com.miracle.server.pe.GroupMember.doPost(GroupMember.java:46) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) > at > org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: > 511) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1166) > at > > com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java: > 97) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java: > 35) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java: > 43) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java: > 388) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: > 216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java: > 182) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: > 765) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java: > 418) > at > > com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java: > 238) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: > 152) > at org.mortbay.jetty.Server.handle(Server.java:326) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java: > 542) > at org.mortbay.jetty.HttpConnection > $RequestHandler.headerComplete(HttpConnection.java:923) > at > > com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java: > 76) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) > at > > com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java: > 135) > at > com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java: > 261) > at com.google.apphosting.base.RuntimePb$EvaluationRuntime > $2.handleRequest(RuntimePb.java:9285) > at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java: > 437) > at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java: > 573) > at com.google.tracing.TraceContext$TraceContextRunnable > $1.run(TraceContext.java:448) > at com.google.tracing.TraceContext.runInContext(TraceContext.java: > 688) > at com.google.tracing.TraceContext > > $AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java: > 326) > at com.google.tracing.TraceContext > $AbstractTraceContextCallback.runInInheritedContext(TraceContext.java: > 318) > at com.google.tracing.TraceContext > $TraceContextRunnable.run(TraceContext.java:446) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: > 1110) > at java.util.concurrent.ThreadPoolExecutor > $Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:636) > > > With some googling, I found that the error was related to JDK bugs. > > I'm not using a sorted map or set which will possibly impose such > error: > "In particular the sorted set (or sorted map) will violate the general > contract for set (or map), which is defined in terms of equals." as in > http://download.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html > > Is there anything I can do to fix the problem? > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To post to this group, send email to > [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
