You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/02/06 14:26:59 UTC

[06/17] lucene-solr git commit: cut back to Directory.deleteFile(String); disable 'could not removed segments_N so I don't remove any other files it may reference' heroics

cut back to Directory.deleteFile(String); disable 'could not removed segments_N so I don't remove any other files it may reference' heroics


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/a741ea53
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/a741ea53
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/a741ea53

Branch: refs/heads/master
Commit: a741ea53c9570d290fea95751a48b857fadd87dd
Parents: b4a2bf2
Author: Mike McCandless <mi...@apache.org>
Authored: Wed Feb 3 10:35:57 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Wed Feb 3 10:35:57 2016 -0500

----------------------------------------------------------------------
 .../lucene/analysis/hunspell/Dictionary.java    |  4 +-
 .../util/TestFilesystemResourceLoader.java      | 28 +++---
 .../simpletext/SimpleTextCompoundFormat.java    |  2 +-
 .../codecs/lucene50/Lucene50CompoundReader.java |  2 +-
 .../apache/lucene/index/IndexFileDeleter.java   | 30 +++---
 .../org/apache/lucene/index/IndexWriter.java    |  1 +
 .../index/PersistentSnapshotDeletionPolicy.java |  4 +-
 .../java/org/apache/lucene/store/Directory.java |  5 +-
 .../org/apache/lucene/store/FSDirectory.java    | 97 ++++----------------
 .../lucene/store/FileSwitchDirectory.java       | 19 +---
 .../apache/lucene/store/FilterDirectory.java    |  4 +-
 .../store/LockValidatingDirectoryWrapper.java   |  4 +-
 .../lucene/store/NRTCachingDirectory.java       | 29 ++----
 .../org/apache/lucene/store/RAMDirectory.java   | 16 ++--
 .../lucene/store/TrackingDirectoryWrapper.java  |  9 +-
 .../java/org/apache/lucene/util/IOUtils.java    | 30 +++---
 .../org/apache/lucene/util/bkd/BKDWriter.java   |  7 +-
 .../lucene/util/bkd/OfflinePointWriter.java     |  3 +-
 .../lucene/index/TestCodecHoldsOpenFiles.java   |  7 +-
 .../apache/lucene/index/TestDeletionPolicy.java | 12 +--
 .../lucene/index/TestDirectoryReaderReopen.java |  9 +-
 .../test/org/apache/lucene/index/TestDoc.java   |  5 +-
 .../lucene/index/TestIndexFileDeleter.java      | 32 +++----
 .../lucene/index/TestIndexWriterExceptions.java | 10 +-
 .../lucene/index/TestNRTReaderCleanup.java      |  8 +-
 .../org/apache/lucene/store/TestDirectory.java  |  4 +-
 .../lucene/store/TestNativeFSLockFactory.java   |  3 +-
 .../lucene/store/TestSimpleFSLockFactory.java   |  3 +-
 .../store/TestTrackingDirectoryWrapper.java     |  2 +-
 .../org/apache/lucene/util/bkd/TestBKD.java     |  5 +-
 .../org/apache/lucene/util/fst/Test2BFST.java   |  7 +-
 .../lucene/util/packed/TestPackedInts.java      |  3 +-
 .../lucene/store/NativeUnixDirectory.java       |  1 -
 .../suggest/analyzing/AnalyzingSuggester.java   |  2 +-
 .../search/suggest/fst/ExternalRefSorter.java   |  2 +-
 .../search/suggest/fst/FSTCompletionLookup.java |  2 +-
 .../lucene/analysis/VocabularyAssert.java       |  2 +-
 .../index/BaseCompoundFormatTestCase.java       |  2 +-
 .../apache/lucene/mockfile/VirusCheckingFS.java |  6 +-
 .../lucene/store/BaseDirectoryTestCase.java     |  5 +-
 .../lucene/store/MockDirectoryWrapper.java      | 29 +++---
 .../org/apache/lucene/util/fst/FSTTester.java   |  2 +-
 42 files changed, 181 insertions(+), 276 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java
