aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@yahooinc.com>2022-11-02 13:34:03 +0100
committerHåkon Hallingstad <hakon@yahooinc.com>2022-11-02 13:34:03 +0100
commit8e599c8cf8fa47fd3d4f12fa648ff086010d11ea (patch)
tree3bfc2c0844462c766114560a87af6204c13900ad /node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java
parent82a57bbed60b624999da93f18eb05746d0ede3f7 (diff)
Log core dump processing
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java55
1 files changed, 55 insertions, 0 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java
new file mode 100644
index 00000000000..a5ba78e524e
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/FileMover.java
@@ -0,0 +1,55 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.task.util.file;
+
+import com.yahoo.vespa.hosted.node.admin.component.TaskContext;
+
+import java.nio.file.CopyOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import static com.yahoo.yolean.Exceptions.uncheck;
+
+/**
+ * Utility for idempotent move of (any type of) file.
+ *
+ * @author hakonhall
+ */
+public class FileMover {
+ private static final Logger logger = Logger.getLogger(FileMover.class.getName());
+
+ private final Path source;
+ private final Path destination;
+ private final Set<CopyOption> moveOptions = new HashSet<>();
+
+ public FileMover(Path source, Path destination) {
+ this.source = source;
+ this.destination = destination;
+ }
+
+ public FileMover replaceExisting() {
+ moveOptions.add(StandardCopyOption.REPLACE_EXISTING);
+ return this;
+ }
+
+ public FileMover atomic() {
+ moveOptions.add(StandardCopyOption.ATOMIC_MOVE);
+ return this;
+ }
+
+ /**
+ * Move file.
+ *
+ * @return false if the source doesn't exist while the destination do.
+ * @see Files#move(Path, Path, CopyOption...) Files.move()
+ */
+ public boolean converge(TaskContext context) {
+ if (!Files.exists(source) && Files.exists(destination)) return false;
+ uncheck(() -> Files.move(source, destination, moveOptions.toArray(CopyOption[]::new)));
+ context.recordSystemModification(logger, "Moved " + source + " to " + destination);
+ return true;
+ }
+}