Hi Koji,

Thanks for your help, would not have found that soon ... You are right, if I
apply your code, the IOException comes.

I only see one difference in the constructor of the IndexWriter class:
"closeDir" is 'true' in my scenario and 'false' in your scenario. What is
reason for this difference? And if there is a valid reason, it might be
useful to add this to the javaDoc of the IndexWriter class.

See below the difference in the constructor:

When passing a Directory object:
            public IndexWriter(Directory d, Analyzer a, boolean create)
throws IOException {
                   this(d, a, create, false);
            }

When passing a String path:
           public IndexWriter(String path, Analyzer a, boolean create)
throws IOException {
                  this(FSDirectory.getDirectory(path, create), a, create,
true);
           }

Dick

On 1/10/06, Koji Sekiguchi <[EMAIL PROTECTED]> wrote:
>
> Hello Dick,
>
> Why you couldn't get an IOException when obtaining the second
> writer because you used IndexWriter(String,Analyzer,boolean) version
> constructor. Try IndexWriter(Directory,Analyzer,boolean) version instead:
>
> To do it, add the following code on your program:
>
> import org.apache.lucene.store.Directory;
> import org.apache.lucene.store.FSDirectory;
>
>     private Directory directory;
>
>     private Directory getDirectory() throws IOException {
>         if( directory == null ){
>             directory = FSDirectory.getDirectory( indexDir, true );
>         }
>         return directory;
>     }
>
> And use the following method:
>
>      private IndexWriter getWriter(String name, boolean createIndex)
> throws
> IOException
>      {
>          System.out.println("Opening writer " + name + " on: " +
> this.indexDir);
>          //return new IndexWriter(this.indexDir, this.analyzer,
> createIndex);
>          return new IndexWriter(getDirectory(), this.analyzer,
> createIndex);
>      }
>
> If IndexWriter(path,Analyzer,true) is used,
> IndexWriter calls FSDirectory.getDirectory(path,true) and
> FSDirectory overwrites the existing lock file.
>
> Hope this helps,
>
> Koji
>
> > -----Original Message-----
> > From: Dick de Jong [mailto:[EMAIL PROTECTED]
> > Sent: Sunday, January 08, 2006 1:54 PM
> > To: java-user@lucene.apache.org
> > Subject: Basic question on opening 2 IndexWriters on same
> > Directory - I do not get IOException ...
> >
> >
> > Question:
> >       Run attached java class and see the also attached when I ran it.
> >       I assumed the second writer should get an IOException in
> > getWriter (in
> > first TESTCASE).
> >       However this does not happen! This only happens when I open both
> > writers with flag 'createIndex'=true (see
> >       also second test case).
> >
> >       Is this a misunderstanding from my side or what is this?
> >
> > ENVIRONMENT:
> >       Windows Professional XP SP2
> >       Lucene 1.4 (java)
> >
> >
> > OUTPUT OF MAIN METHOD:
> > =======================
> >    START TESTCASE
> >    Test open 2 index writers on index c:\temp\indexdir
> >          writer 1 uses createIndex =true
> >          writer 2 uses createIndex =true               // why not an
> > IOException here ??
> >    Opening writer w1 on: c:\temp\indexdir
> >    Writing document to index using writer :w1
> >    Opening writer w2 on: c:\temp\indexdir
> >    Writing document to index using writer :w2
> >    Writing document to index using writer :w1
> >    Closing writer w1
> >    Closing writer w2
> >    END of test case ...
> >    =======================
> >    =======================
> >    START TESTCASE
> >    Test open 2 index writers on index c:\temp\indexdir
> >          writer 1 uses createIndex =true
> >          writer 2 uses createIndex =false
> >    Opening writer w1 on: c:\temp\indexdir
> >    Writing document to index using writer :w1
> >    Opening writer w2 on: c:\temp\indexdir
> >    In open writer caught IOException:
> >         Lock obtain timed out:
> > [EMAIL PROTECTED]:\DOCUME~1\ddjong\LOCALS~1\Temp\lucene-
> > ea51d1f7bb672168eda3ee90698e936d-write.lock
> >    Closing writer w1
> >    END of test case ...
> >    =======================
> >
> > USED JAVA class (src):
> > ==================================
> >
> > import java.io.IOException;
> >
> > import org.apache.lucene.analysis.Analyzer;
> > import org.apache.lucene.analysis.standard.StandardAnalyzer;
> > import org.apache.lucene.index.IndexWriter;
> > import org.apache.lucene.document.Document;
> > import org.apache.lucene.document.Field;
> >
> > public class TestIndexWriter
> > {
> >
> >      private IndexWriter w1;
> >      private IndexWriter w2;
> >      private String indexDir;
> >
> >      private Analyzer analyzer;
> >      private Document document;
> >
> >      private TestIndexWriter()
> >      {
> >          // just create dummy document for test purposes, document is
> > reused.
> >          this.document = new Document();
> >          this.document.add(Field.Keyword("fname", "fvalue"));
> >
> >          // indexDirectory Folder to be used
> >          this.indexDir = "c:\\temp\\indexdir";
> >
> >          this.analyzer = new StandardAnalyzer();
> >      }
> >
> >      private IndexWriter getWriter(String name, boolean
> > createIndex) throws
> > IOException
> >      {
> >          System.out.println("Opening writer " + name + " on: " +
> > this.indexDir);
> >          return new IndexWriter(this.indexDir, this.analyzer,
> > createIndex);
> >      }
> >
> >      private void closeWriter(String name, IndexWriter w)
> >      {
> >          try {
> >              if (w != null) {
> >                  System.out.println("Closing writer " + name);
> >                  w.close();
> >              }
> >          }
> >          catch (IOException e) {
> >              System.out.println("Don't bubble error in close
> > writer; error:
> > \n" + e.getMessage());
> >          }
> >      }
> >
> >      private void addDocument(String name, IndexWriter w) throws
> > IOException
> >      {
> >          System.out.println("Writing document to index using writer :" +
> > name);
> >          w.addDocument(this.document);
> >      }
> >
> >
> >      public void testOpenIndexWriters(boolean w1_create, boolean
> > w2_create)
> >      {
> >          System.out.println("=======================");
> >          System.out.println("START TESTCASE");
> >          System.out.println("Test open 2 index writers on index " +
> > this.indexDir);
> >
> >          System.out.println(" \twriter 1 uses createIndex =" +
> w1_create);
> >          System.out.println(" \twriter 2 uses createIndex =" +
> w2_create);
> >
> >          this.w1 = this.w2 = null;
> >          try
> >          {
> >              w1 = this.getWriter("w1", w1_create);
> >              addDocument("w1", w1);
> >              w2 = this.getWriter("w2", w2_create);
> >              addDocument("w2", w2);
> >              addDocument("w1", w1);
> >          }
> >          catch (IOException e)
> >          {
> >              System.out.println("In open writer caught IOException:");
> >              System.out.println("\t" + e.getMessage());
> >          }
> >          finally
> >          {
> >              this.closeWriter("w1", w1);
> >              this.closeWriter("w2", w2);
> >              System.out.println("END of test case ...");
> >              System.out.println("=======================");
> >          }
> >      }
> >
> >      public static void main(String[] args)
> >      {
> >          TestIndexWriter tw = new TestIndexWriter();
> >          tw.testOpenIndexWriters(true, true);
> >          tw.testOpenIndexWriters(true, false);
> >      }
> > }
> >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to