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.

Reply via email to