У меня это было много. Большинство из этих проблем вызвано тем, что блокировка оставлена после сбоя JVM. Это не мое дело.
У меня есть индекс с несколькими читателями и писателями. Я пытаюсь сделать массовое обновление индекса (удалить и добавить - то, как lucene делает обновления). Я использую встроенный сервер solr (org.apache.solr.client.solrj.embedded.EmbeddedSolrServer). Другие авторы используют удаленный, не потоковый сервер (org.apache.solr.client.solrj.impl.CommonsHttpSolrServer).
Я запускаю это массовое обновление, он отлично работает некоторое время, а затем умирает с
Вызвано: org.apache.lucene.store.LockObtainFailedException: Время ожидания блокировки: NativeFSLock @/.../Lucene-ff783c5d8800fd9722a95494d07d7e37-write.lock
Я скорректировал таймауты блокировки в файле solrconfig.xml
<writeLockTimeout>20000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
Я собираюсь начать читать код lucene, чтобы понять это. Любая помощь, поэтому мне не нужно делать это было бы здорово!
EDIT: все мои обновления проходят через следующий код (Scala):
val req = new UpdateRequest
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)
req.add(docs)
val rsp = req.process(solrServer)
solrServer
- это экземпляр org.apache.solr.client.solrj.impl.CommonsHttpSolrServer, org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer или org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.
ДРУГОЕ ИЗМЕНЕНИЕ: Я прекратил использование EmbeddedSolrServer, и теперь он работает. У меня есть два отдельных процесса, которые обновляют индекс поиска solr:
1) Сервлет 2) Инструмент командной строки
Инструмент командной строки использовал EmbeddedSolrServer, и он в конечном итоге потерпел бы крах с помощью LockObtainFailedException. Когда я начал использовать StreamingUpdateSolrServer, проблемы исчезли.
Я все еще немного смущен, что EmbeddedSolrServer будет работать вообще. Может кто-то объяснить это. Я думал, что он будет хорошо работать с процессом Servlet, и они будут ждать, пока другой пишет.