最近几周,我们客户的 SOLR 服务器系统经常出现相同的错误,而且越来越频繁。现在几乎每天都会出现。在客户端中,SOLR 3.6 向 PHP 客户端抛出此异常:
java.lang.RuntimeException: org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/var/solr/data/spellchecker/write.lock
at org.apache.solr.spelling.IndexBasedSpellChecker.build(IndexBasedSpellChecker.java:92)
at org.apache.solr.handler.component.SpellCheckComponent.prepare(SpellCheckComponent.java:109)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:165)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1376)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:365)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:679)
Caused by: org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/var/solr/data/spellchecker/write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:84)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1098)
at org.apache.lucene.search.spell.SpellChecker.clearIndex(SpellChecker.java:535)
at org.apache.solr.spelling.IndexBasedSpellChecker.build(IndexBasedSpellChecker.java:88)
... 18 more
这只能通过重新启动 Servlet 容器(Tomcat 6)来解决。但是,与 SOLR 通信curl
完全没有问题。只有 PHP 客户端不断抛出此错误。据我们所知,我们甚至根本没有接触过spellchecker
SOLR 的任何模块。崩溃似乎发生在没有索引发生的时候。
我尝试通过增加 RAM 数量并将 WriteLockTimeout 设置为 20 秒来解决这个问题,但问题仍然存在。
有人能帮忙提示一下这个问题是什么吗?
答案1
事实证明这是内存问题。在安装 tomcat 时,有人将 JVM 的最大堆大小设置为 128M,这导致 JVM 停止分配任何内存。OutOfMemoryException
我们没有收到正确的信息,而是收到了这些神秘的消息。
答案2
如果您根本不触及拼写检查器模块,您可以从配置中取消注释该部分并重新启动服务吗?
我认为您收到了多个“&spellcheck.build=true”请求(因此它在构建时尝试重建,因此被锁定) - 如果您将所有 solr 请求记录在某处,请检查是否可以阻止它们?