lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Doug Sale <dougs...@gmail.com>
Subject Deadlock: IndexWriter.addIndexes(IndexReader[])
Date Thu, 19 Feb 2009 18:46:05 GMT
A deadlock issue occurs under the following circumstances
- IndexWriter.autoCommit == true
- IndexWriter.directory contains multiple segments
- IndexWriter.AddIndex(IndexReader[]) is invoked

I put together a JUnit test that recreates the deadlock, which I've
attached.  It is the first test method, 'testAddIndexByIndexReader()'.

In a nutshell, here is what happens:

        // 1) AddIndexes(IndexReader[]) acquires the write lock,
        // then begins optimization of destination index (this is
        // prior to adding any external segments).
        //
        // 2) Main thread starts a ConcurrentMergeScheduler.MergeThread
        // to merge the 2 segments.
        //
        // 3) Merging thread tries to acquire the read lock at
        // IndexWriter.blockAddIndexes(boolean) in
        // IndexWriter.StartCommit(), but cannot as...
        //
        // 4) Main thread still holds the write lock, and is
        // waiting for the IndexWriter.runningMerges data structure
        // to be devoid of merges with their optimize flag
        // set (IndexWriter.optimizeMergesPending()).

I hesitate to enter this as an issue in JIRA, as it is based on a deprecated
constructor (autocommit == true).  Additionally, I noted that
'IndexWriter.AddIndex(Directory[])' has been deprecated and wasn't sure of
the fate of 'IndexWriter.AddIndex(IndexReader[])' in 3.0.

- Doug Sale

Mime
View raw message