[ 
https://issues.apache.org/jira/browse/SOLR-8539?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15097652#comment-15097652
 ] 

Greg Wilkins commented on SOLR-8539:
------------------------------------

Hmmm I've started looking at this and it is a huge job.   The jetty container 
has many layers (servlet async IO, servlet, HTTP, async IO) all with their own 
exception handling contracts and expected behaviours.    Many of the async APIs 
handle exceptions by passing them to onError(Throwable) callbacks and have 
specified lifecycles. 

So it is not really just a simple matter of catching VirtualMachineError an 
rethrowing it.   Should we try to generate a 500 response first? or should we 
just rethrow?   Should we pass it to async onError calls?   What if they throw 
it in another thread - do we still throw it in the current thread? how do we 
know?     If there is a -XX:OnOutOfMemoryError="kill -9 %p" script installed, 
then it does not really matter because we are dead.     But if there isn't, I 
think we are obliged to try to limp on as best we can (even though I agree that 
in almost all cases of VirtualMachineError we are effectively dead, but just 
don't know it yet).

I'll have to discuss this more with the jetty team and community.   I do want 
to do something, but this is not going to be quick, so I think you probably 
need to look at adding your own ErrorPageErrorHandler that handles 
VirtualMachineError with a System.exit() - or at least a simple Filter that 
does the same. 








 

> Solr queries swallows up OutOfMemoryErrors
> ------------------------------------------
>
>                 Key: SOLR-8539
>                 URL: https://issues.apache.org/jira/browse/SOLR-8539
>             Project: Solr
>          Issue Type: Bug
>            Reporter: Varun Thacker
>             Fix For: 5.5, Trunk
>
>         Attachments: SOLR-8539.patch
>
>
> I was testing a crazy surround query and was hitting OOMs easily with the 
> query. However I saw that the OOM killer wasn't triggered. Here is the stack 
> trace of the error on solr 5.4:
> {code}
> WARN  - 2016-01-12 18:37:03.920; [   x:techproducts] 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3; 
> java.lang.OutOfMemoryError: Java heap space
>         at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter(AbstractQueuedSynchronizer.java:1855)
>         at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2068)
>         at 
> org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:389)
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:531)
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.access$700(QueuedThreadPool.java:47)
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:590)
>         at java.lang.Thread.run(Thread.java:745)
> ERROR - 2016-01-12 18:37:03.922; [   x:techproducts] 
> org.apache.solr.common.SolrException; null:java.lang.RuntimeException: 
> java.lang.OutOfMemoryError: Java heap space
>         at 
> org.apache.solr.servlet.HttpSolrCall.sendError(HttpSolrCall.java:611)
>         at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:472)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:222)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:181)
>         at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
>         at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
>         at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
>         at 
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
>         at 
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)
>         at 
> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
>         at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
>         at org.eclipse.jetty.server.Server.handle(Server.java:499)
>         at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
>         at 
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
>         at 
> org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
>         at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
>         at java.lang.Thread.run(Thread.java:745)
> Caused by: java.lang.OutOfMemoryError: Java heap space
>         at 
> org.apache.lucene.codecs.lucene50.Lucene50PostingsReader.newTermState(Lucene50PostingsReader.java:149)
>         at 
> org.apache.lucene.codecs.blocktree.SegmentTermsEnumFrame.<init>(SegmentTermsEnumFrame.java:100)
>         at 
> org.apache.lucene.codecs.blocktree.SegmentTermsEnum.getFrame(SegmentTermsEnum.java:215)
>         at 
> org.apache.lucene.codecs.blocktree.SegmentTermsEnum.pushFrame(SegmentTermsEnum.java:241)
>         at 
> org.apache.lucene.codecs.blocktree.SegmentTermsEnum.seekCeil(SegmentTermsEnum.java:728)
>         at 
> org.apache.lucene.index.FilterLeafReader$FilterTermsEnum.seekCeil(FilterLeafReader.java:185)
>         at org.apache.lucene.index.TermsEnum.seekExact(TermsEnum.java:74)
>         at org.apache.lucene.index.TermContext.build(TermContext.java:94)
>         at 
> org.apache.lucene.search.spans.SpanTermQuery.createWeight(SpanTermQuery.java:72)
>         at 
> org.apache.lucene.search.spans.SpanOrQuery.createWeight(SpanOrQuery.java:132)
>         at 
> org.apache.lucene.search.spans.SpanNearQuery.createWeight(SpanNearQuery.java:192)
>         at 
> org.apache.lucene.search.spans.SpanNearQuery.createWeight(SpanNearQuery.java:42)
>         at 
> org.apache.lucene.search.IndexSearcher.createWeight(IndexSearcher.java:904)
>         at 
> org.apache.lucene.search.IndexSearcher.createNormalizedWeight(IndexSearcher.java:887)
>         at 
> org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:535)
>         at 
> org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:202)
>         at 
> org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1672)
>         at 
> org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1491)
>         at 
> org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:557)
>         at 
> org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:525)
>         at 
> org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:273)
>         at 
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:156)
>         at org.apache.solr.core.SolrCore.execute(SolrCore.java:2073)
>         at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:658)
>         at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:457)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:222)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:181)
>         at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
>         at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
>         at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
> {code}
> So HttpSolrCall#sendError needs to throw an OOM exception instead of 
> swallowing it and sending back and error in the response.
> Once I made HttpSolrCall#sendError throw an exception on OOM I still hit the 
> following stack strace 
> {code}
> WARN  - 2016-01-13 07:43:39.449; [   x:techproducts] 
> org.eclipse.jetty.servlet.ServletHandler; Error for 
> /solr/techproducts%2Fselect
> java.lang.OutOfMemoryError: Java heap space
>         at 
> org.apache.lucene.codecs.lucene50.Lucene50PostingsReader$BlockPostingsEnum.<init>(Lucene50PostingsReader.java:477)
>         at 
> org.apache.lucene.codecs.lucene50.Lucene50PostingsReader.postings(Lucene50PostingsReader.java:220)
>         at 
> org.apache.lucene.codecs.blocktree.SegmentTermsEnum.postings(SegmentTermsEnum.java:1002)
>         at 
> org.apache.lucene.search.spans.SpanTermQuery$SpanTermWeight.getSpans(SpanTermQuery.java:119)
>         at 
> org.apache.lucene.search.spans.SpanOrQuery$SpanOrWeight.getSpans(SpanOrQuery.java:160)
>         at 
> org.apache.lucene.search.spans.SpanNearQuery$SpanNearWeight.getSpans(SpanNearQuery.java:213)
>         at 
> org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:133)
>         at 
> org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:38)
>         at org.apache.lucene.search.Weight.bulkScorer(Weight.java:135)
>         at 
> org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:667)
>         at 
> org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:474)
>         at 
> org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:240)
>         at 
> org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1766)
>         at 
> org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1583)
>         at 
> org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:613)
>         at 
> org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:524)
>         at 
> org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:273)
>         at 
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:156)
>         at org.apache.solr.core.SolrCore.execute(SolrCore.java:2062)
>         at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:653)
>         at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:457)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:226)
>         at 
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:184)
>         at 
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
>         at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
>         at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
>         at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
>         at 
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
>         at 
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
>         at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
> {code}
> So is Jetty not propagating the OOM Error back to the JVM?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to