You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2007/08/03 20:41:23 UTC

svn commit: r562546 - in /lucene/java/trunk: CHANGES.txt src/java/org/apache/lucene/index/IndexFileDeleter.java src/java/org/apache/lucene/index/IndexWriter.java

Author: mikemccand
Date: Fri Aug  3 11:41:22 2007
New Revision: 562546

URL: http://svn.apache.org/viewvc?view=rev&rev=562546
Log:
LUCENE-948: handle stale dir listing caches on NFS (so quickly switching writers between machines works)

Modified:
    lucene/java/trunk/CHANGES.txt
    lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java
    lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java

Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?view=diff&rev=562546&r1=562545&r2=562546
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Fri Aug  3 11:41:22 2007
@@ -61,6 +61,11 @@
  9. LUCENE-832: ParallelReader fixed to not throw NPE if isCurrent(),
     isOptimized() or getVersion() is called. (Michael Busch)
       
+10. LUCENE-948: Fix FNFE exception caused by stale NFS client
+    directory listing caches when writers on different machines are
+    sharing an index over NFS and using a custom deletion policy (Mike
+    McCandless)
+
 New features
 
  1. LUCENE-906: Elision filter for French.

Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java?view=diff&rev=562546&r1=562545&r2=562546
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java Fri Aug  3 11:41:22 2007
@@ -23,6 +23,7 @@
 import org.apache.lucene.store.Directory;
 
 import java.io.IOException;
+import java.io.FileNotFoundException;
 import java.io.PrintStream;
 import java.util.Map;
 import java.util.HashMap;
@@ -123,6 +124,9 @@
     this.docWriter = docWriter;
     this.infoStream = infoStream;
 
+    if (infoStream != null)
+      message("init: current segments file is \"" + segmentInfos.getCurrentSegmentFileName() + "\"");
+
     this.policy = policy;
     this.directory = directory;
 
@@ -156,13 +160,29 @@
               message("init: load commit \"" + fileName + "\"");
             }
             SegmentInfos sis = new SegmentInfos();
-            sis.read(directory, fileName);
-            CommitPoint commitPoint = new CommitPoint(sis);
-            if (sis.getGeneration() == segmentInfos.getGeneration()) {
-              currentCommitPoint = commitPoint;
+            try {
+              sis.read(directory, fileName);
+            } catch (FileNotFoundException e) {
+              // LUCENE-948: on NFS (and maybe others), if
+              // you have writers switching back and forth
+              // between machines, it's very likely that the
+              // dir listing will be stale and will claim a
+              // file segments_X exists when in fact it
+              // doesn't.  So, we catch this and handle it
+              // as if the file does not exist
+              if (infoStream != null) {
+                message("init: hit FileNotFoundException when loading commit \"" + fileName + "\"; skipping this commit point");
+              }
+              sis = null;
+            }
+            if (sis != null) {
+              CommitPoint commitPoint = new CommitPoint(sis);
+              if (sis.getGeneration() == segmentInfos.getGeneration()) {
+                currentCommitPoint = commitPoint;
+              }
+              commits.add(commitPoint);
+              incRef(sis, true);
             }
-            commits.add(commitPoint);
-            incRef(sis, true);
           }
         }
       }

Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java?view=diff&rev=562546&r1=562545&r2=562546
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java Fri Aug  3 11:41:22 2007
@@ -928,6 +928,8 @@
 
       if (commitPending) {
         segmentInfos.write(directory);         // now commit changes
+        if (infoStream != null)
+          infoStream.println("close: wrote segments file \"" + segmentInfos.getCurrentSegmentFileName() + "\"");
         deleter.checkpoint(segmentInfos, true);
         commitPending = false;
         rollbackSegmentInfos = null;
@@ -1478,6 +1480,8 @@
   private void checkpoint() throws IOException {
     if (autoCommit) {
       segmentInfos.write(directory);
+      if (infoStream != null)
+        infoStream.println("checkpoint: wrote segments file \"" + segmentInfos.getCurrentSegmentFileName() + "\"");
     } else {
       commitPending = true;
     }