You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2018/05/18 17:38:56 UTC

[2/3] lucene-solr:branch_7x: LUCENE-8320: Fix NPE in WindowsFS if target file exists but isn't open

LUCENE-8320: Fix NPE in WindowsFS if target file exists but isn't open


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

Branch: refs/heads/branch_7x
Commit: af17037bf0995695bc350fa0697e6029457cb8ee
Parents: 8dee245
Author: Simon Willnauer <si...@apache.org>
Authored: Fri May 18 19:24:45 2018 +0200
Committer: Simon Willnauer <si...@apache.org>
Committed: Fri May 18 19:26:48 2018 +0200

----------------------------------------------------------------------
 .../org/apache/lucene/mockfile/WindowsFS.java   | 18 +++++++-------
 .../apache/lucene/mockfile/TestWindowsFS.java   | 25 ++++++++++++++++++--
 2 files changed, 33 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/af17037b/lucene/test-framework/src/java/org/apache/lucene/mockfile/WindowsFS.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/mockfile/WindowsFS.java b/lucene/test-framework/src/java/org/apache/lucene/mockfile/WindowsFS.java
index ecf73b6..28ca368 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/mockfile/WindowsFS.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/mockfile/WindowsFS.java
@@ -138,14 +138,16 @@ public class WindowsFS extends HandleTrackingFS {
           // return a different i-node next time we call it with the target path and our onClose method will
           // trip an assert
           Map<Path, Integer> map = openFiles.get(key);
-          Integer v = map.remove(target);
-          if (v != null) {
-            Map<Path, Integer> pathIntegerMap = openFiles.computeIfAbsent(newKey, k -> new HashMap<>());
-            Integer existingValue = pathIntegerMap.getOrDefault(target, 0);
-            pathIntegerMap.put(target, existingValue + v);
-          }
-          if (map.isEmpty()) {
-            openFiles.remove(key);
+          if (map != null) {
+            Integer v = map.remove(target);
+            if (v != null) {
+              Map<Path, Integer> pathIntegerMap = openFiles.computeIfAbsent(newKey, k -> new HashMap<>());
+              Integer existingValue = pathIntegerMap.getOrDefault(target, 0);
+              pathIntegerMap.put(target, existingValue + v);
+            }
+            if (map.isEmpty()) {
+              openFiles.remove(key);
+            }
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/af17037b/lucene/test-framework/src/test/org/apache/lucene/mockfile/TestWindowsFS.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/test/org/apache/lucene/mockfile/TestWindowsFS.java b/lucene/test-framework/src/test/org/apache/lucene/mockfile/TestWindowsFS.java
index 5e0a687..dd6c35c 100644
--- a/lucene/test-framework/src/test/org/apache/lucene/mockfile/TestWindowsFS.java
+++ b/lucene/test-framework/src/test/org/apache/lucene/mockfile/TestWindowsFS.java
@@ -31,8 +31,6 @@ import java.nio.file.StandardCopyOption;
 import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.lucene.mockfile.FilterPath;
-import org.apache.lucene.mockfile.WindowsFS;
 import org.apache.lucene.util.Constants;
 
 /** Basic tests for WindowsFS */
@@ -155,4 +153,27 @@ public class TestWindowsFS extends MockFileSystemTestCase {
       t.join();
     }
   }
+
+  public void testMove() throws IOException {
+    Path dir = wrap(createTempDir());
+    OutputStream file = Files.newOutputStream(dir.resolve("file"));
+    file.write(1);
+    file.close();
+    Files.move(dir.resolve("file"), dir.resolve("target"));
+    assertTrue(Files.exists(dir.resolve("target")));
+    assertFalse(Files.exists(dir.resolve("file")));
+    try (InputStream stream = Files.newInputStream(dir.resolve("target"))) {
+      assertEquals(1, stream.read());
+    }
+    file = Files.newOutputStream(dir.resolve("otherFile"));
+    file.write(2);
+    file.close();
+
+    Files.move(dir.resolve("otherFile"), dir.resolve("target"), StandardCopyOption.REPLACE_EXISTING);
+    assertTrue(Files.exists(dir.resolve("target")));
+    assertFalse(Files.exists(dir.resolve("otherFile")));
+    try (InputStream stream = Files.newInputStream(dir.resolve("target"))) {
+      assertEquals(2, stream.read());
+    }
+  }
 }