You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@lucene.apache.org by Otis Gospodnetic <ot...@yahoo.com> on 2011/04/28 23:17:23 UTC
SorterTemplate.quickSort causes StackOverflowError
Hi,
I'm looking at some code that uses MemoryIndex (Lucene 3.1) and that's
exhibiting a strange behaviour - it slows down over time.
The MemoryIndex contains 1 doc, of course, and executes a set of a few thousand
queries against it. The set of queries does not change - the same set of
queries gets executed on all incoming documents.
This code runs very quickly..... in the beginning. But with time is gets
slower and slower.... and slower..... and then I get this:
4/28/11 10:32:52 PM (S) SolrException.log : java.lang.StackOverflowError
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
I haven't profiled this code yet (remote server, firewall in between, can't use
YourKit...), but does the above look familiar to anyone?
I've looked at the code and obviously there is the recursive call that's
problematic here - it looks like the recursion just gets deeper and deeper and
"gets stuck", eventually getting too deep for the JVM's taste.
Thanks,
Otis
----
Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
Lucene ecosystem search :: http://search-lucene.com/
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by jm <jm...@gmail.com>.
maybe http://youdebug.kenai.com/ could be useful. If you are lucky you could
get it to set a breakpoint when the recursive call has reached depth X.
On Fri, Apr 29, 2011 at 1:40 PM, Otis Gospodnetic <
otis_gospodnetic@yahoo.com> wrote:
> Hi,
>
> OK, so it looks like it's not MemoryIndex and its Comparator that are
> funky.
> After switching from quickSort call in MemoryIndex to mergeSort, the
> problem
> persists:
>
> '1205215856@qtp-684754483-7' Id=18, RUNNABLE on lock=, total cpu
> time=497060.0000ms user time=495210.0000msat
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:105)
>
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> So something else is calling quickSort when it gets stuck. Weirdly, when I
> get
> a thread dump and get the above, I don't see the original caller. Maybe
> because
> the stack is already too deep and the printout is limited to N lines per
> call
> stack?
>
> Otis
> ----
> Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
> Lucene ecosystem search :: http://search-lucene.com/
>
>
>
> ----- Original Message ----
> > From: Uwe Schindler <uw...@thetaphi.de>
> > To: java-user@lucene.apache.org
> > Sent: Thu, April 28, 2011 5:54:44 PM
> > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> >
> > > Thanks for confirming, Javier! :)
> > >
> > > Uwe, I assume you are referring to this line 528 in MemoryIndex?
> > >
> > > 528 if (size > 1) ArrayUtil.quickSort(entries,
> termComparator);
> > >
> > > And this funky Comparator from MemoryIndex:
> > >
> > > 208 private static final Comparator<Object> termComparator = new
> > > Comparator<Object>() {
> > > 209 @SuppressWarnings("unchecked")
> > > 210 public int compare(Object o1, Object o2) {
> > > 211 if (o1 instanceof Map.Entry<?,?>) o1 =
> ((Map.Entry<?,?>)
> > > o1).getKey();
> > > 212 if (o2 instanceof Map.Entry<?,?>) o2 =
> ((Map.Entry<?,?>)
> > > o2).getKey();
> > > 213 if (o1 == o2) return 0;
> > > 214 return ((Comparable) o1).compareTo((Comparable) o2);
> > > 215 }
> > > 216 };
> > >
> > > Will try, thanks!
> >
> > Yeah, simply try with mergeSort in line 528. If that helps, this
> comparator
> > is buggy.
> >
> > Uwe
> >
> >
> > > ----- Original Message ----
> > > > From: Uwe Schindler <uw...@thetaphi.de>
> > > > To: java-user@lucene.apache.org
> > > > Sent: Thu, April 28, 2011 5:36:13 PM
> > > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > > >
> > > > Hi Otis,
> > > >
> > > > Can you reproduce this somehow and send test code? I could look
> into
> > > > it. I don't expect the error in the quicksort algorithm itself as
> this
> > > > one is used e.g. BytesRefHash / TermsHash, if there is a bug we
> would
> > > > have seen it long time ago.
> > > >
> > > > I have not seen this before, but I suspect a problem in this very
> > > > strange comparator in MemoryIndex (which is very broken, if you
> look
> > > > at its code - it can compare Strings with Map.Entry and so on,
> > > > brrrr), maybe the comparator is not stable? In this case, quicksort
> > > > can easily loop endless and stack overflow. In Lucene 3.0 this used
> > > > stock java sort (which is mergesort), maybe replace the
> > > > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if problem
> is
> > still
> > > there?
> > > >
> > > > Uwe
> > > >
> > > > -----
> > > > Uwe Schindler
> > > > H.-H.-Meier-Allee 63, D-28213 Bremen
> > > > http://www.thetaphi.de
> > > > eMail: uwe@thetaphi.de
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > > > Sent: Thursday, April 28, 2011 11:17 PM
> > > > > To: java-user@lucene.apache.org
> > > > > Subject: SorterTemplate.quickSort causes StackOverflowError
> > > > >
> > > > > Hi,
> > > > >
> > > > > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and
> > > > > that's exhibiting a strange behaviour - it slows down over time.
> > > > > The MemoryIndex contains 1 doc, of course, and executes a set of a
> > > > > few thousand queries against it. The set of queries does not
> > > > > change - the
> > > > same
> > > > > set of queries gets executed on all incoming documents.
> > > > > This code runs very quickly..... in the beginning. But with
> time is
> > gets
> > > > > slower and slower.... and slower..... and then I get this:
> > > > >
> > > > > 4/28/11 10:32:52 PM (S) SolrException.log :
> > java.lang.StackOverflowError
> > > > > at
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > at
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > at
> > > > >
> > > > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > > > 104)
> > > > >
> > > > > I haven't profiled this code yet (remote server, firewall in
> > > > > between,
> > > > can't use
> > > > > YourKit...), but does the above look familiar to anyone?
> > > > > I've looked at the code and obviously there is the recursive call
> > > > > that's problematic here - it looks like the recursion just gets
> > > > > deeper and deeper
> > > > and
> > > > > "gets stuck", eventually getting too deep for the JVM's taste.
> > > > >
> > > > > Thanks,
> > > > > Otis
> > > > > ----
> > > > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > > > ecosystem search :: http://search-lucene.com/
> > > > >
> > > > >
> > > > >
> > > > >
> --------------------------------------------------------------------
> > > > > - To unsubscribe, e-mail:
> java-user-unsubscribe@lucene.apache.org
> > > > > For additional commands, e-mail:
> java-user-help@lucene.apache.org
> > > >
> > > >
> > > >
> > > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
RE: SorterTemplate.quickSort causes StackOverflowError
Posted by Uwe Schindler <uw...@thetaphi.de>.
Hi Otis,
Thanks for trying out. From what I see, the problem is at all not in
MemoryIndex, so I suggest that you replace the mergeSort by quicksort again
(for MemoryIndex, see below). The problem seem to be the comparators that's
are in those Queries, which have no tie-breaker. MergeSort can handle them
better, because mergeSort is stable in comparison to quicksort.
I did some testing with random data and did not get a stack overflow at all
(with standard terms / integers). A integer sort showed that even 200
million integers sorted a) much faster with quickSort and did not stack
overflow (in reality, for good comparators, integers should at most do 31
recursions, but only with 2^31 integers in an array!!!), so quickSort is
fine for strings and integers.
Mike McCandless did some tests in TermsHash/BytesRefHash (Lucene Core), that
showed that quicksort is 20% faster than mergeSort. The code is similar to
MemoryIndex, so this is why I suggest to not change MemoryIndex at all. From
your description of the issue its also unlikely that MemoryIndex is causing
this, because sorting is only done on building the index, not when queries
are running! So the bad guys are the PhraseQueries. We should fix them ASAP,
as this may affect other users, too.
More on https://issues.apache.org/jira/browse/LUCENE-3054,
Thanks Robert!
I will review later, I am heavy busy at the moment.
Uwe
-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe@thetaphi.de
> -----Original Message-----
> From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> Sent: Friday, April 29, 2011 7:13 PM
> To: java-user@lucene.apache.org
> Subject: Re: SorterTemplate.quickSort causes StackOverflowError
>
> Hi,
>
> Yeah, that's what we were going to do, but instead we did:
> * changed MemoryIndex to use ArrayUtil.mergeSort
> * ran the up and did a thread dump that shows that
> SorterTemplate.quickSort in deep recursion again!
> * looked for other places where this call is made - found it in
> MultiPhraseQuery$MultiPhraseWeight and changed that call from
> ArrayUtil.quickSort to ArrayUtil.mergeSort
> * now we no longer see SorterTemplate.quickSort in deep recursion when
> we do a thread dump
> * we now occasionally catch SorterTemplate.mergeSort in our thread dumps,
> but only a few levels deep, which looks healthy
>
> I don't think we'll be able to reproduce this easily - this happens with
> MemoryIndex and a few thousand stored queries that are confidential
> customer data :(
>
> I'll be back if after a while mergeSort starts behaving the same as
quickSort.
>
> Thanks!
> Otis
> ----
> Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene ecosystem
> search :: http://search-lucene.com/
>
>
>
> ----- Original Message ----
> > From: Dawid Weiss <da...@gmail.com>
> > To: java-user@lucene.apache.org
> > Sent: Fri, April 29, 2011 7:51:39 AM
> > Subject: Re: SorterTemplate.quickSort causes StackOverflowError
> >
> > Don't know if this helps, but debugging stuff like this I simply add
> > a (manually inserted or aspectj-injected) recursion count, add a
> > breakpoint inside an if checking for recursion count >> X and run the
> > vm with an attached socket debugger. This lets you run at (nearly)
> > full speed and once you hit the breakpoint, inspect the stack,
variables,
> etc...
> >
> > Dawid
> >
> > On Fri, Apr 29, 2011 at 1:40 PM, Otis Gospodnetic <
> > otis_gospodnetic@yahoo.com> wrote:
> >
> > > Hi,
> > >
> > > OK, so it looks like it's not MemoryIndex and its Comparator that
> > > are funky.
> > > After switching from quickSort call in MemoryIndex to mergeSort,
> > > the problem
> > > persists:
> > >
> > > '1205215856@qtp-684754483-7' Id=18, RUNNABLE on lock=, total cpu
> > > time=497060.0000ms user time=495210.0000msat
> > >
> > > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > 105)
> > >
> > > at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > So something else is calling quickSort when it gets stuck.
> > > Weirdly, when
> I
> > > get
> > > a thread dump and get the above, I don't see the original caller.
> > > Maybe because the stack is already too deep and the printout is
> > > limited to N lines per call stack?
> > >
> > > Otis
> > > ----
> > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > ecosystem search :: http://search-lucene.com/
> > >
> > >
> > >
> > > ----- Original Message ----
> > > > From: Uwe Schindler <uw...@thetaphi.de>
> > > > To: java-user@lucene.apache.org
> > > > Sent: Thu, April 28, 2011 5:54:44 PM
> > > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > > >
> > > > > Thanks for confirming, Javier! :)
> > > > >
> > > > > Uwe, I assume you are referring to this line 528 in MemoryIndex?
> > > > >
> > > > > 528 if (size > 1) ArrayUtil.quickSort(entries,
> > > termComparator);
> > > > >
> > > > > And this funky Comparator from MemoryIndex:
> > > > >
> > > > > 208 private static final Comparator<Object> termComparator
=
> new
> > > > > Comparator<Object>() {
> > > > > 209 @SuppressWarnings("unchecked")
> > > > > 210 public int compare(Object o1, Object o2) {
> > > > > 211 if (o1 instanceof Map.Entry<?,?>) o1 =
> > > ((Map.Entry<?,?>)
> > > > > o1).getKey();
> > > > > 212 if (o2 instanceof Map.Entry<?,?>) o2 =
> > > ((Map.Entry<?,?>)
> > > > > o2).getKey();
> > > > > 213 if (o1 == o2) return 0;
> > > > > 214 return ((Comparable) o1).compareTo((Comparable)
o2);
> > > > > 215 }
> > > > > 216 };
> > > > >
> > > > > Will try, thanks!
> > > >
> > > > Yeah, simply try with mergeSort in line 528. If that helps, this
> > > comparator
> > > > is buggy.
> > > >
> > > > Uwe
> > > >
> > > >
> > > > > ----- Original Message ----
> > > > > > From: Uwe Schindler <uw...@thetaphi.de>
> > > > > > To: java-user@lucene.apache.org
> > > > > > Sent: Thu, April 28, 2011 5:36:13 PM
> > > > > > Subject: RE: SorterTemplate.quickSort causes
> > > > > StackOverflowError
> > > > > >
> > > > > > Hi Otis,
> > > > > >
> > > > > > Can you reproduce this somehow and send test code? I could
> > > > > > look
> > > into
> > > > > > it. I don't expect the error in the quicksort algorithm
> > > > itself as
> > > this
> > > > > > one is used e.g. BytesRefHash / TermsHash, if there is a bug
we
> > > would
> > > > > > have seen it long time ago.
> > > > > >
> > > > > > I have not seen this before, but I suspect a problem in
> > > > > > this very strange comparator in MemoryIndex (which is very
> > > > > > broken, if you
> > > look
> > > > > > at its code - it can compare Strings with Map.Entry and so
> > > > > > on, brrrr), maybe the comparator is not stable? In this
> > > > > > case, quicksort can easily loop endless and stack overflow.
In
> Lucene 3.0 this used
> > > > > > stock java sort (which is mergesort), maybe replace the
> > > > > > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if
> > > > > > problem
> > > is
> > > > still
> > > > > there?
> > > > > >
> > > > > > Uwe
> > > > > >
> > > > > > -----
> > > > > > Uwe Schindler
> > > > > > H.-H.-Meier-Allee 63, D-28213 Bremen
> > > > > > http://www.thetaphi.de
> > > > > > eMail: uwe@thetaphi.de
> > > > > >
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > > > > > Sent: Thursday, April 28, 2011 11:17 PM > > > > To:
> > > java-user@lucene.apache.org
> > > > > > > Subject: SorterTemplate.quickSort causes
StackOverflowError
> > > > > > >
> > > > > > > Hi,
> > > > > > >
> > > > > > > I'm looking at some code that uses MemoryIndex (Lucene
> > > > > > > 3.1) and
> > > > > > > that's exhibiting a strange behaviour - it slows down over
time.
> > > > > > > The MemoryIndex contains 1 doc, of course, and executes a
set
> of a
> > > > > > > few thousand queries against it. The set of queries does
> > > > > > > not change - the
> > > > > > same
> > > > > > > set of queries gets executed on all incoming documents.
> > > > > > > This code runs very quickly..... in the beginning. But
with
> > > time is
> > > > gets
> > > > > > > slower and slower.... and slower..... and then I get this:
> > > > > > >
> > > > > > > 4/28/11 10:32:52 PM (S) SolrException.log :
> > > > java.lang.StackOverflowError
> > > > > > > at
> > > > > > >
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > > > at
> > > > > > >
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > > > at
> > > > > > >
> > > > > > >
> > > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > > > > > 104)
> > > > > > >
> > > > > > > I haven't profiled this code yet (remote server, firewall
> > > > > in
> > > > > > > between,
> > > > > > can't use
> > > > > > > YourKit...), but does the above look familiar to anyone?
> > > > > > > I've looked at the code and obviously there is the
> > > > > > > recursive call that's problematic here - it looks like
> > > > > > > the recursion just gets
> > > > > > > deeper and deeper
> > > > > > and
> > > > > > > "gets stuck", eventually getting too deep for the JVM's
taste.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Otis
> > > > > > > ----
> > > > > > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
> > > > > > > Lucene ecosystem search :: http://search-lucene.com/
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > >
> > > --------------------------------------------------------------------
> > > > > > > - To unsubscribe, e-mail:
> > > java-user-unsubscribe@lucene.apache.org
> > > > > > > For additional commands, e-mail:
> > > java-user-help@lucene.apache.org
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > >
> > > --------------------------------------------------------------------
> > > - > > > To unsubscribe, e-mail:
> > > java-user-unsubscribe@lucene.apache.org
> > > > > > For additional commands, e-mail:
> > > java-user-help@lucene.apache.org > > >
> > > > > >
> > > > >
> > > > >
---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail:
> > > java-user-unsubscribe@lucene.apache.org
> > > > > For additional commands, e-mail:
> > > java-user-help@lucene.apache.org >
> > > >
> > > >
> > > >
> > > > ------------------------------------------------------------------
> > > > ---
> > > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > For additional commands, e-mail:
> > > java-user-help@lucene.apache.org >
> > > >
> > >
> > >
> > > --------------------------------------------------------------------
> > > - To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > >
> > >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by Otis Gospodnetic <ot...@yahoo.com>.
Hi,
Yeah, that's what we were going to do, but instead we did:
* changed MemoryIndex to use ArrayUtil.mergeSort
* ran the up and did a thread dump that shows that SorterTemplate.quickSort in
deep recursion again!
* looked for other places where this call is made - found it in
MultiPhraseQuery$MultiPhraseWeight and changed that call from
ArrayUtil.quickSort to ArrayUtil.mergeSort
* now we no longer see SorterTemplate.quickSort in deep recursion when we do a
thread dump
* we now occasionally catch SorterTemplate.mergeSort in our thread dumps, but
only a few levels deep, which looks healthy
I don't think we'll be able to reproduce this easily - this happens with
MemoryIndex and a few thousand stored queries that are confidential customer
data :(
I'll be back if after a while mergeSort starts behaving the same as quickSort.
Thanks!
Otis
----
Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
Lucene ecosystem search :: http://search-lucene.com/
----- Original Message ----
> From: Dawid Weiss <da...@gmail.com>
> To: java-user@lucene.apache.org
> Sent: Fri, April 29, 2011 7:51:39 AM
> Subject: Re: SorterTemplate.quickSort causes StackOverflowError
>
> Don't know if this helps, but debugging stuff like this I simply add a
> (manually inserted or aspectj-injected) recursion count, add a breakpoint
> inside an if checking for recursion count >> X and run the vm with an
> attached socket debugger. This lets you run at (nearly) full speed and once
> you hit the breakpoint, inspect the stack, variables, etc...
>
> Dawid
>
> On Fri, Apr 29, 2011 at 1:40 PM, Otis Gospodnetic <
> otis_gospodnetic@yahoo.com> wrote:
>
> > Hi,
> >
> > OK, so it looks like it's not MemoryIndex and its Comparator that are
> > funky.
> > After switching from quickSort call in MemoryIndex to mergeSort, the
> > problem
> > persists:
> >
> > '1205215856@qtp-684754483-7' Id=18, RUNNABLE on lock=, total cpu
> > time=497060.0000ms user time=495210.0000msat
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:105)
> >
> > at
org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > at
org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > at
org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > So something else is calling quickSort when it gets stuck. Weirdly, when
I
> > get
> > a thread dump and get the above, I don't see the original caller. Maybe
> > because
> > the stack is already too deep and the printout is limited to N lines per
> > call
> > stack?
> >
> > Otis
> > ----
> > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
> > Lucene ecosystem search :: http://search-lucene.com/
> >
> >
> >
> > ----- Original Message ----
> > > From: Uwe Schindler <uw...@thetaphi.de>
> > > To: java-user@lucene.apache.org
> > > Sent: Thu, April 28, 2011 5:54:44 PM
> > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > >
> > > > Thanks for confirming, Javier! :)
> > > >
> > > > Uwe, I assume you are referring to this line 528 in MemoryIndex?
> > > >
> > > > 528 if (size > 1) ArrayUtil.quickSort(entries,
> > termComparator);
> > > >
> > > > And this funky Comparator from MemoryIndex:
> > > >
> > > > 208 private static final Comparator<Object> termComparator = new
> > > > Comparator<Object>() {
> > > > 209 @SuppressWarnings("unchecked")
> > > > 210 public int compare(Object o1, Object o2) {
> > > > 211 if (o1 instanceof Map.Entry<?,?>) o1 =
> > ((Map.Entry<?,?>)
> > > > o1).getKey();
> > > > 212 if (o2 instanceof Map.Entry<?,?>) o2 =
> > ((Map.Entry<?,?>)
> > > > o2).getKey();
> > > > 213 if (o1 == o2) return 0;
> > > > 214 return ((Comparable) o1).compareTo((Comparable) o2);
> > > > 215 }
> > > > 216 };
> > > >
> > > > Will try, thanks!
> > >
> > > Yeah, simply try with mergeSort in line 528. If that helps, this
> > comparator
> > > is buggy.
> > >
> > > Uwe
> > >
> > >
> > > > ----- Original Message ----
> > > > > From: Uwe Schindler <uw...@thetaphi.de>
> > > > > To: java-user@lucene.apache.org
> > > > > Sent: Thu, April 28, 2011 5:36:13 PM
> > > > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > > > >
> > > > > Hi Otis,
> > > > >
> > > > > Can you reproduce this somehow and send test code? I could look
> > into
> > > > > it. I don't expect the error in the quicksort algorithm itself as
> > this
> > > > > one is used e.g. BytesRefHash / TermsHash, if there is a bug we
> > would
> > > > > have seen it long time ago.
> > > > >
> > > > > I have not seen this before, but I suspect a problem in this very
> > > > > strange comparator in MemoryIndex (which is very broken, if you
> > look
> > > > > at its code - it can compare Strings with Map.Entry and so on,
> > > > > brrrr), maybe the comparator is not stable? In this case, quicksort
> > > > > can easily loop endless and stack overflow. In Lucene 3.0 this used
> > > > > stock java sort (which is mergesort), maybe replace the
> > > > > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if problem
> > is
> > > still
> > > > there?
> > > > >
> > > > > Uwe
> > > > >
> > > > > -----
> > > > > Uwe Schindler
> > > > > H.-H.-Meier-Allee 63, D-28213 Bremen
> > > > > http://www.thetaphi.de
> > > > > eMail: uwe@thetaphi.de
> > > > >
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > > > > Sent: Thursday, April 28, 2011 11:17 PM
> > > > > > To: java-user@lucene.apache.org
> > > > > > Subject: SorterTemplate.quickSort causes StackOverflowError
> > > > > >
> > > > > > Hi,
> > > > > >
> > > > > > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and
> > > > > > that's exhibiting a strange behaviour - it slows down over time.
> > > > > > The MemoryIndex contains 1 doc, of course, and executes a set of a
> > > > > > few thousand queries against it. The set of queries does not
> > > > > > change - the
> > > > > same
> > > > > > set of queries gets executed on all incoming documents.
> > > > > > This code runs very quickly..... in the beginning. But with
> > time is
> > > gets
> > > > > > slower and slower.... and slower..... and then I get this:
> > > > > >
> > > > > > 4/28/11 10:32:52 PM (S) SolrException.log :
> > > java.lang.StackOverflowError
> > > > > > at
> > > > > >
> > > >
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > > at
> > > > > >
> > > >
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > > at
> > > > > >
> > > > > >
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > > > > 104)
> > > > > >
> > > > > > I haven't profiled this code yet (remote server, firewall in
> > > > > > between,
> > > > > can't use
> > > > > > YourKit...), but does the above look familiar to anyone?
> > > > > > I've looked at the code and obviously there is the recursive call
> > > > > > that's problematic here - it looks like the recursion just gets
> > > > > > deeper and deeper
> > > > > and
> > > > > > "gets stuck", eventually getting too deep for the JVM's taste.
> > > > > >
> > > > > > Thanks,
> > > > > > Otis
> > > > > > ----
> > > > > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > > > > ecosystem search :: http://search-lucene.com/
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > --------------------------------------------------------------------
> > > > > > - To unsubscribe, e-mail:
> > java-user-unsubscribe@lucene.apache.org
> > > > > > For additional commands, e-mail:
> > java-user-help@lucene.apache.org
> > > > >
> > > > >
> > > > >
> > > > >
> > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > > > >
> > > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
>
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by Dawid Weiss <da...@gmail.com>.
Don't know if this helps, but debugging stuff like this I simply add a
(manually inserted or aspectj-injected) recursion count, add a breakpoint
inside an if checking for recursion count >> X and run the vm with an
attached socket debugger. This lets you run at (nearly) full speed and once
you hit the breakpoint, inspect the stack, variables, etc...
Dawid
On Fri, Apr 29, 2011 at 1:40 PM, Otis Gospodnetic <
otis_gospodnetic@yahoo.com> wrote:
> Hi,
>
> OK, so it looks like it's not MemoryIndex and its Comparator that are
> funky.
> After switching from quickSort call in MemoryIndex to mergeSort, the
> problem
> persists:
>
> '1205215856@qtp-684754483-7' Id=18, RUNNABLE on lock=, total cpu
> time=497060.0000ms user time=495210.0000msat
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:105)
>
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> So something else is calling quickSort when it gets stuck. Weirdly, when I
> get
> a thread dump and get the above, I don't see the original caller. Maybe
> because
> the stack is already too deep and the printout is limited to N lines per
> call
> stack?
>
> Otis
> ----
> Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
> Lucene ecosystem search :: http://search-lucene.com/
>
>
>
> ----- Original Message ----
> > From: Uwe Schindler <uw...@thetaphi.de>
> > To: java-user@lucene.apache.org
> > Sent: Thu, April 28, 2011 5:54:44 PM
> > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> >
> > > Thanks for confirming, Javier! :)
> > >
> > > Uwe, I assume you are referring to this line 528 in MemoryIndex?
> > >
> > > 528 if (size > 1) ArrayUtil.quickSort(entries,
> termComparator);
> > >
> > > And this funky Comparator from MemoryIndex:
> > >
> > > 208 private static final Comparator<Object> termComparator = new
> > > Comparator<Object>() {
> > > 209 @SuppressWarnings("unchecked")
> > > 210 public int compare(Object o1, Object o2) {
> > > 211 if (o1 instanceof Map.Entry<?,?>) o1 =
> ((Map.Entry<?,?>)
> > > o1).getKey();
> > > 212 if (o2 instanceof Map.Entry<?,?>) o2 =
> ((Map.Entry<?,?>)
> > > o2).getKey();
> > > 213 if (o1 == o2) return 0;
> > > 214 return ((Comparable) o1).compareTo((Comparable) o2);
> > > 215 }
> > > 216 };
> > >
> > > Will try, thanks!
> >
> > Yeah, simply try with mergeSort in line 528. If that helps, this
> comparator
> > is buggy.
> >
> > Uwe
> >
> >
> > > ----- Original Message ----
> > > > From: Uwe Schindler <uw...@thetaphi.de>
> > > > To: java-user@lucene.apache.org
> > > > Sent: Thu, April 28, 2011 5:36:13 PM
> > > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > > >
> > > > Hi Otis,
> > > >
> > > > Can you reproduce this somehow and send test code? I could look
> into
> > > > it. I don't expect the error in the quicksort algorithm itself as
> this
> > > > one is used e.g. BytesRefHash / TermsHash, if there is a bug we
> would
> > > > have seen it long time ago.
> > > >
> > > > I have not seen this before, but I suspect a problem in this very
> > > > strange comparator in MemoryIndex (which is very broken, if you
> look
> > > > at its code - it can compare Strings with Map.Entry and so on,
> > > > brrrr), maybe the comparator is not stable? In this case, quicksort
> > > > can easily loop endless and stack overflow. In Lucene 3.0 this used
> > > > stock java sort (which is mergesort), maybe replace the
> > > > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if problem
> is
> > still
> > > there?
> > > >
> > > > Uwe
> > > >
> > > > -----
> > > > Uwe Schindler
> > > > H.-H.-Meier-Allee 63, D-28213 Bremen
> > > > http://www.thetaphi.de
> > > > eMail: uwe@thetaphi.de
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > > > Sent: Thursday, April 28, 2011 11:17 PM
> > > > > To: java-user@lucene.apache.org
> > > > > Subject: SorterTemplate.quickSort causes StackOverflowError
> > > > >
> > > > > Hi,
> > > > >
> > > > > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and
> > > > > that's exhibiting a strange behaviour - it slows down over time.
> > > > > The MemoryIndex contains 1 doc, of course, and executes a set of a
> > > > > few thousand queries against it. The set of queries does not
> > > > > change - the
> > > > same
> > > > > set of queries gets executed on all incoming documents.
> > > > > This code runs very quickly..... in the beginning. But with
> time is
> > gets
> > > > > slower and slower.... and slower..... and then I get this:
> > > > >
> > > > > 4/28/11 10:32:52 PM (S) SolrException.log :
> > java.lang.StackOverflowError
> > > > > at
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > at
> > > > >
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > > at
> > > > >
> > > > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > > > 104)
> > > > >
> > > > > I haven't profiled this code yet (remote server, firewall in
> > > > > between,
> > > > can't use
> > > > > YourKit...), but does the above look familiar to anyone?
> > > > > I've looked at the code and obviously there is the recursive call
> > > > > that's problematic here - it looks like the recursion just gets
> > > > > deeper and deeper
> > > > and
> > > > > "gets stuck", eventually getting too deep for the JVM's taste.
> > > > >
> > > > > Thanks,
> > > > > Otis
> > > > > ----
> > > > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > > > ecosystem search :: http://search-lucene.com/
> > > > >
> > > > >
> > > > >
> > > > >
> --------------------------------------------------------------------
> > > > > - To unsubscribe, e-mail:
> java-user-unsubscribe@lucene.apache.org
> > > > > For additional commands, e-mail:
> java-user-help@lucene.apache.org
> > > >
> > > >
> > > >
> > > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by Otis Gospodnetic <ot...@yahoo.com>.
Hi,
OK, so it looks like it's not MemoryIndex and its Comparator that are funky.
After switching from quickSort call in MemoryIndex to mergeSort, the problem
persists:
'1205215856@qtp-684754483-7' Id=18, RUNNABLE on lock=, total cpu
time=497060.0000ms user time=495210.0000msat
org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:105)
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
at org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
So something else is calling quickSort when it gets stuck. Weirdly, when I get
a thread dump and get the above, I don't see the original caller. Maybe because
the stack is already too deep and the printout is limited to N lines per call
stack?
Otis
----
Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
Lucene ecosystem search :: http://search-lucene.com/
----- Original Message ----
> From: Uwe Schindler <uw...@thetaphi.de>
> To: java-user@lucene.apache.org
> Sent: Thu, April 28, 2011 5:54:44 PM
> Subject: RE: SorterTemplate.quickSort causes StackOverflowError
>
> > Thanks for confirming, Javier! :)
> >
> > Uwe, I assume you are referring to this line 528 in MemoryIndex?
> >
> > 528 if (size > 1) ArrayUtil.quickSort(entries, termComparator);
> >
> > And this funky Comparator from MemoryIndex:
> >
> > 208 private static final Comparator<Object> termComparator = new
> > Comparator<Object>() {
> > 209 @SuppressWarnings("unchecked")
> > 210 public int compare(Object o1, Object o2) {
> > 211 if (o1 instanceof Map.Entry<?,?>) o1 = ((Map.Entry<?,?>)
> > o1).getKey();
> > 212 if (o2 instanceof Map.Entry<?,?>) o2 = ((Map.Entry<?,?>)
> > o2).getKey();
> > 213 if (o1 == o2) return 0;
> > 214 return ((Comparable) o1).compareTo((Comparable) o2);
> > 215 }
> > 216 };
> >
> > Will try, thanks!
>
> Yeah, simply try with mergeSort in line 528. If that helps, this comparator
> is buggy.
>
> Uwe
>
>
> > ----- Original Message ----
> > > From: Uwe Schindler <uw...@thetaphi.de>
> > > To: java-user@lucene.apache.org
> > > Sent: Thu, April 28, 2011 5:36:13 PM
> > > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> > >
> > > Hi Otis,
> > >
> > > Can you reproduce this somehow and send test code? I could look into
> > > it. I don't expect the error in the quicksort algorithm itself as this
> > > one is used e.g. BytesRefHash / TermsHash, if there is a bug we would
> > > have seen it long time ago.
> > >
> > > I have not seen this before, but I suspect a problem in this very
> > > strange comparator in MemoryIndex (which is very broken, if you look
> > > at its code - it can compare Strings with Map.Entry and so on,
> > > brrrr), maybe the comparator is not stable? In this case, quicksort
> > > can easily loop endless and stack overflow. In Lucene 3.0 this used
> > > stock java sort (which is mergesort), maybe replace the
> > > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if problem is
> still
> > there?
> > >
> > > Uwe
> > >
> > > -----
> > > Uwe Schindler
> > > H.-H.-Meier-Allee 63, D-28213 Bremen
> > > http://www.thetaphi.de
> > > eMail: uwe@thetaphi.de
> > >
> > >
> > > > -----Original Message-----
> > > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > > Sent: Thursday, April 28, 2011 11:17 PM
> > > > To: java-user@lucene.apache.org
> > > > Subject: SorterTemplate.quickSort causes StackOverflowError
> > > >
> > > > Hi,
> > > >
> > > > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and
> > > > that's exhibiting a strange behaviour - it slows down over time.
> > > > The MemoryIndex contains 1 doc, of course, and executes a set of a
> > > > few thousand queries against it. The set of queries does not
> > > > change - the
> > > same
> > > > set of queries gets executed on all incoming documents.
> > > > This code runs very quickly..... in the beginning. But with time is
> gets
> > > > slower and slower.... and slower..... and then I get this:
> > > >
> > > > 4/28/11 10:32:52 PM (S) SolrException.log :
> java.lang.StackOverflowError
> > > > at
> > > >
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > at
> > > >
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > > at
> > > >
> > > > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > > 104)
> > > >
> > > > I haven't profiled this code yet (remote server, firewall in
> > > > between,
> > > can't use
> > > > YourKit...), but does the above look familiar to anyone?
> > > > I've looked at the code and obviously there is the recursive call
> > > > that's problematic here - it looks like the recursion just gets
> > > > deeper and deeper
> > > and
> > > > "gets stuck", eventually getting too deep for the JVM's taste.
> > > >
> > > > Thanks,
> > > > Otis
> > > > ----
> > > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > > ecosystem search :: http://search-lucene.com/
> > > >
> > > >
> > > >
> > > > --------------------------------------------------------------------
> > > > - To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
RE: SorterTemplate.quickSort causes StackOverflowError
Posted by Uwe Schindler <uw...@thetaphi.de>.
> Thanks for confirming, Javier! :)
>
> Uwe, I assume you are referring to this line 528 in MemoryIndex?
>
> 528 if (size > 1) ArrayUtil.quickSort(entries, termComparator);
>
> And this funky Comparator from MemoryIndex:
>
> 208 private static final Comparator<Object> termComparator = new
> Comparator<Object>() {
> 209 @SuppressWarnings("unchecked")
> 210 public int compare(Object o1, Object o2) {
> 211 if (o1 instanceof Map.Entry<?,?>) o1 = ((Map.Entry<?,?>)
> o1).getKey();
> 212 if (o2 instanceof Map.Entry<?,?>) o2 = ((Map.Entry<?,?>)
> o2).getKey();
> 213 if (o1 == o2) return 0;
> 214 return ((Comparable) o1).compareTo((Comparable) o2);
> 215 }
> 216 };
>
> Will try, thanks!
Yeah, simply try with mergeSort in line 528. If that helps, this comparator
is buggy.
Uwe
> ----- Original Message ----
> > From: Uwe Schindler <uw...@thetaphi.de>
> > To: java-user@lucene.apache.org
> > Sent: Thu, April 28, 2011 5:36:13 PM
> > Subject: RE: SorterTemplate.quickSort causes StackOverflowError
> >
> > Hi Otis,
> >
> > Can you reproduce this somehow and send test code? I could look into
> > it. I don't expect the error in the quicksort algorithm itself as this
> > one is used e.g. BytesRefHash / TermsHash, if there is a bug we would
> > have seen it long time ago.
> >
> > I have not seen this before, but I suspect a problem in this very
> > strange comparator in MemoryIndex (which is very broken, if you look
> > at its code - it can compare Strings with Map.Entry and so on,
> > brrrr), maybe the comparator is not stable? In this case, quicksort
> > can easily loop endless and stack overflow. In Lucene 3.0 this used
> > stock java sort (which is mergesort), maybe replace the
> > ArrayUtils.quickSort my ArrayUtils.mergeSort() and see if problem is
still
> there?
> >
> > Uwe
> >
> > -----
> > Uwe Schindler
> > H.-H.-Meier-Allee 63, D-28213 Bremen
> > http://www.thetaphi.de
> > eMail: uwe@thetaphi.de
> >
> >
> > > -----Original Message-----
> > > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > > Sent: Thursday, April 28, 2011 11:17 PM
> > > To: java-user@lucene.apache.org
> > > Subject: SorterTemplate.quickSort causes StackOverflowError
> > >
> > > Hi,
> > >
> > > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and
> > > that's exhibiting a strange behaviour - it slows down over time.
> > > The MemoryIndex contains 1 doc, of course, and executes a set of a
> > > few thousand queries against it. The set of queries does not
> > > change - the
> > same
> > > set of queries gets executed on all incoming documents.
> > > This code runs very quickly..... in the beginning. But with time is
gets
> > > slower and slower.... and slower..... and then I get this:
> > >
> > > 4/28/11 10:32:52 PM (S) SolrException.log :
java.lang.StackOverflowError
> > > at
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > at
> > >
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > > at
> > >
> > > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:
> > > 104)
> > >
> > > I haven't profiled this code yet (remote server, firewall in
> > > between,
> > can't use
> > > YourKit...), but does the above look familiar to anyone?
> > > I've looked at the code and obviously there is the recursive call
> > > that's problematic here - it looks like the recursion just gets
> > > deeper and deeper
> > and
> > > "gets stuck", eventually getting too deep for the JVM's taste.
> > >
> > > Thanks,
> > > Otis
> > > ----
> > > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene
> > > ecosystem search :: http://search-lucene.com/
> > >
> > >
> > >
> > > --------------------------------------------------------------------
> > > - To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by Otis Gospodnetic <ot...@yahoo.com>.
Thanks for confirming, Javier! :)
Uwe, I assume you are referring to this line 528 in MemoryIndex?
528 if (size > 1) ArrayUtil.quickSort(entries, termComparator);
And this funky Comparator from MemoryIndex:
208 private static final Comparator<Object> termComparator = new
Comparator<Object>() {
209 @SuppressWarnings("unchecked")
210 public int compare(Object o1, Object o2) {
211 if (o1 instanceof Map.Entry<?,?>) o1 = ((Map.Entry<?,?>)
o1).getKey();
212 if (o2 instanceof Map.Entry<?,?>) o2 = ((Map.Entry<?,?>)
o2).getKey();
213 if (o1 == o2) return 0;
214 return ((Comparable) o1).compareTo((Comparable) o2);
215 }
216 };
Will try, thanks!
Otis
----
Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
Lucene ecosystem search :: http://search-lucene.com/
----- Original Message ----
> From: Uwe Schindler <uw...@thetaphi.de>
> To: java-user@lucene.apache.org
> Sent: Thu, April 28, 2011 5:36:13 PM
> Subject: RE: SorterTemplate.quickSort causes StackOverflowError
>
> Hi Otis,
>
> Can you reproduce this somehow and send test code? I could look into it. I
> don't expect the error in the quicksort algorithm itself as this one is used
> e.g. BytesRefHash / TermsHash, if there is a bug we would have seen it long
> time ago.
>
> I have not seen this before, but I suspect a problem in this very strange
> comparator in MemoryIndex (which is very broken, if you look at its code -
> it can compare Strings with Map.Entry and so on, brrrr), maybe the
> comparator is not stable? In this case, quicksort can easily loop endless
> and stack overflow. In Lucene 3.0 this used stock java sort (which is
> mergesort), maybe replace the ArrayUtils.quickSort my ArrayUtils.mergeSort()
> and see if problem is still there?
>
> Uwe
>
> -----
> Uwe Schindler
> H.-H.-Meier-Allee 63, D-28213 Bremen
> http://www.thetaphi.de
> eMail: uwe@thetaphi.de
>
>
> > -----Original Message-----
> > From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> > Sent: Thursday, April 28, 2011 11:17 PM
> > To: java-user@lucene.apache.org
> > Subject: SorterTemplate.quickSort causes StackOverflowError
> >
> > Hi,
> >
> > I'm looking at some code that uses MemoryIndex (Lucene 3.1) and that's
> > exhibiting a strange behaviour - it slows down over time.
> > The MemoryIndex contains 1 doc, of course, and executes a set of a few
> > thousand queries against it. The set of queries does not change - the
> same
> > set of queries gets executed on all incoming documents.
> > This code runs very quickly..... in the beginning. But with time is gets
> > slower and slower.... and slower..... and then I get this:
> >
> > 4/28/11 10:32:52 PM (S) SolrException.log : java.lang.StackOverflowError
> > at
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > at
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> > at
> > org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> >
> > I haven't profiled this code yet (remote server, firewall in between,
> can't use
> > YourKit...), but does the above look familiar to anyone?
> > I've looked at the code and obviously there is the recursive call that's
> > problematic here - it looks like the recursion just gets deeper and deeper
> and
> > "gets stuck", eventually getting too deep for the JVM's taste.
> >
> > Thanks,
> > Otis
> > ----
> > Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene ecosystem
> > search :: http://search-lucene.com/
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
RE: SorterTemplate.quickSort causes StackOverflowError
Posted by Uwe Schindler <uw...@thetaphi.de>.
Hi Otis,
Can you reproduce this somehow and send test code? I could look into it. I
don't expect the error in the quicksort algorithm itself as this one is used
e.g. BytesRefHash / TermsHash, if there is a bug we would have seen it long
time ago.
I have not seen this before, but I suspect a problem in this very strange
comparator in MemoryIndex (which is very broken, if you look at its code -
it can compare Strings with Map.Entry and so on, brrrr), maybe the
comparator is not stable? In this case, quicksort can easily loop endless
and stack overflow. In Lucene 3.0 this used stock java sort (which is
mergesort), maybe replace the ArrayUtils.quickSort my ArrayUtils.mergeSort()
and see if problem is still there?
Uwe
-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe@thetaphi.de
> -----Original Message-----
> From: Otis Gospodnetic [mailto:otis_gospodnetic@yahoo.com]
> Sent: Thursday, April 28, 2011 11:17 PM
> To: java-user@lucene.apache.org
> Subject: SorterTemplate.quickSort causes StackOverflowError
>
> Hi,
>
> I'm looking at some code that uses MemoryIndex (Lucene 3.1) and that's
> exhibiting a strange behaviour - it slows down over time.
> The MemoryIndex contains 1 doc, of course, and executes a set of a few
> thousand queries against it. The set of queries does not change - the
same
> set of queries gets executed on all incoming documents.
> This code runs very quickly..... in the beginning. But with time is gets
> slower and slower.... and slower..... and then I get this:
>
> 4/28/11 10:32:52 PM (S) SolrException.log : java.lang.StackOverflowError
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
>
> I haven't profiled this code yet (remote server, firewall in between,
can't use
> YourKit...), but does the above look familiar to anyone?
> I've looked at the code and obviously there is the recursive call that's
> problematic here - it looks like the recursion just gets deeper and deeper
and
> "gets stuck", eventually getting too deep for the JVM's taste.
>
> Thanks,
> Otis
> ----
> Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch Lucene ecosystem
> search :: http://search-lucene.com/
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org
Re: SorterTemplate.quickSort causes StackOverflowError
Posted by jm <jm...@gmail.com>.
Hi Otis,
I have exactly the same scenario, also on 3.1, the only difference is I have
less queries, like 20 or 30.
Yesterday this code processed over 1 million incoming docs (in
a synthetic test), and did not get any error...
Not very helpful maybe but just so you get some other feedback.
javier
On Thu, Apr 28, 2011 at 11:17 PM, Otis Gospodnetic <
otis_gospodnetic@yahoo.com> wrote:
> Hi,
>
> I'm looking at some code that uses MemoryIndex (Lucene 3.1) and that's
> exhibiting a strange behaviour - it slows down over time.
> The MemoryIndex contains 1 doc, of course, and executes a set of a few
> thousand
> queries against it. The set of queries does not change - the same set of
> queries gets executed on all incoming documents.
> This code runs very quickly..... in the beginning. But with time is gets
> slower and slower.... and slower..... and then I get this:
>
> 4/28/11 10:32:52 PM (S) SolrException.log : java.lang.StackOverflowError
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
> at
> org.apache.lucene.util.SorterTemplate.quickSort(SorterTemplate.java:104)
>
> I haven't profiled this code yet (remote server, firewall in between, can't
> use
> YourKit...), but does the above look familiar to anyone?
> I've looked at the code and obviously there is the recursive call that's
> problematic here - it looks like the recursion just gets deeper and deeper
> and
> "gets stuck", eventually getting too deep for the JVM's taste.
>
> Thanks,
> Otis
> ----
> Sematext :: http://sematext.com/ :: Solr - Lucene - Nutch
> Lucene ecosystem search :: http://search-lucene.com/
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>
>