Atomically replace objects in filesystem putBlob
Fixes gaul/s3proxy#490. This fixes a regression from
41ce90ec360a46cb7b03f7cb8b66e01a113aa5b6. Continue to support
Windows logic although it is unclear if this is necessary.
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 8b9ada1..1a58fb5 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -24,6 +24,7 @@
import static java.nio.file.Files.createDirectories;
import static java.nio.file.Files.getFileAttributeView;
import static java.nio.file.Files.getPosixFilePermissions;
+import static java.nio.file.Files.move;
import static java.nio.file.Files.probeContentType;
import static java.nio.file.Files.readAttributes;
import static java.nio.file.Files.setPosixFilePermissions;
@@ -44,6 +45,7 @@
import java.nio.file.AccessDeniedException;
import java.nio.file.DirectoryStream;
import java.nio.file.NoSuchFileException;
+import java.nio.file.StandardCopyOption;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
@@ -583,7 +585,8 @@
eTag = actualHashCode.asBytes();
}
- if (outputFile.exists()) {
+ // TODO: is this necessary?
+ if (isWindows() && outputFile.exists()) {
delete(outputFile);
}
@@ -599,9 +602,7 @@
setBlobAccess(containerName, tmpBlobName, access);
- if (!tmpFile.renameTo(outputFile)) {
- throw new IOException("Could not rename file " + tmpFile + " to " + outputFile);
- }
+ move(tmpPath, outputFile.toPath(), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
tmpFile = null;
return base16().lowerCase().encode(eTag);