summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2017-11-25 19:10:36 +0100
committerHarald Musum <musum@oath.com>2017-11-25 19:10:36 +0100
commitc2a2ce7f04fba05a643aee7d8c53a70359a462be (patch)
treeaf7442b9ab28e975270e29cd68c7561f91d4d7d3
parent7e8f8da8f249cf3c529cec8ecdcf13b69c99da13 (diff)
Copy file in a way that preserves the content
IOUtils.copy(File, File) copies by using readers and default character set, does not work for binary files).
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java22
1 files changed, 21 insertions, 1 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
index 7d0ba6cd9bd..d8a560c6159 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
@@ -5,16 +5,21 @@ package com.yahoo.vespa.config.server.filedistribution;
import com.yahoo.config.FileReference;
import com.yahoo.config.model.api.FileDistribution;
import com.yahoo.io.IOUtils;
+import com.yahoo.log.LogLevel;
import com.yahoo.text.Utf8;
import net.jpountz.xxhash.XXHash64;
import net.jpountz.xxhash.XXHashFactory;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
import java.util.logging.Logger;
public class FileDirectory {
@@ -94,6 +99,7 @@ public class FileDirectory {
public FileReference addFile(File source, FileReference reference) {
ensureRootExist();
try {
+ logfileInfo(source);
File destinationDir = new File(root, reference.value());
if (!destinationDir.exists()) {
destinationDir.mkdir();
@@ -102,7 +108,7 @@ public class FileDirectory {
if (source.isDirectory())
IOUtils.copyDirectory(source, destination);
else
- IOUtils.copy(source, destination);
+ copyFile(source, destination);
if (!destinationDir.exists()) {
if ( ! tempDestinationDir.toFile().renameTo(destinationDir)) {
log.warning("Failed moving '" + tempDestinationDir.toFile().getAbsolutePath() + "' to '" + destination.getAbsolutePath() + "'.");
@@ -117,4 +123,18 @@ public class FileDirectory {
throw new IllegalArgumentException(e);
}
}
+
+ private void logfileInfo(File file ) throws IOException {
+ BasicFileAttributes basicFileAttributes = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
+ log.log(LogLevel.DEBUG, "Adding file " + file.getAbsolutePath() + " (created " + basicFileAttributes.creationTime() +
+ ", modified " + basicFileAttributes.lastModifiedTime() +
+ ", size " + basicFileAttributes.size() + ")");
+ }
+
+ private static void copyFile(File source, File dest) throws IOException {
+ try (FileChannel sourceChannel = new FileInputStream(source).getChannel();
+ FileChannel destChannel = new FileOutputStream(dest).getChannel()) {
+ destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
+ }
+ }
}