From 51268887ba8abe87a62cb07a6fe3fcf3194a8560 Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Mon, 13 Nov 2017 13:48:15 +0100 Subject: Fix adding file reference Handle destination dir existing Use createTempDirectory --- .../config/server/filedistribution/FileDirectory.java | 17 +++++++++++------ .../config/server/filedistribution/FileServer.java | 2 +- .../com/yahoo/vespa/config/server/rpc/RpcServer.java | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) (limited to 'configserver') 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 5a7bc4e7e82..b0042b15470 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,6 +5,7 @@ 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; @@ -13,6 +14,8 @@ import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.logging.Logger; public class FileDirectory { @@ -88,22 +91,24 @@ public class FileDirectory { throw new IllegalArgumentException(e); } } + public FileReference addFile(File source, FileReference reference) { ensureRootExist(); try { File destinationDir = new File(root, reference.value()); if (!destinationDir.exists()) { destinationDir.mkdir(); - File tempDestinationDir = File.createTempFile("writing", null, root); - tempDestinationDir.mkdir(); - File destination = new File(tempDestinationDir, source.getName()); + Path tempDestinationDir = Files.createTempDirectory(root.toPath(), "writing"); + File destination = new File(tempDestinationDir.toFile(), source.getName()); IOUtils.copy(source, destination); if (!destinationDir.exists()) { - if ( ! tempDestinationDir.renameTo(destinationDir)) { - log.warning("Failed moving '" + tempDestinationDir.getAbsolutePath() + "' to '" + destination.getAbsolutePath() + "'."); + if ( ! tempDestinationDir.toFile().renameTo(destinationDir)) { + log.warning("Failed moving '" + tempDestinationDir.toFile().getAbsolutePath() + "' to '" + destination.getAbsolutePath() + "'."); } + } else { + IOUtils.copyDirectory(tempDestinationDir.toFile(), destinationDir, 1); } - IOUtils.recursiveDeleteDir(tempDestinationDir); + IOUtils.recursiveDeleteDir(tempDestinationDir.toFile()); } return reference; } catch (IOException e) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java index 2ee74689ea9..a504cd120ee 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java @@ -70,7 +70,7 @@ public class FileServer { private void serveFile(FileReference reference, Receiver target) { File file = root.getFile(reference); // TODO remove once verified in system tests. - log.info("Start serving reference '" + reference.toString() + "' with file '" + file.getAbsolutePath() + "'"); + log.info("Start serving reference '" + reference.value() + "' with file '" + file.getAbsolutePath() + "'"); byte [] blob = new byte [0]; boolean success = false; String errorDescription = "OK"; diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java index 617a054d0c7..7c5adb3b932 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java @@ -451,7 +451,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { fileBlob.parameters().add(new StringValue(status.getDescription())); target.invokeSync(fileBlob, 600); if (fileBlob.isError()) { - log.warning("Failed delivering reference '" + reference + "' with file '" + filename + "' to " + + log.warning("Failed delivering reference '" + reference.value() + "' with file '" + filename + "' to " + target.toString() + " with error : '" + fileBlob.errorMessage() + "'."); } } -- cgit v1.2.3