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 2006/11/30 01:07:48 UTC

svn commit: r480785 - in /lucene/java/trunk: CHANGES.txt src/java/org/apache/lucene/store/FSDirectory.java

Author: mikemccand
Date: Wed Nov 29 16:07:46 2006
New Revision: 480785

URL: http://svn.apache.org/viewvc?view=rev&rev=480785
Log:
LUCENE-669: don't double-close RandomAccessFile in finalize

Modified:
    lucene/java/trunk/CHANGES.txt
    lucene/java/trunk/src/java/org/apache/lucene/store/FSDirectory.java

Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?view=diff&rev=480785&r1=480784&r2=480785
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Wed Nov 29 16:07:46 2006
@@ -230,6 +230,12 @@
     classes from contrib/similarity, as their new home is under
     contrib/queries.
 
+25. LUCENE-669: Do not double-close the RandomAccessFile in
+    FSIndexInput/Output during finalize().  Besides sending an
+    IOException up to the GC, this may also be the cause intermittent
+    "The handle is invalid" IOExceptions on Windows when trying to
+    close readers or writers.
+
 Optimizations
 
   1. LUCENE-586: TermDocs.skipTo() is now more efficient for

Modified: lucene/java/trunk/src/java/org/apache/lucene/store/FSDirectory.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/store/FSDirectory.java?view=diff&rev=480785&r1=480784&r2=480785
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/store/FSDirectory.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/store/FSDirectory.java Wed Nov 29 16:07:46 2006
@@ -504,11 +504,17 @@
   }
 
   private Descriptor file = null;
+  
+  // remember if the file is open, so that we don't try to close it
+  // more than once
+  private boolean isOpen;       
+  
   boolean isClone;
   private long length;
 
   public FSIndexInput(File path) throws IOException {
     file = new Descriptor(path, "r");
+    isOpen = true;
     length = file.length();
   }
 
@@ -533,8 +539,12 @@
   }
 
   public void close() throws IOException {
-    if (!isClone)
+    // only close the file if this is not a clone and the
+    // file has not been closed yet
+    if (!isClone && isOpen) {
       file.close();
+      isOpen = false;
+    }
   }
 
   protected void seekInternal(long position) {
@@ -566,8 +576,13 @@
 class FSIndexOutput extends BufferedIndexOutput {
   RandomAccessFile file = null;
 
+  // remember if the file is open, so that we don't try to close it
+  // more than once
+  private boolean isOpen;
+
   public FSIndexOutput(File path) throws IOException {
     file = new RandomAccessFile(path, "rw");
+    isOpen = true;
   }
 
   /** output methods: */
@@ -575,8 +590,12 @@
     file.write(b, 0, size);
   }
   public void close() throws IOException {
-    super.close();
-    file.close();
+    // only close the file if it has not been closed yet
+    if (isOpen) {
+      super.close();
+      file.close();
+      isOpen = false;
+    }
   }
 
   /** Random-access methods */
@@ -589,7 +608,7 @@
   }
 
   protected void finalize() throws IOException {
-    file.close();          // close the file
+    close();          // close the file
   }
 
 }