You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2011/12/11 17:15:24 UTC

svn commit: r1213017 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/src/java/org/apache/lucene/index/DirectoryReader.java lucene/src/java/org/apache/lucene/index/MultiReader.java

Author: uschindler
Date: Sun Dec 11 16:15:23 2011
New Revision: 1213017

URL: http://svn.apache.org/viewvc?rev=1213017&view=rev
Log:
Merged revision(s) 1213016 from lucene/dev/trunk:
LUCENE-3633: Improve DirectoryReader and MultiReader to use IOUtils when IOExceptions occur during opening segments

Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java?rev=1213017&r1=1213016&r2=1213017&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java Sun Dec 11 16:15:23 2011
@@ -37,6 +37,7 @@ import org.apache.lucene.search.Similari
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.Lock;
 import org.apache.lucene.store.LockObtainFailedException;
+import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.MapBackedSet;
 
 /** 
@@ -108,22 +109,17 @@ class DirectoryReader extends IndexReade
 
     SegmentReader[] readers = new SegmentReader[sis.size()];
     for (int i = sis.size()-1; i >= 0; i--) {
+      IOException prior = null;
       boolean success = false;
       try {
         readers[i] = SegmentReader.get(readOnly, sis.info(i), termInfosIndexDivisor);
         readers[i].readerFinishedListeners = this.readerFinishedListeners;
         success = true;
+      } catch(IOException ex) {
+        prior = ex;
       } finally {
-        if (!success) {
-          // Close all readers we had opened:
-          for(i++;i<sis.size();i++) {
-            try {
-              readers[i].close();
-            } catch (Throwable ignore) {
-              // keep going - we want to clean up as much as possible
-            }
-          }
-        }
+        if (!success)
+          IOUtils.closeWhileHandlingException(prior, readers);
       }
     }
 
@@ -150,6 +146,7 @@ class DirectoryReader extends IndexReade
     segmentInfos = (SegmentInfos) infos.clone();
     int infosUpto = 0;
     for (int i=0;i<numSegments;i++) {
+      IOException prior = null;
       boolean success = false;
       try {
         final SegmentInfo info = infos.info(i);
@@ -164,17 +161,11 @@ class DirectoryReader extends IndexReade
           segmentInfos.remove(infosUpto);
         }
         success = true;
+      } catch(IOException ex) {
+        prior = ex;
       } finally {
-        if (!success) {
-          // Close all readers we had opened:
-          for(SegmentReader reader : readers) {
-            try {
-              reader.close();
-            } catch (Throwable ignore) {
-              // keep going - we want to clean up as much as possible
-            }
-          }
-        }
+        if (!success)
+          IOUtils.closeWhileHandlingException(prior, readers);
       }
     }
 
@@ -223,6 +214,7 @@ class DirectoryReader extends IndexReade
         newReaders[i] = oldReaders[oldReaderIndex.intValue()];
       }
 
+      IOException prior = null;
       boolean success = false;
       try {
         SegmentReader newReader;
@@ -251,6 +243,8 @@ class DirectoryReader extends IndexReade
           }
         }
         success = true;
+      } catch (IOException ex) {
+        prior = ex;
       } finally {
         if (!success) {
           for (i++; i < infos.size(); i++) {
@@ -265,12 +259,14 @@ class DirectoryReader extends IndexReade
                   // closing we must decRef it
                   newReaders[i].decRef();
                 }
-              } catch (IOException ignore) {
-                // keep going - we want to clean up as much as possible
+              } catch (IOException ex) {
+                if (prior == null) prior = ex;
               }
             }
           }
         }
+        // throw the first exception
+        if (prior != null) throw prior;
       }
     }    
     

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java?rev=1213017&r1=1213016&r2=1213017&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java Sun Dec 11 16:15:23 2011
@@ -410,13 +410,20 @@ public class MultiReader extends IndexRe
 
   @Override
   protected synchronized void doClose() throws IOException {
+    IOException ioe = null;
     for (int i = 0; i < subReaders.length; i++) {
-      if (decrefOnClose[i]) {
-        subReaders[i].decRef();
-      } else {
-        subReaders[i].close();
+      try {
+        if (decrefOnClose[i]) {
+          subReaders[i].decRef();
+        } else {
+          subReaders[i].close();
+        }
+      } catch (IOException e) {
+        if (ioe == null) ioe = e;
       }
     }
+    // throw the first exception
+    if (ioe != null) throw ioe;
   }
   
   @Override