【问题标题】:Lucene indexer works on Windows, fails on LinuxLucene 索引器在 Windows 上工作,在 Linux 上失败
【发布时间】:2017-10-20 21:07:35
【问题描述】:

我在 Jetty 9.2 上运行了 java 应用程序。两者都使用相同版本的 Jetty。索引器在应用程序部署后第一次启动时运行。我在 Netbeans 中的 Windows 10 开发盒上没有任何问题。当我把它放在 Linux 机器上时它不起作用,我只有 SSH 访问和有限的权限。

java 代码,Person 类首先运行,Organization 类次之。都在同一个休眠会话中

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 文件

    <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>

错误输出

17:48:00,188 ERROR LogErrorHandler:67 - HSEARCH000058: Exception occurred org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/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: NativeFSLock@/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

人员索引成功,组织失败。注意父目录也是jetty:jetty (user:group)。

[jetty@server 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
[jetty@server org.vtarc.CyberConnections.backend.entity.Person]$ cd ../org.vtarc.CyberConnections.backend.entity.Organization/
[jetty@server 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

还需要什么吗?

【问题讨论】:

    标签: linux windows lucene hibernate-search


    【解决方案1】:

    一种可能的解释是您正在为同一配置创建多个 SessionFactories/EntityManagerFactories,从而多次实例化 Hibernate Search 并在索引文件上创建锁定冲突。如果是这样,好吧,不要。另见Hibernate search: persist causes sometimes OverlappingFileLockException

    另一种可能的解释:这个版本的 Hibernate Search 实在是太老了。您可能遇到了一个已经解决的错误。我知道有几个与锁定相关的错误已经解决,例如这个:https://stackoverflow.com/a/46284827/6692043

    【讨论】:

    • 虽然我确实在 2 个地方启动了一个休眠会话,但第一个发生在 servlet 初始化时,它在索引器完成后关闭。在主 UI 稍后初始化之前,第二个会话不会开始。这个在范围内。
    • 它似乎是选项号 2 或某些竞争条件。我将日志记录从信息更改为调试,一切正常。所以,更多的日志会导致应用程序运行得更慢,这使得一切都以成功的方式发生。等待另一个测试,看看这个理论是否正确。
    • @AFowler 请注意,我说的是 SessionFactory 而不是 Session。并行使用多个会话应该可以正常工作,但使用相同索引的多个 SessionFactories 则不会。我说“应该可以正常工作”,因为正如我已经提到的,这是 Hibernate Search 的旧版本,可能有问题。
    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多