Index: java/org/apache/lucene/index/TermInfosReader.java
===================================================================
--- java/org/apache/lucene/index/TermInfosReader.java	(revision 565943)
+++ java/org/apache/lucene/index/TermInfosReader.java	(working copy)
@@ -48,17 +48,31 @@
 
   TermInfosReader(Directory dir, String seg, FieldInfos fis, int readBufferSize)
        throws CorruptIndexException, IOException {
-    directory = dir;
-    segment = seg;
-    fieldInfos = fis;
+    boolean success = false;
 
-    origEnum = new SegmentTermEnum(directory.openInput(segment + ".tis", readBufferSize),
-                                   fieldInfos, false);
-    size = origEnum.size;
+    try {
+      directory = dir;
+      segment = seg;
+      fieldInfos = fis;
 
-    indexEnum =
-      new SegmentTermEnum(directory.openInput(segment + ".tii", readBufferSize),
-			  fieldInfos, true);
+      origEnum = new SegmentTermEnum(directory.openInput(segment + ".tis",
+          readBufferSize), fieldInfos, false);
+      size = origEnum.size;
+
+      indexEnum = new SegmentTermEnum(directory.openInput(segment + ".tii",
+          readBufferSize), fieldInfos, true);
+
+      success = true;
+    } finally {
+      // With lock-less commits, it's entirely possible (and
+      // fine) to hit a FileNotFound exception above. In
+      // this case, we want to explicitly close any subset
+      // of things that were opened so that we don't have to
+      // wait for a GC to do so.
+      if (!success) {
+        close();
+      }
+    }
   }
 
   public int getSkipInterval() {
Index: java/org/apache/lucene/index/FieldsReader.java
===================================================================
--- java/org/apache/lucene/index/FieldsReader.java	(revision 565943)
+++ java/org/apache/lucene/index/FieldsReader.java	(working copy)
@@ -66,23 +66,38 @@
   }
 
   FieldsReader(Directory d, String segment, FieldInfos fn, int readBufferSize, int docStoreOffset, int size) throws IOException {
-    fieldInfos = fn;
+    boolean success = false;
 
-    cloneableFieldsStream = d.openInput(segment + ".fdt", readBufferSize);
-    fieldsStream = (IndexInput)cloneableFieldsStream.clone();
-    indexStream = d.openInput(segment + ".fdx", readBufferSize);
+    try {
+      fieldInfos = fn;
 
-    if (docStoreOffset != -1) {
-      // We read only a slice out of this shared fields file
-      this.docStoreOffset = docStoreOffset;
-      this.size = size;
+      cloneableFieldsStream = d.openInput(segment + ".fdt", readBufferSize);
+      fieldsStream = (IndexInput) cloneableFieldsStream.clone();
+      indexStream = d.openInput(segment + ".fdx", readBufferSize);
 
-      // Verify the file is long enough to hold all of our
-      // docs
-      assert ((int) (indexStream.length()/8)) >= size + this.docStoreOffset;
-    } else {
-      this.docStoreOffset = 0;
-      this.size = (int) (indexStream.length() >> 3);
+      if (docStoreOffset != -1) {
+        // We read only a slice out of this shared fields file
+        this.docStoreOffset = docStoreOffset;
+        this.size = size;
+
+        // Verify the file is long enough to hold all of our
+        // docs
+        assert ((int) (indexStream.length() / 8)) >= size + this.docStoreOffset;
+      } else {
+        this.docStoreOffset = 0;
+        this.size = (int) (indexStream.length() >> 3);
+      }
+
+      success = true;
+    } finally {
+      // With lock-less commits, it's entirely possible (and
+      // fine) to hit a FileNotFound exception above. In
+      // this case, we want to explicitly close any subset
+      // of things that were opened so that we don't have to
+      // wait for a GC to do so.
+      if (!success) {
+        close();
+      }
     }
   }
 
@@ -103,9 +118,15 @@
    */
   final void close() throws IOException {
     if (!closed) {
-      fieldsStream.close();
-      cloneableFieldsStream.close();
-      indexStream.close();
+      if (fieldsStream != null) {
+        fieldsStream.close();
+      }
+      if (cloneableFieldsStream != null) {
+        cloneableFieldsStream.close();
+      }
+      if (indexStream != null) {
+        indexStream.close();
+      }
       IndexInput localFieldsStream = (IndexInput) fieldsStreamTL.get();
       if (localFieldsStream != null) {
         localFieldsStream.close();
Index: java/org/apache/lucene/index/TermVectorsReader.java
===================================================================
--- java/org/apache/lucene/index/TermVectorsReader.java	(revision 565943)
+++ java/org/apache/lucene/index/TermVectorsReader.java	(working copy)
@@ -53,26 +53,40 @@
     
   TermVectorsReader(Directory d, String segment, FieldInfos fieldInfos, int readBufferSize, int docStoreOffset, int size)
     throws CorruptIndexException, IOException {
-    if (d.fileExists(segment + TermVectorsWriter.TVX_EXTENSION)) {
-      tvx = d.openInput(segment + TermVectorsWriter.TVX_EXTENSION, readBufferSize);
-      checkValidFormat(tvx);
-      tvd = d.openInput(segment + TermVectorsWriter.TVD_EXTENSION, readBufferSize);
-      tvdFormat = checkValidFormat(tvd);
-      tvf = d.openInput(segment + TermVectorsWriter.TVF_EXTENSION, readBufferSize);
-      tvfFormat = checkValidFormat(tvf);
-      if (-1 == docStoreOffset) {
-        this.docStoreOffset = 0;
-        this.size = (int) (tvx.length() >> 3);
-      } else {
-        this.docStoreOffset = docStoreOffset;
-        this.size = size;
-        // Verify the file is long enough to hold all of our
-        // docs
-        assert ((int) (tvx.length()/8)) >= size + docStoreOffset;
+    boolean success = false;
+
+    try {
+      if (d.fileExists(segment + TermVectorsWriter.TVX_EXTENSION)) {
+        tvx = d.openInput(segment + TermVectorsWriter.TVX_EXTENSION, readBufferSize);
+        checkValidFormat(tvx);
+        tvd = d.openInput(segment + TermVectorsWriter.TVD_EXTENSION, readBufferSize);
+        tvdFormat = checkValidFormat(tvd);
+        tvf = d.openInput(segment + TermVectorsWriter.TVF_EXTENSION, readBufferSize);
+        tvfFormat = checkValidFormat(tvf);
+        if (-1 == docStoreOffset) {
+          this.docStoreOffset = 0;
+          this.size = (int) (tvx.length() >> 3);
+        } else {
+          this.docStoreOffset = docStoreOffset;
+          this.size = size;
+          // Verify the file is long enough to hold all of our
+          // docs
+          assert ((int) (tvx.length() / 8)) >= size + docStoreOffset;
+        }
       }
+
+      this.fieldInfos = fieldInfos;
+      success = true;
+    } finally {
+      // With lock-less commits, it's entirely possible (and
+      // fine) to hit a FileNotFound exception above. In
+      // this case, we want to explicitly close any subset
+      // of things that were opened so that we don't have to
+      // wait for a GC to do so.
+      if (!success) {
+        close();
+      }
     }
-
-    this.fieldInfos = fieldInfos;
   }
   
   private int checkValidFormat(IndexInput in) throws CorruptIndexException, IOException
