You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2011/05/25 20:18:08 UTC

svn commit: r1127615 - /lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java

Author: shaie
Date: Wed May 25 18:18:07 2011
New Revision: 1127615

URL: http://svn.apache.org/viewvc?rev=1127615&view=rev
Log:
LUCENE-3144: FreqProxTermsWriter leaks file handles

Modified:
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java?rev=1127615&r1=1127614&r2=1127615&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/FreqProxTermsWriter.java Wed May 25 18:18:07 2011
@@ -57,9 +57,10 @@ final class FreqProxTermsWriter extends 
 
     final FieldsConsumer consumer = state.segmentCodecs.codec().fieldsConsumer(state);
 
-    TermsHash termsHash = null;
-
-    /*
+    try {
+      TermsHash termsHash = null;
+      
+      /*
     Current writer chain:
       FieldsConsumer
         -> IMPL: FormatPostingsTermsDictWriter
@@ -69,36 +70,38 @@ final class FreqProxTermsWriter extends 
                 -> IMPL: FormatPostingsDocsWriter
                   -> PositionsConsumer
                     -> IMPL: FormatPostingsPositionsWriter
-    */
-
-    for (int fieldNumber = 0; fieldNumber < numAllFields; fieldNumber++) {
-      final FieldInfo fieldInfo = allFields.get(fieldNumber).fieldInfo;
-
-      final FreqProxTermsWriterPerField fieldWriter = allFields.get(fieldNumber);
-
-      // Aggregate the storePayload as seen by the same
-      // field across multiple threads
-      if (!fieldInfo.omitTermFreqAndPositions) {
-        fieldInfo.storePayloads |= fieldWriter.hasPayloads;
+       */
+      
+      for (int fieldNumber = 0; fieldNumber < numAllFields; fieldNumber++) {
+        final FieldInfo fieldInfo = allFields.get(fieldNumber).fieldInfo;
+        
+        final FreqProxTermsWriterPerField fieldWriter = allFields.get(fieldNumber);
+        
+        // Aggregate the storePayload as seen by the same
+        // field across multiple threads
+        if (!fieldInfo.omitTermFreqAndPositions) {
+          fieldInfo.storePayloads |= fieldWriter.hasPayloads;
+        }
+        
+        // If this field has postings then add them to the
+        // segment
+        fieldWriter.flush(fieldInfo.name, consumer, state);
+        
+        TermsHashPerField perField = fieldWriter.termsHashPerField;
+        assert termsHash == null || termsHash == perField.termsHash;
+        termsHash = perField.termsHash;
+        int numPostings = perField.bytesHash.size();
+        perField.reset();
+        perField.shrinkHash(numPostings);
+        fieldWriter.reset();
       }
-
-      // If this field has postings then add them to the
-      // segment
-      fieldWriter.flush(fieldInfo.name, consumer, state);
-
-      TermsHashPerField perField = fieldWriter.termsHashPerField;
-      assert termsHash == null || termsHash == perField.termsHash;
-      termsHash = perField.termsHash;
-      int numPostings = perField.bytesHash.size();
-      perField.reset();
-      perField.shrinkHash(numPostings);
-      fieldWriter.reset();
-    }
-
-    if (termsHash != null) {
-      termsHash.reset();
+      
+      if (termsHash != null) {
+        termsHash.reset();
+      }
+    } finally {
+      consumer.close();
     }
-    consumer.close();
   }
 
   BytesRef payload;