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());
+ }
+ }
}