LockObtainFailedException atualizando o índice de pesquisa Lucene usando solr
Eu pesquisei muito isso no Google. A maioria desses problemas é causada por um bloqueio deixado após uma falha na JVM. Este não é o meu caso.
Tenho um índice com vários leitores e escritores. Estou tentando fazer uma atualização de índice de massa (excluir e adicionar - é assim que o lucene faz atualizações). Estou usando o servidor incorporado do solr (org.apache.solr.client.solrj.embedded.EmbeddedSolrServer). Outros gravadores estão usando o servidor remoto sem streaming (org.apache.solr.client.solrj.impl.CommonsHttpSolrServer).
Eu inicio esta atualização em massa, ela corre bem por um tempo e depois morre com um
Causado por: org.apache.lucene.store.LockObtainFailedException: O bloqueio da obtenção expirou: NativeFSLock @ / ... / lucene-ff783c5d8800fd9722a95494d07d7e37-write.lock
Ajustei meus tempos limite de bloqueio em solrconfig.xml
<writeLockTimeout>20000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
Estou prestes a começar a ler o código lucene para descobrir isso. Qualquer ajuda para que eu não precise fazer isso seria ótimo!
EDIT: Todas as minhas atualizações passam pelo seguinte código (Scala):
val req = new UpdateRequest
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)
req.add(docs)
val rsp = req.process(solrServer)
solrServer
é uma instância de org.apache.solr.client.solrj.impl.CommonsHttpSolrServer, org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer ou org.apache.solr.client.solrj.embedded.EmbeddedSolrServe
OUTRA EDIÇÃO: Parei de usar o EmbeddedSolrServer e agora funciona. Eu tenho dois processos separados que atualizam o índice de pesquisa solr:
1) Servlet 2) Ferramenta de linha de comando
A ferramenta de linha de comando estava usando o EmbeddedSolrServer e acabaria travando com o LockObtainFailedException. Quando comecei a usar o StreamingUpdateSolrServer, os problemas desaparecera
Ainda estou um pouco confuso que o EmbeddedSolrServer funcione. Alguém pode explicar isso. Eu pensei que seria bom com o processo Servlet e eles esperariam enquanto o outro está escrevend