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