LockObtainFailedException mise à jour de l'index de recherche Lucene en utilisant solr
J'ai googlé ce beaucoup. La plupart de ces problèmes sont causés par un verrouillage d'être de gauche autour après une JVM crash. Ce n'est pas mon cas.
J'ai un index avec plusieurs lecteurs et d'écrivains. Je suis suis en train de faire une mise à jour de l'indice de masse (supprimer et ajouter-c'est à quel lucene ne les mises à jour). Je suis l'aide de solr est un serveur embarqué (org.apache.solr.client.solrj.incorporé.EmbeddedSolrServer). D'autres écrivains sont à l'aide de la télécommande, non-serveur de streaming (org.apache.solr.client.solrj.impl.CommonsHttpSolrServer).
J'ai le coup d'envoi de cette mise à jour en masse, il fonctionne très bien pendant un moment, puis meurt avec un
Causés par:
org.apache.lucene.magasin.LockObtainFailedException:
Verrouillage obtenir timed out:
NativeFSLock@/.../lucene-ff783c5d8800fd9722a95494d07d7e37-écrire.verrouillage
J'ai ajusté mon délais de verrouillage en solrconfig.xml
<writeLockTimeout>20000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
Je suis sur le point de commencer la lecture de la lucene code pour comprendre cela. Toute aide donc je n'ai pas à faire ce serait super!
EDIT: Toutes mes mises à jour de passer par le code suivant (Scala):
val req = new UpdateRequest
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)
req.add(docs)
val rsp = req.process(solrServer)
solrServer
est une instance de org.apache.solr.client.solrj.impl.CommonsHttpSolrServer, org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer, ou org.apache.solr.client.solrj.incorporé.EmbeddedSolrServer.
UN AUTRE EDIT:
J'ai cessé d'utiliser EmbeddedSolrServer et cela fonctionne maintenant. J'ai deux processus distincts de mise à jour de l'index de recherche solr:
1) de la Servlet
2) outil de ligne de Commande
L'outil de ligne de commande a l'aide de la EmbeddedSolrServer et qu'il finirait par se bloquer avec le LockObtainFailedException. Quand j'ai commencé à utiliser StreamingUpdateSolrServer, les problèmes ont disparu.
Je suis encore un peu confus que le EmbeddedSolrServer fonctionne pas du tout. Quelqu'un peut m'expliquer ce. Je pensais qu'il allait jouer bien avec la Servlet et qu'ils devraient attendre tandis que l'autre est écrit.
source d'informationauteur three-cups
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous êtes en train de faire quelque chose comme:
La raison pour laquelle cela ne fonctionne pas est parce que l'écrivain reste ouverte, à moins que vous le fermez. Donc
writer1
écrit et détient le verroumême après qu'il est fait par écrit. (Une fois qu'un écrivain obtient un verrou, il ne dévoile jamais jusqu'à ce qu'il soit détruit.)writer2
ne pouvez pas obtenir le verrou, depuis writer1 est encore de s'y accrocher, de sorte qu'il jette unLockObtainFailedException
.Si vous souhaitez utiliser deux écrivains, vous auriez besoin de faire quelque chose comme:
Puisque vous ne pouvez avoir qu'un écrivain ouvertes en même temps, ce joli beaucoup nie tout avantage que vous obtenez de l'aide de plusieurs écrivains. (C'est en fait bien pire pour les ouvrir et les fermer tout le temps car vous serez constamment payer un warmup de pénalité.)
Donc la réponse à ce que je soupçonne est votre question sous-jacente est la suivante: ne pas utiliser plusieurs écrivains. L'utilisation d'un rédacteur unique avec plusieurs threads accèdent (
IndexWriter
est thread-safe). Si vous vous connectez à Solr par le REPOS ou une autre API HTTP, un seul Solr écrivain doit être capable de gérer de nombreuses demandes.Je ne suis pas sûr de ce que votre cas d'utilisation, mais une autre réponse possible est de voir Solr Recommandations pour la gestion de plusieurs indices. En particulier la capacité de l'échange à chaud des noyaux d'intérêt.
>> Mais vous avez plusieurs Solr serveurs écrit au même endroit, non?
Pas, mal. Solr est à l'aide de la Lucene bibliothèques et il est indiqué dans "Lucene dans l'Action" * qu'il ne peut pas être un processus/thread écrit à l'index à la fois. C'est pourquoi l'auteur prend un verrou.
Votre processus simultanés qui tentent d'écrire pourrait, peut-être, vérifiez l'
org.apache.lucene.store.LockObtainFailedException
exception lors de l'instanciation de l'écrivain.Vous pourriez, par exemple, mettre le processus qui instancie
writer2
dans une boucle d'attente à attendre jusqu'à ce que l'actif processus de rédaction de finitions et de questionswriter1.close();
qui sera ensuite libérer le verrou et faire l'index Lucene disponibles pour écrire de nouveau. Alternativement, vous pourriez avoir plusieurs index Lucene (dans différents endroits) écrit en même temps et lorsque vous faites une recherche, vous devrez chercher dans tous les d'entre eux.* "pour l'application du seul écrivain à la fois, ce qui signifie une IndexWriter ou un IndexReader faire de suppressions ou de changer les normes, Lucene utilise un fichier de verrouillage: Si le fichier de verrouillage (écrire.verrouillage par défaut) existe dans votre répertoire d'index, un écrivain a actuellement l'indice de l'ouvrir. Toute tentative de créer un autre écrivain sur le même indice de frapper un LockObtainFailedException. Ce est un élément vital du mécanisme de protection, parce que si les deux écrivains sont créés accidentellement sur un seul indice, il sera très rapidement conduire à l'indice de la corruption."
L'article 2.11.3, Lucene en ActionDeuxième Édition, Michael McCandless, Erik Hatcher, et Otis Gospodnetić, 2010