, Второе издание, Майкл МакКэндлесс, Эрик Хэтчер и Отис Господнетич, 2010

го гуглил это. Большинство этих проблем вызвано блокировкой, оставшейся после сбоя 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, чтобы понять это. Любая помощь, так что мне не нужно это делать, было бы здорово!

РЕДАКТИРОВАТЬ: Все мои обновления проходят через следующий код (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, и они будут ждать, пока другой пишет.

Ответы на вопрос(2)

Ваш ответ на вопрос