Подтвердить что ты не робот

Solr - LockObtainFailedException при многократной одновременной записи

Мое приложение очень часто записывает solr из нескольких клиентов через REST. Я использую функцию autocommit, используя атрибут "commitWithin". LockObtainFailedException начинает появляться после нескольких дней использования. Мне сложно понять, в чем проблема. Любая помощь приветствуется. Я использую Solr 3.1 с tomcat 6

вот дамп ошибки из solr


HTTP Status 500 - Lock obtain timed out:      [email protected]/var/lib/solr/data/index/write.lock

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/var/lib/solr/data/index/write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:84)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1097)
at org.apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.java:83)
at org.apache.solr.update.UpdateHandler.createMainIndexWriter(UpdateHandler.java:102)
at org.apache.solr.update.DirectUpdateHandler2.openWriter(DirectUpdateHandler2.java:174)
at org.apache.solr.update.DirectUpdateHandler2.addDoc(DirectUpdateHandler2.java:222)
at org.apache.solr.update.processor.RunUpdateProcessor.processAdd(RunUpdateProcessorFactory.java:61)
at org.apache.solr.handler.XMLLoader.processUpdate(XMLLoader.java:147)
at org.apache.solr.handler.XMLLoader.load(XMLLoader.java:77)
at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:55)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1360)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:356)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:252)
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:859)
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:662)
</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Lock obtain timed out: [email protected]/var/lib/solr/data/index/write.lock
4b9b3361

Ответ 1

Я увеличил writeLockTimeout в файле solrconfig.xml до 20 секунд, и теперь он работает нормально. Раньше он был установлен на 1 секунду

Ответ 2

Это обычно происходит, потому что Solr завершается нестандартным способом, поэтому его блокировка не очищается. Произошла ли авария JVM/Solr до того, как это произошло?

Другая причина заключается в том, что вы пытаетесь указать несколько серверов solr в одном месте. См. этот вопрос.

Ответ 3

Это может быть недостаток памяти. Отсутствие памяти может вызвать блокировки, я вижу то же самое на своем сервере.

Из документов apache: Если вашему экземпляру Solr не хватает памяти, выделенной для него, виртуальная машина Java иногда будет вызывать Java OutOfMemoryError. Когда это происходит, нет опасности повреждения данных, и Solr попытается восстановить изящно. Любые добавления/удаления/фиксации в процессе, когда ошибка была выбрана, вряд ли удастся. Могут возникнуть другие неблагоприятные последствия. Например, если используется механизм блокировки SimpleFSLock (как в случае с Solr 1.2), непредвиденный OutOfMemoryError может потенциально привести к тому, что Solr потеряет свою блокировку индекса. Если это произойдет, дальнейшие попытки изменить индекс приведут к

SEVERE: исключение во время commit/optimize: java.io.IOException: время ожидания блокировки: [email protected]/tmp/lucene-5d12dd782520964674beb001c4877b36-write.lock

См. http://wiki.apache.org/solr/SolrPerformanceFactors