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.

Reply via email to