From 2781145eb3760489922530fd92d5f1d4c35215a9 Mon Sep 17 00:00:00 2001 From: markrmiller Date: Thu, 29 Dec 2016 05:29:51 -0500 Subject: [PATCH] SOLR-9902: StandardDirectoryFactory should use Files API for it's move implementation. --- solr/CHANGES.txt | 1 + .../solr/core/StandardDirectoryFactory.java | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 852a30680df..06566e069e4 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -222,6 +222,7 @@ Optimizations resulting in less produced garbage and 5-7% better performance. (yonik) +* SOLR-9902: StandardDirectoryFactory should use Files API for it's move implementation. (Mark Miller) Bug Fixes ---------------------- diff --git a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java index b24be143153..1d8793afc68 100644 --- a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java +++ b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java @@ -129,13 +129,14 @@ public class StandardDirectoryFactory extends CachingDirectoryFactory { Directory baseToDir = getBaseDir(toDir); if (baseFromDir instanceof FSDirectory && baseToDir instanceof FSDirectory) { - File dir1 = ((FSDirectory) baseFromDir).getDirectory().toFile(); - File dir2 = ((FSDirectory) baseToDir).getDirectory().toFile(); - File indexFileInTmpDir = new File(dir1, fileName); - File indexFileInIndex = new File(dir2, fileName); - boolean success = indexFileInTmpDir.renameTo(indexFileInIndex); - if (success) { - return; + + Path path1 = ((FSDirectory) baseFromDir).getDirectory().toAbsolutePath(); + Path path2 = ((FSDirectory) baseFromDir).getDirectory().toAbsolutePath(); + + try { + Files.move(path1.resolve(fileName), path2.resolve(fileName), StandardCopyOption.ATOMIC_MOVE); + } catch (AtomicMoveNotSupportedException e) { + Files.move(path1.resolve(fileName), path2.resolve(fileName)); } } @@ -148,8 +149,9 @@ public class StandardDirectoryFactory extends CachingDirectoryFactory { if (baseDir instanceof FSDirectory) { Path path = ((FSDirectory) baseDir).getDirectory().toAbsolutePath(); try { - Files.move(FileSystems.getDefault().getPath(path.toString(), fileName), - FileSystems.getDefault().getPath(path.toString(), toName), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); + Files.move(path.resolve(fileName), + path.resolve(toName), StandardCopyOption.ATOMIC_MOVE, + StandardCopyOption.REPLACE_EXISTING); } catch (AtomicMoveNotSupportedException e) { Files.move(FileSystems.getDefault().getPath(path.toString(), fileName), FileSystems.getDefault().getPath(path.toString(), toName), StandardCopyOption.REPLACE_EXISTING);