LockObtainFailedException actualizando el índice de búsqueda de Lucene usando solr
He buscado en Google esto mucho. La mayoría de estos problemas son causados por un bloqueo que queda después de un bloqueo de JVM. Este no es mi caso.
Tengo un índice con múltiples lectores y escritores. Estoy tratando de hacer una actualización de índice masivo (eliminar y agregar, así es como lucene actualiza). Estoy usando el servidor integrado de solr (org.apache.solr.client.solrj.embedded.EmbeddedSolrServer). Otros escritores están utilizando el servidor remoto sin transmisión (org.apache.solr.client.solrj.impl.CommonsHttpSolrServer).
omienzo esta actualización masiva, funciona bien por un tiempo, luego muere con un
Causado por: org.apache.lucene.store.LockObtainFailedException: El tiempo de espera de bloqueo se agotó: NativeFSLock @ / ... / lucene-ff783c5d8800fd9722a95494d07d7e37-write.lock
He ajustado mis tiempos de espera de bloqueo en solrconfig.xml
<writeLockTimeout>20000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
Estoy a punto de comenzar a leer el código lucene para resolver esto. ¡Cualquier ayuda para no tener que hacer esto sería genial!
EDIT: todas mis actualizaciones pasan por el siguiente código (Scala):
val req = new UpdateRequest
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)
req.add(docs)
val rsp = req.process(solrServer)
solrServer
es una instancia de org.apache.solr.client.solrj.impl.CommonsHttpSolrServer, org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer o org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.
ANOTHER EDIT: dejé de usar EmbeddedSolrServer y ahora funciona. Tengo dos procesos separados que actualizan el índice de búsqueda de solr:
1) Servlet 2) Herramienta de línea de comando
La herramienta de línea de comando estaba usando EmbeddedSolrServer y eventualmente se bloqueaba con LockObtainFailedException. Cuando comencé a usar StreamingUpdateSolrServer, los problemas desaparecieron.
Todavía estoy un poco confundido de que EmbeddedSolrServer funcione en absoluto. ¿Alguien puede explicar esto? Pensé que sería bueno con el proceso de Servlet y esperarían mientras el otro está escribiendo.