Here is some stand-alone code that reproduces the problem. There are 2
classes. jvm1 creates the index, jvm2 reads the index. The system console
input is used to synchronize the 4 steps.

jvm1:
--------------
import java.io.File;
import java.util.Scanner;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.SingleInstanceLockFactory;
import org.apache.lucene.search.DefaultSimilarity;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;



public class jvm1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String indexPath;

        try {
            Scanner in = new Scanner(System.in);

            // create index
            indexPath = (args.length > 0) ? args[0] : "index";
            File idxFile  = new File(indexPath);
            idxFile.mkdirs();
            FSDirectory dir = FSDirectory.open(idxFile);
            SingleInstanceLockFactory lockFactory = new
SingleInstanceLockFactory();
            dir.setLockFactory(lockFactory);
            IndexWriter writer = new IndexWriter(dir, new
WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
            writer.setUseCompoundFile(false);
            writer.setSimilarity(new DefaultSimilarity());
            // Add some docs
            Document doc = new Document();
            doc.add(new Field("field", "aaa", Field.Store.YES,
Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
            for(int i=0;i<1000;i++) {
              writer.addDocument(doc);
            }
            writer.commit(); // flush to disk
            // Now wait for jvm2 to create reader
            System.out.println("Index created. Start jvm2 then hit 'Enter'
after jvm2 displays doc count");
            String input = in.nextLine();
            // Add some more docs, the prepare to commit
            for(int i=0;i<1000;i++) {
                  writer.addDocument(doc);
            }
            writer.prepareCommit();
            System.out.println("Index 'prepareCommit' called. Go to jvm2 and
hit 'Enter' (it should then call 'isCurrent')");
            System.out.println("Hit 'Enter' here to commit changes and close
index");
            input = in.nextLine();
            System.out.println("jvm1 about to commit/close index");
            writer.commit();
            writer.close();
            System.out.println("jvm1 done");

        } catch (Exception  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

jvm2:
-------------
import java.util.Scanner;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.FSDirectory;


public class jvm2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String indexPath;
        try {
            Scanner in = new Scanner(System.in);
            indexPath = (args.length > 0) ? args[0] : "index";
            FSDirectory dir = FSDirectory.open(new java.io.File(indexPath));
            IndexReader reader  = IndexReader.open(dir, false);
            System.out.println("jvm2 running,  index doc count:
"+reader.numDocs());
            boolean isCurrent = reader.isCurrent();
            System.out.println("jvm2 isCurrent="+isCurrent);
            System.out.println("waiting for jvm1 to 'prepareCommit'. Hit
'Enter' when this happens");
            String input = in.nextLine();;
            isCurrent = reader.isCurrent();
            System.out.println("jvm2 isCurrent="+isCurrent);
            reader.close();
            System.out.println("done");

        } catch (Exception  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Peter



On Sat, Nov 7, 2009 at 4:17 AM, Michael McCandless <
luc...@mikemccandless.com> wrote:

> Hmm... for step 4 you should have gotten "true" back from isCurrent.
> You're sure there were no intervening calls to IndexWriter.commit?
> Are you using Lucene 2.9?   If not, you have to make sure autoCommit
> is false when opening the IndexWriter.
>
> Mike
>
> On Fri, Nov 6, 2009 at 2:46 PM, Peter Keegan <peterlkee...@gmail.com>
> wrote:
> > Here's a new scenario:
> >
> > 1. JVM 1 creates IndexWriter, version 1
> > 2. JVM 2 creates IndexReader, version 1
> > 3. JVM 1 IndexWriter calls prepareCommit()
> > 4. JVM 2 IndexReader.isCurrent() returns false
> >
> > In step 4, I expected 'isCurrent' to return true until the IndexWriter
> had
> > committed in JVM 1. Is this the correct behavior?
> >
> > Peter
> >
> >
> > On Fri, Nov 6, 2009 at 11:40 AM, Michael McCandless <
> > luc...@mikemccandless.com> wrote:
> >
> >> It will always return a reader reflecting every change done with that
> >> writer (plus, the index as it was when the writer was opened) before
> >> getReader was called.
> >>
> >> It's unaffected by the call to prepareCommit.
> >>
> >> Mike
> >>
> >> On Fri, Nov 6, 2009 at 11:35 AM, Peter Keegan <peterlkee...@gmail.com>
> >> wrote:
> >> > Which version of the index will IndexWriter.getReader() return if
> there
> >> have
> >> > been updates, but no call to 'prepareCommit'?
> >> >
> >> >
> >> > On Fri, Nov 6, 2009 at 11:33 AM, Michael McCandless <
> >> > luc...@mikemccandless.com> wrote:
> >> >
> >> >> On Fri, Nov 6, 2009 at 11:22 AM, Peter Keegan <
> peterlkee...@gmail.com>
> >> >> wrote:
> >> >> >>Can you use IndexWriter.getReader() to get the reader for step 2
> >> >> > Yes - perfect! I didn't think that would be different than
> refreshing
> >> or
> >> >> > recreating an IndexReader.
> >> >>
> >> >> Great!
> >> >>
> >> >> getReader() searches the full index, plus uncommitted changes.
> >> >>
> >> >> > I don't need to keep the old commit alive. The goal is to keep the
> >> >> external
> >> >> > file in synch with the index, so a separate searcher process will
> see
> >> >> > consistent data. By postponing both commits, the window where they
> are
> >> >> out
> >> >> > of synch is very small (2 file renames). I record the Lucene index
> >> >> version
> >> >> > in the external file for checking synchcronization.
> >> >>
> >> >> OK.
> >> >>
> >> >> Mike
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> >> >> For additional commands, e-mail: java-user-h...@lucene.apache.org
> >> >>
> >> >>
> >> >
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> >> For additional commands, e-mail: java-user-h...@lucene.apache.org
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> For additional commands, e-mail: java-user-h...@lucene.apache.org
>
>

Reply via email to