aboutsummaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2022-11-14 14:43:54 +0100
committerHarald Musum <musum@yahooinc.com>2022-11-14 14:43:54 +0100
commitd84d60c3a1f9fd4347365ddb935bb215233681d5 (patch)
tree08e34a56b702b5601f1adefa2cbf2e3f80302d99 /configserver
parent0e513c5bf3b048c901293b9b53c04847f103dafa (diff)
Always move atomically as final step
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java39
1 files changed, 19 insertions, 20 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 5cc272ca197..521f34b700f 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
@@ -11,6 +11,7 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
@@ -131,30 +132,28 @@ public class FileDirectory {
ensureRootExist();
Path tempDestinationDir = uncheck(() -> Files.createTempDirectory(root.toPath(), "writing"));
try {
+ // Prepare and verify
logfileInfo(source);
File destinationDir = destinationDir(reference);
- File destination = new File(tempDestinationDir.toFile(), source.getName());
- if (!destinationDir.exists()) {
- destinationDir.mkdir();
- log.log(Level.FINE, () -> "file reference '" + reference.value() + "', source: " + source.getAbsolutePath() );
- if (source.isDirectory()) {
- log.log(Level.FINE, () -> "Copying source " + source.getAbsolutePath() + " to " + destination.getAbsolutePath());
- IOUtils.copyDirectory(source, destination, -1);
- } else {
- copyFile(source, destination);
- }
- if (!destinationDir.exists()) {
- log.log(Level.FINE, () -> "Moving from " + tempDestinationDir + " to " + destinationDir.getAbsolutePath());
- if ( ! tempDestinationDir.toFile().renameTo(destinationDir)) {
- log.log(Level.WARNING, "Failed moving '" + tempDestinationDir.toFile().getAbsolutePath() + "' to '" + destination.getAbsolutePath() + "'.");
- }
- } else {
- IOUtils.copyDirectory(tempDestinationDir.toFile(), destinationDir, -1);
- }
- }
+ File tempDestination = new File(tempDestinationDir.toFile(), source.getName());
+ if ( ! destinationDir.mkdir())
+ log.log(Level.WARNING, () -> "destination dir " + destinationDir + " already exists");
+
+ // Copy files
+ log.log(Level.FINE, () -> "Copying " + source.getAbsolutePath() + " to " + tempDestination.getAbsolutePath());
+ if (source.isDirectory())
+ IOUtils.copyDirectory(source, tempDestination, -1);
+ else
+ copyFile(source, tempDestination);
+
+ // Move to final destination
+ log.log(Level.FINE, () -> "Moving " + tempDestinationDir + " to " + destinationDir.getAbsolutePath());
+ if ( ! tempDestinationDir.toFile().renameTo(destinationDir))
+ log.log(Level.WARNING, "Failed moving '" + tempDestinationDir.toFile().getAbsolutePath() +
+ "' to '" + tempDestination.getAbsolutePath() + "'.");
return reference;
} catch (IOException e) {
- throw new IllegalArgumentException(e);
+ throw new UncheckedIOException(e);
} finally {
IOUtils.recursiveDeleteDir(tempDestinationDir.toFile());
}