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/01/09 18:14:06 UTC

svn commit: r494492 - in /lucene/java/trunk: CHANGES.txt src/java/org/apache/lucene/index/IndexReader.java src/test/org/apache/lucene/index/TestIndexReader.java

Author: mikemccand
Date: Tue Jan  9 09:13:57 2007
New Revision: 494492

URL: http://svn.apache.org/viewvc?view=rev&rev=494492
Log:
LUCENE-768: make sure IndexReader.close releases write lock even after hitting an exception in one of the methods that acquire the write lock

Modified:
    lucene/java/trunk/CHANGES.txt
    lucene/java/trunk/src/java/org/apache/lucene/index/IndexReader.java
    lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java

Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?view=diff&rev=494492&r1=494491&r2=494492
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Tue Jan  9 09:13:57 2007
@@ -295,6 +295,11 @@
     in mergeSegments, when the corrupted segment is merged with
     segment(s) after it. (Mike McCandless)
 
+30. LUCENE-768: Fix case where an Exception during deleteDocument,
+    undeleteAll or setNorm in IndexReader could leave the reader in a
+    state where close() fails to release the write lock.
+    (Mike McCandless)
+
 Optimizations
 
   1. LUCENE-586: TermDocs.skipTo() is now more efficient for

Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexReader.java?view=diff&rev=494492&r1=494491&r2=494492
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexReader.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexReader.java Tue Jan  9 09:13:57 2007
@@ -425,8 +425,8 @@
           throws IOException{
     if(directoryOwner)
       aquireWriteLock();
-    doSetNorm(doc, field, value);
     hasChanges = true;
+    doSetNorm(doc, field, value);
   }
 
   /** Implements setNorm in subclass.*/
@@ -580,8 +580,8 @@
   public final synchronized void undeleteAll() throws IOException{
     if(directoryOwner)
       aquireWriteLock();
-    doUndeleteAll();
     hasChanges = true;
+    doUndeleteAll();
   }
 
   /** Implements actual undeleteAll() in subclass. */

Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java?view=diff&rev=494492&r1=494491&r2=494492
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java Tue Jan  9 09:13:57 2007
@@ -788,7 +788,39 @@
         fail("delete of out-of-bounds doc number failed to hit exception");
       }
     }
-    
+
+    public void testExceptionReleaseWriteLockJIRA768() throws IOException {
+
+      Directory dir = new RAMDirectory();      
+      IndexWriter writer  = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
+      addDoc(writer, "aaa");
+      writer.close();
+
+      IndexReader reader = IndexReader.open(dir);
+      try {
+        reader.deleteDocument(1);
+        fail("did not hit exception when deleting an invalid doc number");
+      } catch (ArrayIndexOutOfBoundsException e) {
+        // expected
+      }
+      reader.close();
+      if (IndexReader.isLocked(dir)) {
+        fail("write lock is still held after close");
+      }
+
+      reader = IndexReader.open(dir);
+      try {
+        reader.setNorm(1, "content", (float) 2.0);
+        fail("did not hit exception when calling setNorm on an invalid doc number");
+      } catch (ArrayIndexOutOfBoundsException e) {
+        // expected
+      }
+      reader.close();
+      if (IndexReader.isLocked(dir)) {
+        fail("write lock is still held after close");
+      }
+    }
+
     private String arrayToString(String[] l) {
       String s = "";
       for(int i=0;i<l.length;i++) {