Hi Stephen, Thank you very much. I modified the code according to your suggestion and it worked.
On Mar 28, 8:13 am, Stephen Johnson <onepagewo...@gmail.com> wrote: > Hi ZeroCool, > I'm not sure if this will help, and I don't know how the TimSort works but > looking at your compare method I'm curious about this particular situation. > If you have two users UserA and UserB and > UserA has groupRank of 5 and Rep of 3 > and > UserB has groupRank of 5 and Rep of 3 > Then, if you call compare(UserA, UserB) you get a return value of 1 > indicating that UserA > UserB > But, if you call compare(UserB, UserA) you get a return value of 1 > indicating that UserB > UserA > So, this situation seems wrong. Now, if I'm interpreting your compare method > correctly, then my guess would be that either new data was added to your > dataset that hit this particular case or the old mergeSort used by > Collections.sort only called compare with the objects in one particular > order if it used them multiple times and the new TimSort can call the > compare in either order multiple times and it is seeing this discrepancy. > > I think you should try re-coding your compare so that if groupRank and Rep > are the same for both objects then you return 0 not a 1. > > I hope this helps, > Stephen > > > > > > > > On Sun, Mar 27, 2011 at 1:19 AM, ZeroCool <zero...@gmail.com> 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(ParseBlo > > bUploadFilter.java: > > 97) > > at org.mortbay.jetty.servlet.ServletHandler > > $CachedChain.doFilter(ServletHandler.java:1157) > > at > > > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionF > > ilter.java: > > 35) > > at org.mortbay.jetty.servlet.ServletHandler > > $CachedChain.doFilter(ServletHandler.java:1157) > > at > > > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans > > actionCleanupFilter.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(AppVersionH > > andlerMap.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(RpcRequ > > estParser.java: > > 76) > > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) > > at > > > com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceReques > > t(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.jav > > a: > > 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... > > > 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 > > google-appengine-java@googlegroups.com. > > To unsubscribe from this group, send email to > > google-appengine-java+unsubscr...@googlegroups.com. > > 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 google-appengine-java@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.