Awesome! Glad it worked! On Mon, Mar 28, 2011 at 3:14 AM, ZeroCool <[email protected]> wrote:
> 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 <[email protected]> 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 <[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(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 > > > [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. > > -- 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.