----------------------------------------------------------------------
diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java
index 49c7045..d5db839 100644
--- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java
+++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java
@@ -877,7 +877,7 @@ public class Dictionary {
       success = true;
     } finally {
       if (success) {
-        tempDir.deleteFiles(Collections.singleton(unsorted.getName()));
+        tempDir.deleteFile(unsorted.getName());
       } else {
         IOUtils.deleteFilesIgnoringExceptions(tempDir, unsorted.getName());
       }
@@ -966,7 +966,7 @@ public class Dictionary {
       success2 = true;
     } finally {
       if (success2) {
-        tempDir.deleteFiles(Collections.singleton(sorted));
+        tempDir.deleteFile(sorted);
       } else {
         IOUtils.deleteFilesIgnoringExceptions(tempDir, sorted);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestFilesystemResourceLoader.java
----------------------------------------------------------------------
diff --git a/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestFilesystemResourceLoader.java b/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestFilesystemResourceLoader.java
index 80de40f..6ca814e 100644
--- a/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestFilesystemResourceLoader.java
+++ b/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/TestFilesystemResourceLoader.java
@@ -57,25 +57,21 @@ public class TestFilesystemResourceLoader extends LuceneTestCase {
   
   public void testBaseDir() throws Exception {
     final Path base = createTempDir("fsResourceLoaderBase");
+    Writer os = Files.newBufferedWriter(base.resolve("template.txt"), StandardCharsets.UTF_8);
     try {
-      Writer os = Files.newBufferedWriter(base.resolve("template.txt"), StandardCharsets.UTF_8);
-      try {
-        os.write("foobar\n");
-      } finally {
-        IOUtils.closeWhileHandlingException(os);
-      }
-      
-      ResourceLoader rl = new FilesystemResourceLoader(base);
-      assertEquals("foobar", WordlistLoader.getLines(rl.openResource("template.txt"), StandardCharsets.UTF_8).get(0));
-      // Same with full path name:
-      String fullPath = base.resolve("template.txt").toAbsolutePath().toString();
-      assertEquals("foobar",
-          WordlistLoader.getLines(rl.openResource(fullPath), StandardCharsets.UTF_8).get(0));
-      assertClasspathDelegation(rl);
-      assertNotFound(rl);
+      os.write("foobar\n");
     } finally {
-      IOUtils.rm(base);
+      IOUtils.closeWhileHandlingException(os);
     }
+      
+    ResourceLoader rl = new FilesystemResourceLoader(base);
+    assertEquals("foobar", WordlistLoader.getLines(rl.openResource("template.txt"), StandardCharsets.UTF_8).get(0));
+    // Same with full path name:
+    String fullPath = base.resolve("template.txt").toAbsolutePath().toString();
+    assertEquals("foobar",
+                 WordlistLoader.getLines(rl.openResource(fullPath), StandardCharsets.UTF_8).get(0));
+    assertClasspathDelegation(rl);
+    assertNotFound(rl);
   }
   
   public void testDelegation() throws Exception {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextCompoundFormat.java
----------------------------------------------------------------------
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextCompoundFormat.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextCompoundFormat.java
index 8398f66..c994df7 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextCompoundFormat.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextCompoundFormat.java
@@ -148,7 +148,7 @@ public class SimpleTextCompoundFormat extends CompoundFormat {
       public void sync(Collection<String> names) { throw new UnsupportedOperationException(); }
       
       @Override
-      public void deleteFiles(Collection<String> name) { throw new UnsupportedOperationException(); }
+      public void deleteFile(String name) { throw new UnsupportedOperationException(); }
       
       @Override
       public void renameFile(String source, String dest) { throw new UnsupportedOperationException(); }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/codecs/lucene50/Lucene50CompoundReader.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene50/Lucene50CompoundReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene50/Lucene50CompoundReader.java
index a6ccfd4..831fb4c 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene50/Lucene50CompoundReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene50/Lucene50CompoundReader.java
@@ -161,7 +161,7 @@ final class Lucene50CompoundReader extends Directory {
   /** Not implemented
    * @throws UnsupportedOperationException always: not supported by CFS */
   @Override
-  public void deleteFiles(Collection<String> name) {
+  public void deleteFile(String name) {
     throw new UnsupportedOperationException();
   }
   

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
index 569471e..2e5d5cf 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexFileDeleter.java
@@ -694,20 +694,24 @@ final class IndexFileDeleter implements Closeable {
   private void deleteFiles(Collection<String> names) throws IOException {
     assert locked();
     ensureOpen();
-    if (names.isEmpty()) {
-      return;
+
+    if (infoStream.isEnabled("IFD")) {
+      infoStream.message("IFD", "delete \"" + names + "\"");
     }
-    try {
-      if (infoStream.isEnabled("IFD")) {
-        infoStream.message("IFD", "delete \"" + names + "\"");
-      }
-      directory.deleteFiles(names);
-    } catch (NoSuchFileException | FileNotFoundException e) {  // if delete fails
-      // IndexWriter should only ask us to delete files it knows it wrote, so if we hit this, something is wrong!
-      if (Constants.WINDOWS) {
-        // LUCENE-6684: we suppress this assert for Windows, since a file could be in a confusing "pending delete" state:
-      } else {
-        throw e;
+
+    // nocommit put annoying windows-specific segments_N heroics back?
+
+    for(String name : names) {
+      try {
+        directory.deleteFile(name);
+      } catch (NoSuchFileException | FileNotFoundException e) {
+        // IndexWriter should only ask us to delete files it knows it wrote, so if we hit this, something is wrong!
+        if (Constants.WINDOWS) {
+          // LUCENE-6684: we suppress this assert for Windows, since a file could be in a confusing "pending delete" state, and falsely
+          // return NSFE/FNFE
+        } else {
+          throw e;
+        }
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
index e62cafb..ce79309 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@ -4617,6 +4617,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable {
    *  commits are no longer needed. Otherwise, those commits will
    *  be deleted the next time commit() is called.
    */
+  // nocommit remove this
   public synchronized void deleteUnusedFiles() throws IOException {
     ensureOpen(false);
     deleter.revisitPolicy();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java b/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
index 2a286ff..e95c567 100644
--- a/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
+++ b/lucene/core/src/java/org/apache/lucene/index/PersistentSnapshotDeletionPolicy.java
@@ -22,8 +22,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.lucene.codecs.CodecUtil;
 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
@@ -212,7 +212,7 @@ public class PersistentSnapshotDeletionPolicy extends SnapshotDeletionPolicy {
   private synchronized void clearPriorSnapshots() throws IOException {
     for(String file : dir.listAll()) {
       if (file.startsWith(SNAPSHOTS_PREFIX)) {
-        dir.deleteFiles(Collections.singleton(file));
+        dir.deleteFile(file);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/Directory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/Directory.java b/lucene/core/src/java/org/apache/lucene/store/Directory.java
index bb12c92..b6da4cc 100644
--- a/lucene/core/src/java/org/apache/lucene/store/Directory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/Directory.java
@@ -50,9 +50,8 @@ public abstract class Directory implements Closeable {
   // nocommit should this sort?
   public abstract String[] listAll() throws IOException;
 
-  /** Removes the specified files from the directory.  If an exception is thrown, behavior is undefined
-   *  (none, some or all of the files may have in fact been deleted). */
-  public abstract void deleteFiles(Collection<String> name) throws IOException;
+  /** Removes an existing file in the directory. */
+  public abstract void deleteFile(String name) throws IOException;
 
   /**
    * Returns the length of a file in the directory. This method follows the

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java b/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
index 9eb78b4..a2edb84 100644
--- a/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/FSDirectory.java
@@ -126,10 +126,8 @@ public abstract class FSDirectory extends BaseDirectory {
 
   protected final Path directory; // The underlying filesystem directory
 
-
-  /** Files we previously tried to delete, but hit exception (on Windows) last time we tried.
-   *  These files are in "pending delete" state, where we refuse to openInput or createOutput
-   *  them, nor include them in .listAll. */
+  /** Maps files that we are trying to delete (or we tried already but failed)
+   *  before attempting to delete that key. */
   protected final Set<String> pendingDeletes = Collections.newSetFromMap(new ConcurrentHashMap<String,Boolean>());
 
   /** Used to generate temp file names in {@link #createTempOutput}. */
@@ -200,12 +198,11 @@ public abstract class FSDirectory extends BaseDirectory {
     }
   }
 
-  /** Lists all files (including subdirectories) in the
-   *  directory.
+  /** Lists all files (including subdirectories) in the directory.
    *
    *  @throws IOException if there was an I/O error during listing */
   public static String[] listAll(Path dir) throws IOException {
-    return listAll(dir, Collections.emptySet());
+    return listAll(dir, null);
   }
 
   private static String[] listAll(Path dir, Set<String> skipNames) throws IOException {
@@ -214,7 +211,7 @@ public abstract class FSDirectory extends BaseDirectory {
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
       for (Path path : stream) {
         String name = path.getFileName().toString();
-        if (skipNames.contains(name) == false) {
+        if (skipNames != null && skipNames.contains(name) == false) {
           entries.add(name);
         }
       }
@@ -236,17 +233,10 @@ public abstract class FSDirectory extends BaseDirectory {
   }
 
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
-    ensureOpen();
-    // nocommit isn't it an error if they were already pending delete?
-    pendingDeletes.addAll(names);
-    deletePendingFiles();
-  }
-
-  @Override
   public IndexOutput createOutput(String name, IOContext context) throws IOException {
     ensureOpen();
-    ensureCanWrite(name);
+    // nocommit do we need to check pending deletes?
+    deletePendingFiles();
     return new FSIndexOutput(name);
   }
 
@@ -264,14 +254,6 @@ public abstract class FSDirectory extends BaseDirectory {
     }
   }
 
-  protected void ensureCanWrite(String name) throws IOException {
-    deletePendingFiles();
-    if (pendingDeletes.contains(name)) {
-      throw new IOException("file \"" + name + "\" is pending delete and cannot be overwritten");
-    }
-    Files.deleteIfExists(directory.resolve(name)); // delete existing, if any
-  }
-
   protected void ensureCanRead(String name) throws IOException {
     deletePendingFiles();
     if (pendingDeletes.contains(name)) {
@@ -319,12 +301,11 @@ public abstract class FSDirectory extends BaseDirectory {
     IOUtils.fsync(directory.resolve(name), false);
   }
 
-  /** Returns true if the file was successfully removed. */
-  private synchronized boolean deleteFile(String name) throws IOException {  
+  @Override
+  public void deleteFile(String name) throws IOException {  
     pendingDeletes.remove(name);
     try {
       Files.delete(directory.resolve(name));
-      return true;
     } catch (NoSuchFileException | FileNotFoundException e) {
       // We were asked to delete a non-existent file:
       throw e;
@@ -339,9 +320,7 @@ public abstract class FSDirectory extends BaseDirectory {
 
       // TODO: can/should we do if (Constants.WINDOWS) here, else throw the exc?
       // but what about a Linux box with a CIFS mount?
-      //System.out.println("FS.deleteFile failed (" + ioe + "): will retry later");
       pendingDeletes.add(name);
-      return false;
     }
   }
 
@@ -354,61 +333,17 @@ public abstract class FSDirectory extends BaseDirectory {
 
   /** Try to delete any pending files that we had previously tried to delete but failed
    *  because we are on Windows and the files were still held open. */
-  public synchronized void deletePendingFiles() throws IOException {
+  public void deletePendingFiles() throws IOException {
+    // nocommit do we need exponential backoff here for windows?
+
     // TODO: we could fix IndexInputs from FSDirectory subclasses to call this when they are closed?
 
-    // Clone the set because it will change as we iterate:
-    List<String> toDelete = new ArrayList<>(pendingDeletes);
-    System.out.println("del pending: " + pendingDeletes);
-
-    // First pass: delete any segments_N files.  We do these first to be certain stale commit points are removed
-    // before we remove any files they reference.  If any delete of segments_N fails, we leave all other files
-    // undeleted so index is never in a corrupt state:
-    Throwable firstException = null;
-    for (String fileName : toDelete) {
-      if (fileName.startsWith(IndexFileNames.SEGMENTS)) {
-        try {
-          if (deleteFile(fileName) == false) {
-            // nocommit
-            System.out.println("  false on " + fileName + "; skipping the rest");
-            return;
-          }
-        } catch (Throwable t) {
-          if (firstException == null) {
-            firstException = t;
-          } else {
-            firstException.addSuppressed(t);
-          }
-          // nocommit
-          System.out.println("  fail on " + fileName + ":");
-          t.printStackTrace(System.out);
-          throw t;
-        }
-      }
-    }
+    Set<String> toDelete = new HashSet<>(pendingDeletes);
 
-    // Only delete other files if we were able to remove the segments_N files; this way we never
-    // leave a corrupt commit in the index even in the presense of virus checkers:
-    for(String fileName : toDelete) {
-      if (fileName.startsWith(IndexFileNames.SEGMENTS) == false) {
-        try {
-          deleteFile(fileName);
-        } catch (Throwable t) {
-          if (firstException == null) {
-            firstException = t;
-          } else {
-            firstException.addSuppressed(t);
-          }
-          // nocommit
-          System.out.println("  fail on " + fileName + ":");
-          t.printStackTrace(System.out);
-          throw t;
-        }
-      }
+    // nocommit heroic exceptions here or not?
+    for(String name : toDelete) {
+      deleteFile(name);
     }
-
-    // Does nothing if firstException is null:
-    IOUtils.reThrow(firstException);
   }
 
   final class FSIndexOutput extends OutputStreamIndexOutput {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java b/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
index 13bc217..59b8d57 100644
--- a/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/FileSwitchDirectory.java
@@ -140,20 +140,11 @@ public class FileSwitchDirectory extends Directory {
   }
 
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
-    Set<String> primaryToDelete = new HashSet<>();
-    Set<String> secondaryToDelete = new HashSet<>();
-    for(String name : names) {
-      if (getDirectory(name) == primaryDir) {
-        primaryToDelete.add(name);
-      } else {
-        secondaryToDelete.add(name);
-      }
-    }
-    try {
-      primaryDir.deleteFiles(primaryToDelete);
-    } finally {
-      secondaryDir.deleteFiles(secondaryToDelete);
+  public void deleteFile(String name) throws IOException {
+    if (getDirectory(name) == primaryDir) {
+      primaryDir.deleteFile(name);
+    } else {
+      secondaryDir.deleteFile(name);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/FilterDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/FilterDirectory.java b/lucene/core/src/java/org/apache/lucene/store/FilterDirectory.java
index 9ee2928..7c550c1 100644
--- a/lucene/core/src/java/org/apache/lucene/store/FilterDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/FilterDirectory.java
@@ -58,8 +58,8 @@ public class FilterDirectory extends Directory {
   }
 
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
-    in.deleteFiles(names);
+  public void deleteFile(String name) throws IOException {
+    in.deleteFile(name);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/LockValidatingDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/LockValidatingDirectoryWrapper.java b/lucene/core/src/java/org/apache/lucene/store/LockValidatingDirectoryWrapper.java
index 3ed659a..389c56d 100644
--- a/lucene/core/src/java/org/apache/lucene/store/LockValidatingDirectoryWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/store/LockValidatingDirectoryWrapper.java
@@ -33,9 +33,9 @@ public final class LockValidatingDirectoryWrapper extends FilterDirectory {
   }
 
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
+  public void deleteFile(String name) throws IOException {
     writeLock.ensureValid();
-    in.deleteFiles(names);
+    in.deleteFile(name);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java b/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
index 1b8404b..5a38b44 100644
--- a/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/NRTCachingDirectory.java
@@ -20,12 +20,10 @@ package org.apache.lucene.store;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.nio.file.NoSuchFileException;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import org.apache.lucene.store.RAMDirectory;      // javadocs
@@ -112,23 +110,14 @@ public class NRTCachingDirectory extends FilterDirectory implements Accountable
   }
 
   @Override
-  public synchronized void deleteFiles(Collection<String> names) throws IOException {
+  public synchronized void deleteFile(String name) throws IOException {
     if (VERBOSE) {
-      System.out.println("nrtdir.deleteFiles names=" + names);
+      System.out.println("nrtdir.deleteFile name=" + name);
     }
-    Set<String> cacheToDelete = new HashSet<>();
-    Set<String> toDelete = new HashSet<>();
-    for(String name : names) {
-      if (cache.fileNameExists(name)) {
-        cacheToDelete.add(name);
-      } else {
-        toDelete.add(name);
-      }
-    }
-    try {
-      cache.deleteFiles(cacheToDelete);
-    } finally {
-      in.deleteFiles(toDelete);
+    if (cache.fileNameExists(name)) {
+      cache.deleteFile(name);
+    } else {
+      in.deleteFile(name);
     }
   }
 
@@ -155,14 +144,14 @@ public class NRTCachingDirectory extends FilterDirectory implements Accountable
         System.out.println("  to cache");
       }
       try {
-        in.deleteFiles(Collections.singleton(name));
+        in.deleteFile(name);
       } catch (IOException ioe) {
         // This is fine: file may not exist
       }
       return cache.createOutput(name, context);
     } else {
       try {
-        cache.deleteFiles(Collections.singleton(name));
+        cache.deleteFile(name);
       } catch (IOException ioe) {
         // This is fine: file may not exist
       }
@@ -332,7 +321,7 @@ public class NRTCachingDirectory extends FilterDirectory implements Accountable
       synchronized(this) {
         // Must sync here because other sync methods have
         // if (cache.fileNameExists(name)) { ... } else { ... }:
-        cache.deleteFiles(Collections.singleton(fileName));
+        cache.deleteFile(fileName);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java b/lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java
index 7be4679..d1dc0d0 100644
--- a/lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java
+++ b/lucene/core/src/java/org/apache/lucene/store/RAMDirectory.java
@@ -157,16 +157,14 @@ public class RAMDirectory extends BaseDirectory implements Accountable {
   }
   
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
+  public void deleteFile(String name) throws IOException {
     ensureOpen();
-    for(String name : names) {
-      RAMFile file = fileMap.remove(name);
-      if (file != null) {
-        file.directory = null;
-        sizeInBytes.addAndGet(-file.sizeInBytes);
-      } else {
-        throw new FileNotFoundException(name);
-      }
+    RAMFile file = fileMap.remove(name);
+    if (file != null) {
+      file.directory = null;
+      sizeInBytes.addAndGet(-file.sizeInBytes);
+    } else {
+      throw new FileNotFoundException(name);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/store/TrackingDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/store/TrackingDirectoryWrapper.java b/lucene/core/src/java/org/apache/lucene/store/TrackingDirectoryWrapper.java
index 49d70f8..aa7214c 100644
--- a/lucene/core/src/java/org/apache/lucene/store/TrackingDirectoryWrapper.java
+++ b/lucene/core/src/java/org/apache/lucene/store/TrackingDirectoryWrapper.java
@@ -18,7 +18,6 @@ package org.apache.lucene.store;
  */
 
 import java.io.IOException;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
@@ -34,11 +33,9 @@ public final class TrackingDirectoryWrapper extends FilterDirectory {
   }
 
   @Override
-  public void deleteFiles(Collection<String> names) throws IOException {
-    in.deleteFiles(names);
-    for(String name : names) {
-      createdFileNames.remove(name);
-    }
+  public void deleteFile(String name) throws IOException {
+    in.deleteFile(name);
+    createdFileNames.remove(name);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/util/IOUtils.java b/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
index 3be3d7f..f6a6272 100644
--- a/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
+++ b/lucene/core/src/java/org/apache/lucene/util/IOUtils.java
@@ -38,10 +38,8 @@ import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
@@ -193,10 +191,12 @@ public final class IOUtils {
    * Note that the files should not be null.
    */
   public static void deleteFilesIgnoringExceptions(Directory dir, Collection<String> files) {
-    try {
-      dir.deleteFiles(files);
-    } catch (Throwable ignored) {
-      // ignore
+    for(String name : files) {
+      try {
+        dir.deleteFile(name);
+      } catch (Throwable ignored) {
+        // ignore
+      }
     }
   }
 
@@ -215,15 +215,21 @@ public final class IOUtils {
    * @param names file names to delete
    */
   public static void deleteFiles(Directory dir, Collection<String> names) throws IOException {
-    Set<String> nonNullNames = new HashSet<>();
-    for(String name : names) {
+    Throwable th = null;
+    for (String name : names) {
       if (name != null) {
-        nonNullNames.add(name);
+        try {
+          dir.deleteFile(name);
+        } catch (Throwable t) {
+          addSuppressed(th, t);
+          if (th == null) {
+            th = t;
+          }
+        }
       }
     }
-    if (names.isEmpty() == false) {
-      dir.deleteFiles(names);
-    }
+
+    reThrow(th);
   }
 
   public static void deleteFiles(Directory dir, String... files) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
index 328ea2e..e47830d 100644
--- a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDWriter.java
@@ -22,7 +22,6 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
@@ -40,8 +39,8 @@ import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.IntroSorter;
 import org.apache.lucene.util.LongBitSet;
 import org.apache.lucene.util.NumericUtils;
-import org.apache.lucene.util.OfflineSorter.ByteSequencesWriter;
 import org.apache.lucene.util.OfflineSorter;
+import org.apache.lucene.util.OfflineSorter.ByteSequencesWriter;
 import org.apache.lucene.util.PriorityQueue;
 import org.apache.lucene.util.RamUsageEstimator;
 import org.apache.lucene.util.StringHelper;
@@ -821,7 +820,7 @@ public class BKDWriter implements Closeable {
       //System.out.println("sort time: " + ((t1-t0)/1000000.0) + " msec");
 
       if (tempInput != null) {
-        tempDir.deleteFiles(Collections.singleton(tempInput.getName()));
+        tempDir.deleteFile(tempInput.getName());
         tempInput = null;
       } else {
         assert heapPointWriter != null;
@@ -914,7 +913,7 @@ public class BKDWriter implements Closeable {
       try {
         tempInput.close();
       } finally {
-        tempDir.deleteFiles(Collections.singleton(tempInput.getName()));
+        tempDir.deleteFile(tempInput.getName());
         tempInput = null;
       }
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/java/org/apache/lucene/util/bkd/OfflinePointWriter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/util/bkd/OfflinePointWriter.java b/lucene/core/src/java/org/apache/lucene/util/bkd/OfflinePointWriter.java
index 0751354..83ff90b 100644
--- a/lucene/core/src/java/org/apache/lucene/util/bkd/OfflinePointWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/util/bkd/OfflinePointWriter.java
@@ -18,7 +18,6 @@ package org.apache.lucene.util.bkd;
  */
 
 import java.io.IOException;
-import java.util.Collections;
 
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IOContext;
@@ -75,7 +74,7 @@ final class OfflinePointWriter implements PointWriter {
 
   @Override
   public void destroy() throws IOException {
-    tempDir.deleteFiles(Collections.singleton(out.getName()));
+    tempDir.deleteFile(out.getName());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestCodecHoldsOpenFiles.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestCodecHoldsOpenFiles.java b/lucene/core/src/test/org/apache/lucene/index/TestCodecHoldsOpenFiles.java
index fa773fa..4ffc1f8 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestCodecHoldsOpenFiles.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestCodecHoldsOpenFiles.java
@@ -17,9 +17,6 @@ package org.apache.lucene.index;
  * limitations under the License.
  */
 
-import java.io.IOException;
-import java.util.Arrays;
-
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.IntPoint;
 import org.apache.lucene.document.NumericDocValuesField;
@@ -48,7 +45,9 @@ public class TestCodecHoldsOpenFiles extends LuceneTestCase {
     w.commit();
     w.close();
 
-    d.deleteFiles(Arrays.asList(d.listAll()));
+    for (String name : d.listAll()) {
+      d.deleteFile(name);
+    }
 
     for(LeafReaderContext cxt : r.leaves()) {
       TestUtil.checkReader(cxt.reader());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestDeletionPolicy.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDeletionPolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestDeletionPolicy.java
index 6d7d1de..f15f673 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDeletionPolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDeletionPolicy.java
@@ -19,7 +19,6 @@ package org.apache.lucene.index;
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -35,9 +34,8 @@ import org.apache.lucene.search.Query;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.MockDirectoryWrapper;
-import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems;
 import org.apache.lucene.util.TestUtil;
 import org.apache.lucene.util.Version;
 
@@ -297,7 +295,7 @@ public class TestDeletionPolicy extends LuceneTestCase {
         break;
       }
       
-      dir.deleteFiles(Collections.singleton(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen)));
+      dir.deleteFile(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen));
       gen--;
     }
 
@@ -375,7 +373,7 @@ public class TestDeletionPolicy extends LuceneTestCase {
       while(gen > 0) {
         IndexReader reader = DirectoryReader.open(dir);
         reader.close();
-        dir.deleteFiles(Collections.singleton(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen)));
+        dir.deleteFile(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen));
         gen--;
 
         if (gen > 0) {
@@ -602,7 +600,7 @@ public class TestDeletionPolicy extends LuceneTestCase {
           }
         }
         if (i < N) {
-          dir.deleteFiles(Collections.singleton(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen)));
+          dir.deleteFile(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen));
         }
         gen--;
       }
@@ -716,7 +714,7 @@ public class TestDeletionPolicy extends LuceneTestCase {
           }
         }
         if (i < N) {
-          dir.deleteFiles(Collections.singleton(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen)));
+          dir.deleteFile(IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen));
         }
         gen--;
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java b/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java
index 934ec73..2040c72 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java
@@ -19,7 +19,6 @@ package org.apache.lucene.index;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -40,8 +39,8 @@ import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.MockDirectoryWrapper.FakeIOException;
 import org.apache.lucene.store.MockDirectoryWrapper;
+import org.apache.lucene.store.MockDirectoryWrapper.FakeIOException;
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
@@ -708,7 +707,7 @@ public class TestDirectoryReaderReopen extends LuceneTestCase {
 
     // Blow away the index:
     for(String fileName : dir.listAll()) {
-      dir.deleteFiles(Collections.singleton(fileName));
+      dir.deleteFile(fileName);
     }
 
     w = new IndexWriter(dir, new IndexWriterConfig(new MockAnalyzer(random())));
@@ -757,7 +756,9 @@ public class TestDirectoryReaderReopen extends LuceneTestCase {
     DirectoryReader r = DirectoryReader.open(dir);
 
     // Blow away the index:
-    dir.deleteFiles(Arrays.asList(dir.listAll()));
+    for(String name : dir.listAll()) {
+      dir.deleteFile(name);
+    }
 
     w = new IndexWriter(dir, new IndexWriterConfig(new MockAnalyzer(random())));
     doc = new Document();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestDoc.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDoc.java b/lucene/core/src/test/org/apache/lucene/index/TestDoc.java
index 24ce405..705c68b 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDoc.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDoc.java
@@ -48,7 +48,6 @@ import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.InfoStream;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.StringHelper;
-import org.apache.lucene.util.TestUtil;
 import org.apache.lucene.util.Version;
 
 /** JUnit adaptation of an older test case DocTest. */
@@ -234,7 +233,9 @@ public class TestDoc extends LuceneTestCase {
       Collection<String> filesToDelete = si.files();
       codec.compoundFormat().write(dir, si, context);
       si.setUseCompoundFile(true);
-      si1.info.dir.deleteFiles(filesToDelete);
+      for(String name : filesToDelete) {
+        si1.info.dir.deleteFile(name);
+      }
     }
 
     return new SegmentCommitInfo(si, 0, -1L, -1L, -1L);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
index fa9f1a7..a5e3c7e 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexFileDeleter.java
@@ -18,6 +18,9 @@ package org.apache.lucene.index;
  */
 
 import java.io.*;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -26,6 +29,8 @@ import org.apache.lucene.codecs.simpletext.SimpleTextCodec;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.apache.lucene.mockfile.FilterPath;
+import org.apache.lucene.mockfile.VirusCheckingFS;
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IOContext;
@@ -219,8 +224,14 @@ public class TestIndexFileDeleter extends LuceneTestCase {
   }
   
   public void testVirusScannerDoesntCorruptIndex() throws IOException {
-    MockDirectoryWrapper dir = newMockDirectory();
-    dir.setPreventDoubleWrite(false); // we arent trying to test this
+    Path path = createTempDir();
+    VirusCheckingFS fs = new VirusCheckingFS(path.getFileSystem(), random());
+    FileSystem filesystem = fs.getFileSystem(URI.create("file:///"));
+    fs.disable();
+
+    Path path2 = new FilterPath(path, filesystem);
+
+    Directory dir = newFSDirectory(path2);
     
     // add empty commit
     new IndexWriter(dir, new IndexWriterConfig(null)).close();
@@ -228,25 +239,12 @@ public class TestIndexFileDeleter extends LuceneTestCase {
     dir.createOutput("_0.si", IOContext.DEFAULT).close();
 
     // start virus scanner
-    final AtomicBoolean stopScanning = new AtomicBoolean();
-    dir.failOn(new MockDirectoryWrapper.Failure() {
-      @Override
-      public void eval(MockDirectoryWrapper dir) throws IOException {
-        if (stopScanning.get()) {
-          return;
-        }
-        for (StackTraceElement f : new Exception().getStackTrace()) {
-          if ("deleteFile".equals(f.getMethodName())) {
-            throw new IOException("temporarily cannot delete file");
-          }
-        }
-      }
-    });
+    fs.enable();
     
     IndexWriter iw = new IndexWriter(dir, new IndexWriterConfig(null));
     iw.addDocument(new Document());
     // stop virus scanner
-    stopScanning.set(true);
+    fs.disable();
     iw.commit();
     iw.close();
     dir.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
index db2253b..6daa3ca 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
@@ -57,14 +57,14 @@ import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
-import org.apache.lucene.store.MockDirectoryWrapper.FakeIOException;
 import org.apache.lucene.store.MockDirectoryWrapper;
+import org.apache.lucene.store.MockDirectoryWrapper.FakeIOException;
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.InfoStream;
-import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
 import org.apache.lucene.util.TestUtil;
 
 @SuppressCodecs("SimpleText") // too slow here
@@ -916,7 +916,7 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
         if (SegmentInfos.class.getName().equals(trace[i].getClassName()) && stage.equals(trace[i].getMethodName())) {
           isCommit = true;
         }
-        if (MockDirectoryWrapper.class.getName().equals(trace[i].getClassName()) && "deleteFiles".equals(trace[i].getMethodName())) {
+        if (MockDirectoryWrapper.class.getName().equals(trace[i].getClassName()) && "deleteFile".equals(trace[i].getMethodName())) {
           isDelete = true;
         }
         if (SegmentInfos.class.getName().equals(trace[i].getClassName()) && "writeGlobalFieldMap".equals(trace[i].getMethodName())) {
@@ -1205,7 +1205,7 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
       }
       in.close();
       out.close();
-      dir.deleteFiles(Collections.singleton(fileNameIn));
+      dir.deleteFile(fileNameIn);
 
       IndexReader reader = null;
       try {
@@ -1255,7 +1255,7 @@ public class TestIndexWriterExceptions extends LuceneTestCase {
       assertTrue(si.info.getUseCompoundFile());
       List<String> victims = new ArrayList<String>(si.info.files());
       Collections.shuffle(victims, random());
-      dir.deleteFiles(Collections.singleton(victims.get(0)));
+      dir.deleteFile(victims.get(0));
       corrupted = true;
       break;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/index/TestNRTReaderCleanup.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestNRTReaderCleanup.java b/lucene/core/src/test/org/apache/lucene/index/TestNRTReaderCleanup.java
index bb452bf..1d53c5a 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestNRTReaderCleanup.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestNRTReaderCleanup.java
@@ -18,7 +18,6 @@ package org.apache.lucene.index;
  */
 
 import java.io.IOException;
-import java.util.Arrays;
 
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.document.Document;
@@ -26,9 +25,8 @@ import org.apache.lucene.document.Field;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.store.MockDirectoryWrapper;
 import org.apache.lucene.util.Constants;
-import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util.TestUtil;
+import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems;
 
 /** LUCENE-5574 */
 @SuppressFileSystems("WindowsFS") // the bug doesn't happen on windows.
@@ -62,7 +60,9 @@ public class TestNRTReaderCleanup extends LuceneTestCase {
     w.close();
 
     // Blow away index and make a new writer:
-    dir.deleteFiles(Arrays.asList(dir.listAll()));
+    for(String name : dir.listAll()) {
+      dir.deleteFile(name);
+    }
 
     w = new RandomIndexWriter(random(), dir);
     w.addDocument(doc);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/store/TestDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/store/TestDirectory.java b/lucene/core/src/test/org/apache/lucene/store/TestDirectory.java
index 3b65389..9c68b9e 100644
--- a/lucene/core/src/test/org/apache/lucene/store/TestDirectory.java
+++ b/lucene/core/src/test/org/apache/lucene/store/TestDirectory.java
@@ -21,10 +21,8 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
-import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 
@@ -82,7 +80,7 @@ public class TestDirectory extends LuceneTestCase {
       }
 
       // delete with a different dir
-      dirs[(i+1)%dirs.length].deleteFiles(Collections.singleton(fname));
+      dirs[(i+1)%dirs.length].deleteFile(fname);
 
       for (int j=0; j<dirs.length; j++) {
         FSDirectory d2 = dirs[j];

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/store/TestNativeFSLockFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/store/TestNativeFSLockFactory.java b/lucene/core/src/test/org/apache/lucene/store/TestNativeFSLockFactory.java
index 71284f1..7cb36d6 100644
--- a/lucene/core/src/test/org/apache/lucene/store/TestNativeFSLockFactory.java
+++ b/lucene/core/src/test/org/apache/lucene/store/TestNativeFSLockFactory.java
@@ -20,7 +20,6 @@ package org.apache.lucene.store;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
 
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.TestUtil;
@@ -88,7 +87,7 @@ public class TestNativeFSLockFactory extends BaseLockFactoryTestCase {
       Lock lock = dir.obtainLock("test.lock");
       lock.ensureValid();
 
-      dir.deleteFiles(Collections.singleton("test.lock"));
+      dir.deleteFile("test.lock");
 
       try {
         lock.ensureValid();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/store/TestSimpleFSLockFactory.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/store/TestSimpleFSLockFactory.java b/lucene/core/src/test/org/apache/lucene/store/TestSimpleFSLockFactory.java
index 793c005..2baab10 100644
--- a/lucene/core/src/test/org/apache/lucene/store/TestSimpleFSLockFactory.java
+++ b/lucene/core/src/test/org/apache/lucene/store/TestSimpleFSLockFactory.java
@@ -19,7 +19,6 @@ package org.apache.lucene.store;
 
 import java.io.IOException;
 import java.nio.file.Path;
-import java.util.Collections;
 
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.TestUtil;
@@ -41,7 +40,7 @@ public class TestSimpleFSLockFactory extends BaseLockFactoryTestCase {
       lock.ensureValid();
     
       try {
-        dir.deleteFiles(Collections.singleton("test.lock"));
+        dir.deleteFile("test.lock");
       } catch (Exception e) {
         // we can't delete a file for some reason, just clean up and assume the test.
         IOUtils.closeWhileHandlingException(lock);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/store/TestTrackingDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/store/TestTrackingDirectoryWrapper.java b/lucene/core/src/test/org/apache/lucene/store/TestTrackingDirectoryWrapper.java
index f9551d6..0985587 100644
--- a/lucene/core/src/test/org/apache/lucene/store/TestTrackingDirectoryWrapper.java
+++ b/lucene/core/src/test/org/apache/lucene/store/TestTrackingDirectoryWrapper.java
@@ -43,7 +43,7 @@ public class TestTrackingDirectoryWrapper extends BaseDirectoryTestCase {
     TrackingDirectoryWrapper dir = new TrackingDirectoryWrapper(new RAMDirectory());
     dir.createOutput("foo", newIOContext(random())).close();
     assertEquals(asSet("foo"), dir.getCreatedFiles());
-    dir.deleteFiles(Collections.singleton("foo"));
+    dir.deleteFile("foo");
     assertEquals(Collections.emptySet(), dir.getCreatedFiles());
   }
   

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKD.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKD.java b/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKD.java
index dc17f96..0a414ae 100644
--- a/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKD.java
+++ b/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKD.java
@@ -22,7 +22,6 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
-import java.util.Collections;
 import java.util.List;
 
 import org.apache.lucene.index.PointValues.IntersectVisitor;
@@ -818,9 +817,9 @@ public class TestBKD extends LuceneTestCase {
         }
       }
       in.close();
-      dir.deleteFiles(Collections.singleton("bkd"));
+      dir.deleteFile("bkd");
       if (toMerge != null) {
-        dir.deleteFiles(Collections.singleton("bkd2"));
+        dir.deleteFile("bkd2");
       }
       success = true;
     } finally {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/util/fst/Test2BFST.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/util/fst/Test2BFST.java b/lucene/core/src/test/org/apache/lucene/util/fst/Test2BFST.java
index e3868e4..2a239a4 100644
--- a/lucene/core/src/test/org/apache/lucene/util/fst/Test2BFST.java
+++ b/lucene/core/src/test/org/apache/lucene/util/fst/Test2BFST.java
@@ -18,7 +18,6 @@ package org.apache.lucene.util.fst;
  */
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Random;
 
 import org.apache.lucene.store.Directory;
@@ -128,7 +127,7 @@ public class Test2BFST extends LuceneTestCase {
             fst = new FST<>(in, outputs);
             in.close();
           } else {
-            dir.deleteFiles(Collections.singleton("fst"));
+            dir.deleteFile("fst");
           }
         }
       }
@@ -205,7 +204,7 @@ public class Test2BFST extends LuceneTestCase {
             fst = new FST<>(in, outputs);
             in.close();
           } else {
-            dir.deleteFiles(Collections.singleton("fst"));
+            dir.deleteFile("fst");
           }
         }
       }
@@ -289,7 +288,7 @@ public class Test2BFST extends LuceneTestCase {
             fst = new FST<>(in, outputs);
             in.close();
           } else {
-            dir.deleteFiles(Collections.singleton("fst"));
+            dir.deleteFile("fst");
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java b/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java
index e11cfef..bab144b 100644
--- a/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java
+++ b/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java
@@ -22,7 +22,6 @@ import java.nio.ByteBuffer;
 import java.nio.LongBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Random;
@@ -841,7 +840,7 @@ public class TestPackedInts extends LuceneTestCase {
           assertEquals(mutable.get(i), reader.get(i));
         }
         in.close();
-        directory.deleteFiles(Collections.singleton("packed-ints.bin"));
+        directory.deleteFile("packed-ints.bin");
       }
       directory.close();
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/misc/src/java/org/apache/lucene/store/NativeUnixDirectory.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/java/org/apache/lucene/store/NativeUnixDirectory.java b/lucene/misc/src/java/org/apache/lucene/store/NativeUnixDirectory.java
index 43763e2..51d7e92 100644
--- a/lucene/misc/src/java/org/apache/lucene/store/NativeUnixDirectory.java
+++ b/lucene/misc/src/java/org/apache/lucene/store/NativeUnixDirectory.java
@@ -148,7 +148,6 @@ public class NativeUnixDirectory extends FSDirectory {
     if (context.context != Context.MERGE || context.mergeInfo.estimatedMergeBytes < minBytesDirect) {
       return delegate.createOutput(name, context);
     } else {
-      ensureCanWrite(name);
       return new NativeUnixIndexOutput(getDirectory().resolve(name), name, mergeBufferSize);
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggester.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggester.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggester.java
index cb2d38c..f54ad03 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggester.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggester.java
@@ -487,7 +487,7 @@ public class AnalyzingSuggester extends Lookup implements Accountable {
       tempSortedFileName = sorter.sort(tempInput.getName());
 
       // Free disk space:
-      tempDir.deleteFiles(Collections.singleton(tempInput.getName()));
+      tempDir.deleteFile(tempInput.getName());
 
       reader = new OfflineSorter.ByteSequencesReader(tempDir.openInput(tempSortedFileName, IOContext.READONCE));
      

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/ExternalRefSorter.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/ExternalRefSorter.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/ExternalRefSorter.java
index 132c630..7f907af 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/ExternalRefSorter.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/ExternalRefSorter.java
@@ -69,7 +69,7 @@ public class ExternalRefSorter implements BytesRefSorter, Closeable {
         success = true;
       } finally {
         if (success) {
-          sorter.getDirectory().deleteFiles(Collections.singleton(input.getName()));
+          sorter.getDirectory().deleteFile(input.getName());
         } else {
           IOUtils.deleteFilesIgnoringExceptions(sorter.getDirectory(), input.getName());
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/FSTCompletionLookup.java
----------------------------------------------------------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/FSTCompletionLookup.java b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/FSTCompletionLookup.java
index d178aa4..24dd0f9 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/FSTCompletionLookup.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/suggest/fst/FSTCompletionLookup.java
@@ -204,7 +204,7 @@ public class FSTCompletionLookup extends Lookup implements Accountable {
       // We don't know the distribution of scores and we need to bucket them, so we'll sort
       // and divide into equal buckets.
       tempSortedFileName = sorter.sort(tempInput.getName());
-      tempDir.deleteFiles(Collections.singleton(tempInput.getName()));
+      tempDir.deleteFile(tempInput.getName());
 
       FSTCompletionBuilder builder = new FSTCompletionBuilder(
           buckets, externalSorter, sharedTailLength);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/analysis/VocabularyAssert.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/analysis/VocabularyAssert.java b/lucene/test-framework/src/java/org/apache/lucene/analysis/VocabularyAssert.java
index de77e96..208eab9 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/analysis/VocabularyAssert.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/analysis/VocabularyAssert.java
@@ -76,7 +76,7 @@ public class VocabularyAssert {
   
   /** Run a vocabulary test against a tab-separated data file inside a zip file */
   public static void assertVocabulary(Analyzer a, Path zipFile, String vocOut) throws IOException {
-    Path tmp = LuceneTestCase.createTempDir();
+    Path tmp = LuceneTestCase.createTempDir().resolve("unzipped");
     try (InputStream in = Files.newInputStream(zipFile)) {
       TestUtil.unzip(in, tmp);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/index/BaseCompoundFormatTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseCompoundFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseCompoundFormatTestCase.java
index 0c40bb3..7cee89e 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseCompoundFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseCompoundFormatTestCase.java
@@ -247,7 +247,7 @@ public abstract class BaseCompoundFormatTestCase extends BaseIndexFileFormatTest
     si.getCodec().compoundFormat().write(dir, si, IOContext.DEFAULT);
     Directory cfs = si.getCodec().compoundFormat().getCompoundReader(dir, si, IOContext.DEFAULT);
     try {
-      cfs.deleteFiles(Collections.singleton(testfile));
+      cfs.deleteFile(testfile);
       fail("didn't get expected exception");
     } catch (UnsupportedOperationException expected) {
       // expected UOE

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/mockfile/VirusCheckingFS.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/mockfile/VirusCheckingFS.java b/lucene/test-framework/src/java/org/apache/lucene/mockfile/VirusCheckingFS.java
index b30ce94..759a840 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/mockfile/VirusCheckingFS.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/mockfile/VirusCheckingFS.java
@@ -46,6 +46,10 @@ public class VirusCheckingFS extends FilterFileSystemProvider {
     this.random = new Random(random.nextLong());
   }
 
+  public void enable() {
+    enabled = true;
+  }
+
   public void disable() {
     enabled = false;
   }
@@ -57,7 +61,7 @@ public class VirusCheckingFS extends FilterFileSystemProvider {
         && Files.exists(path) // important that we NOT delay a NoSuchFileException until later
         && path.getFileName().toString().equals(IndexWriter.WRITE_LOCK_NAME) == false // life is particularly difficult if the virus checker hits our lock file
         && random.nextInt(5) == 1) {
-      if (true || LuceneTestCase.VERBOSE) {
+      if (LuceneTestCase.VERBOSE) {
         System.out.println("NOTE: VirusCheckingFS now refusing to delete " + path);
       }
       throw new AccessDeniedException("VirusCheckingFS is randomly refusing to delete file \"" + path + "\"");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
index db83153..ef8bf70 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/BaseDirectoryTestCase.java
@@ -164,7 +164,7 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
     int count = dir.listAll().length;
     dir.createOutput("foo.txt", IOContext.DEFAULT).close();
     assertEquals(count+1, dir.listAll().length);
-    dir.deleteFiles(Collections.singleton("foo.txt"));
+    dir.deleteFile("foo.txt");
     assertEquals(count, dir.listAll().length);
     dir.close();
   }
@@ -751,7 +751,8 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
     }
     in2.close();
       
-    dir.deleteFiles(Arrays.asList(new String[] {"test", "test2"}));
+    dir.deleteFile("test");
+    dir.deleteFile("test2");
     dir.close();
   }
   

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
index 3bd2319..3c79410 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
@@ -43,7 +43,6 @@ import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.NoDeletionPolicy;
-import org.apache.lucene.index.SegmentInfos;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
@@ -279,7 +278,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
 
       if (damage == 0) {
         action = "deleted";
-        deleteFiles(Collections.singleton(name));
+        deleteFile(name);
       } else if (damage == 1) {
         action = "zeroed";
         // Zero out file entirely
@@ -313,7 +312,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
         ii.close();
 
         // Delete original and copy bytes back:
-        deleteFiles(Collections.singleton(name));
+        deleteFile(name);
         
         try(IndexOutput out = in.createOutput(name, LuceneTestCase.newIOContext(randomState))) {
           ii = in.openInput(tempFileName, LuceneTestCase.newIOContext(randomState));
@@ -328,14 +327,14 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
             throw ioe;
           }
         }
-        deleteFiles(Collections.singleton(tempFileName));
+        deleteFile(tempFileName);
       } else if (damage == 3) {
         // The file survived intact:
         action = "didn't change";
       } else {
         action = "fully truncated";
         // Totally truncate the file to zero bytes
-        deleteFiles(Collections.singleton(name));
+        deleteFile(name);
         try (IndexOutput out = in.createOutput(name, LuceneTestCase.newIOContext(randomState))) {
         } catch (IOException ioe) {
           // VirusCheckingFS may have blocked the delete, at which point FSDir cannot overwrite here
@@ -449,7 +448,7 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
   }
 
   @Override
-  public synchronized void deleteFiles(Collection<String> names) throws IOException {
+  public synchronized void deleteFile(String name) throws IOException {
     maybeYield();
 
     maybeThrowDeterministicException();
@@ -458,19 +457,17 @@ public class MockDirectoryWrapper extends BaseDirectoryWrapper {
       throw new IOException("cannot delete after crash");
     }
 
-    for(String name : names) {
-      if (openFiles.containsKey(name)) {
-        openFilesDeleted.add(name);
-        if (assertNoDeleteOpenFile) {
-          throw (IOException) fillOpenTrace(new IOException("MockDirectoryWrapper: file \"" + name + "\" is still open: cannot delete"), name, true);
-        }
-      } else {
-        openFilesDeleted.remove(name);
+    if (openFiles.containsKey(name)) {
+      openFilesDeleted.add(name);
+      if (assertNoDeleteOpenFile) {
+        throw (IOException) fillOpenTrace(new IOException("MockDirectoryWrapper: file \"" + name + "\" is still open: cannot delete"), name, true);
       }
+    } else {
+      openFilesDeleted.remove(name);
     }
 
-    unSyncedFiles.removeAll(names);
-    in.deleteFiles(names);
+    unSyncedFiles.remove(name);
+    in.deleteFile(name);
   }
 
   // sets the cause of the incoming ioe to be the stack

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a741ea53/lucene/test-framework/src/java/org/apache/lucene/util/fst/FSTTester.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/fst/FSTTester.java b/lucene/test-framework/src/java/org/apache/lucene/util/fst/FSTTester.java
index 3800ff7..a2ace61 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/fst/FSTTester.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/fst/FSTTester.java
@@ -317,7 +317,7 @@ public class FSTTester<T> {
         fst = new FST<>(in, outputs);
       } finally {
         in.close();
-        dir.deleteFiles(Collections.singleton("fst.bin"));
+        dir.deleteFile("fst.bin");
       }
     }