2017-10-20 48 views
0

J'ai une application Java qui s'exécute sur Jetty 9.2. Les deux utilisent la même version de Jetty. L'indexeur s'exécute la première fois que l'application démarre après le déploiement. Je n'ai pas eu de problèmes sur ma boîte de dev Windows 10 dans Netbeans. Cela ne fonctionne pas quand je le mets sur une machine Linux, que j'ai seulement l'accès SSH et les droits limités. Code java, classe Personne exécute en premier, classe Organisation exécute deuxième. à la fois dans la même session de mise en veille prolongéeLucene indexer fonctionne sous Windows, échoue sous Linux

public static void reindexViaMassIndexer(Class<?> type, SessionFactory factory) { 
    Session session = factory.getCurrentSession(); 
    FullTextSession fullTextSession = Search.getFullTextSession(session); 
    MassIndexerProgressMonitor monitor = new SimpleIndexingProgressMonitor(); 

    try { 
     fullTextSession 
       .createIndexer(type) 
       .typesToIndexInParallel(1) 
       .batchSizeToLoadObjects(BATCH_SIZE) 
       .cacheMode(CacheMode.NORMAL) 
       .threadsToLoadObjects(10) 
       .idFetchSize(BATCH_SIZE) 
       .progressMonitor(monitor) 
       .startAndWait(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(HibernateLuceneIndexer.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

Pom fichier

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-search-orm</artifactId> 
     <version>5.2.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>4.3.9.Final</version> 
    </dependency> 
sortie d'erreur

17:48:00,188 ERROR LogErrorHandler:67 - HSEARCH000058: Exception occurred org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException 
Primary Failure: 
    Entity org.vtarc.CyberConnections.backend.entity.Organization Id null Work Type org.hibernate.search.backend.PurgeAllLuceneWork 

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException 
    at org.apache.lucene.store.Lock.obtain(Lock.java:89) 
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:755) 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:131) 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:97) 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:112) 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81) 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:47) 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.applyChangesets(SyncWorkProcessor.java:145) 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.run(SyncWorkProcessor.java:135) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.nio.channels.OverlappingFileLockException 
    at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) 
    at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) 
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1108) 
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155) 
    at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:169) 
    at org.apache.lucene.store.Lock.obtain(Lock.java:96) 
    ... 9 more 

index personne avec succès, l'organisation a échoué. Notez que le répertoire parent est également jetty: jetty (utilisateur: groupe).

[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ ls -l 
-rw-r-----. 1 jetty jetty 1844 Oct 20 18:43 _9.fdt 
-rw-r-----. 1 jetty jetty 67 Oct 20 18:43 _9.fdx 
-rw-r-----. 1 jetty jetty 1310 Oct 20 18:43 _9.fnm 
-rw-r-----. 1 jetty jetty 3687 Oct 20 18:43 _9_Lucene41_0.doc 
-rw-r-----. 1 jetty jetty 4310 Oct 20 18:43 _9_Lucene41_0.pos 
-rw-r-----. 1 jetty jetty 20500 Oct 20 18:43 _9_Lucene41_0.tim 
-rw-r-----. 1 jetty jetty 576 Oct 20 18:43 _9_Lucene41_0.tip 
-rw-r-----. 1 jetty jetty 1530 Oct 20 18:43 _9.nvd 
-rw-r-----. 1 jetty jetty 171 Oct 20 18:43 _9.nvm 
-rw-r-----. 1 jetty jetty 386 Oct 20 18:43 _9.si 
-rw-r-----. 1 jetty jetty 102 Oct 20 18:43 segments_a 
-rw-r-----. 1 jetty jetty 36 Oct 20 18:43 segments.gen 
-rw-r-----. 1 jetty jetty  0 Oct 20 14:31 write.lock 
[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ cd ../org.vtarc.CyberConnections.backend.entity.Organization/ 
[[email protected] org.vtarc.CyberConnections.backend.entity.Organization]$ ls -l 
-rw-r-----. 1 jetty jetty 53 Oct 20 15:40 segments_5 
-rw-r-----. 1 jetty jetty 36 Oct 20 15:40 segments.gen 
-rw-r-----. 1 jetty jetty 0 Oct 20 14:31 write.lock 

besoin d'autre chose?

Répondre

1

Une explication possible est que vous créez plusieurs SessionFactories/EntityManagerFactories pour la même configuration, instanciant ainsi Hibernate Search plusieurs fois et créant des conflits de verrouillage sur les fichiers d'index. Si oui, eh bien, ne le faites pas. Voir aussi Hibernate search: persist causes sometimes OverlappingFileLockException

Autre explication possible: cette version d'Hibernate Search est vraiment ancienne. Vous rencontrez peut-être un bug qui a été résolu depuis. Je sais qu'il y a plusieurs bugs liés au verrouillage qui ont été résolus, par exemple celui-ci: https://stackoverflow.com/a/46284827/6692043

+0

bien que je fasse tourner une session Hibernate à 2 endroits, le premier arrive au servlet initialisé et il est fermé après la fin de l'indexeur. La deuxième session ne démarre pas avant l'initialisation de l'interface utilisateur principale. celui-ci reste dans la portée. – AFowler

+0

Il semble que ce soit l'option numéro 2 ou une condition de concurrence. J'ai changé la journalisation de l'information à déboguer et tout a fonctionné. Par conséquent, plus de journaux entraînent un ralentissement de l'application, ce qui permet à tout le processus de se dérouler correctement. en attendant un autre test pour voir si cette théorie est correcte. – AFowler

+0

@AFowler Notez que je parlais de Session * Factory * et non de Session. L'utilisation de plusieurs sessions en parallèle devrait fonctionner correctement, mais plusieurs SessionFactories utilisant les mêmes index ne le seront pas. Je dis "* devrait * fonctionner correctement", car comme je l'ai déjà mentionné, il s'agit d'une ancienne version de Hibernate Search et pourrait être boguée. –