You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@lucene.apache.org by David Townsend <da...@magus.co.uk> on 2004/01/14 18:48:41 UTC

Multiple Creation of Writers

In my system indices are created and updated by multiple threads.  I need to check if an index exists to decide whether to pass true or false to the IndexWriter constructor.

new IndexWriter(FSDirectory, Analyzer, boolean);

The problem arises when two threads attempt to create the same index after simultaneously finding that the index does not exist.  This problem can be reproduced in a single thread by

writerA = new IndexWriter(new File("c:/import/test"), new StandardAnalyzer(), true);
writerB = new IndexWriter(new File("c:/import/test"), new StandardAnalyzer(), true);
add1000Docs(writerA);
add1000Docs(writerB);

this will throw an IOException

C:\import\test\_a.fnm (The system cannot find the file specified)

The only solution I can think of is to create a database/file lock to get around this, or change the Lucene code to obtain a lock before creating an index.  Any ideas?

David








---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org


Re: Multiple Creation of Writers

Posted by Michael Giles <mg...@visionstudio.com>.
Couldn't you solve this by creating your own synchronized getWriter 
method?  I'm thinking something like (pseudo code):

protected void myProgram() {
     ...
     File dir = new File("c:/import/test");
     IndexWriter wrt = getWriter(dir, new StandardAnalyzer(), create(dir));
     ...
}

protected boolean create(String dir) {
     return true if index doesn't exist;
}

protected synchronized IndexWriter getWriter(dir, anlyz, crt) {
     if (crt && !create(dir)) {
         crt = false;
     }

     return new IndexWriter(dir, anylz, crt);
}

You would actually want to get fancier on the synchronization and grab a 
mutex that is specific to the directory name, but you get the idea.

-Mike

At 12:48 PM 1/14/2004, David Townsend wrote:
>In my system indices are created and updated by multiple threads.  I need 
>to check if an index exists to decide whether to pass true or false to the 
>IndexWriter constructor.
>
>new IndexWriter(FSDirectory, Analyzer, boolean);
>
>The problem arises when two threads attempt to create the same index after 
>simultaneously finding that the index does not exist.  This problem can be 
>reproduced in a single thread by
>
>writerA = new IndexWriter(new File("c:/import/test"), new 
>StandardAnalyzer(), true);
>writerB = new IndexWriter(new File("c:/import/test"), new 
>StandardAnalyzer(), true);
>add1000Docs(writerA);
>add1000Docs(writerB);
>
>this will throw an IOException
>
>C:\import\test\_a.fnm (The system cannot find the file specified)
>
>The only solution I can think of is to create a database/file lock to get 
>around this, or change the Lucene code to obtain a lock before creating an 
>index.  Any ideas?
>
>David
>
>
>
>
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
>For additional commands, e-mail: lucene-user-help@jakarta.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-user-help@jakarta.apache.org