From 63f5946527bc4d7bcc56d0ed474cce9c1eca8c0f Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 14 Aug 2021 14:30:06 +0100 Subject: [PATCH] Switched all system-generated temp paths to a user specified "tempDataPath". This ensures that the temporary files are being kept with the rest of the data, rather than somewhere inappropriate such as on flash storage. It also allows the user to locate them somewhere else, such as on a dedicated drive. --- .../org/qortal/arbitrary/ArbitraryDataDiff.java | 15 ++++++++++++--- .../org/qortal/arbitrary/ArbitraryDataFile.java | 12 +++++++----- .../org/qortal/arbitrary/ArbitraryDataMerge.java | 15 ++++++++++++--- .../org/qortal/arbitrary/ArbitraryDataReader.java | 8 ++++---- .../org/qortal/arbitrary/ArbitraryDataWriter.java | 11 ++++++++--- src/main/java/org/qortal/settings/Settings.java | 6 ++++++ 6 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java index defc4a4b..17b67960 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java @@ -3,12 +3,14 @@ package org.qortal.arbitrary; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.crypto.Crypto; +import org.qortal.settings.Settings; import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; +import java.util.UUID; public class ArbitraryDataDiff { @@ -17,6 +19,7 @@ public class ArbitraryDataDiff { private Path pathBefore; private Path pathAfter; private Path diffPath; + private String identifier; public ArbitraryDataDiff(Path pathBefore, Path pathAfter) { this.pathBefore = pathBefore; @@ -35,6 +38,7 @@ public class ArbitraryDataDiff { } private void preExecute() { + this.createRandomIdentifier(); this.createOutputDirectory(); } @@ -42,11 +46,16 @@ public class ArbitraryDataDiff { } + private void createRandomIdentifier() { + this.identifier = UUID.randomUUID().toString(); + } + private void createOutputDirectory() { - // Ensure temp folder exists - Path tempDir; + // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware + String baseDir = Settings.getInstance().getTempDataPath(); + Path tempDir = Paths.get(baseDir, "diff", this.identifier); try { - tempDir = Files.createTempDirectory("qortal-diff"); + Files.createDirectories(tempDir); } catch (IOException e) { throw new IllegalStateException("Unable to create temp directory"); } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java index 4b91219e..9bb6fae9 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java @@ -255,13 +255,15 @@ public class ArbitraryDataFile { if (this.chunks != null && this.chunks.size() > 0) { // Create temporary path for joined file - Path tempPath; + // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware + String baseDir = Settings.getInstance().getTempDataPath(); + Path tempDir = Paths.get(baseDir, "join", this.chunks.get(0).digest58()); try { - tempPath = Files.createTempFile(this.chunks.get(0).digest58(), ".tmp"); + Files.createDirectories(tempDir); } catch (IOException e) { return false; } - this.filePath = tempPath.toString(); + this.filePath = tempDir.toString(); // Join the chunks File outputFile = new File(this.filePath); @@ -279,8 +281,8 @@ public class ArbitraryDataFile { out.close(); // Copy temporary file to data directory - this.filePath = this.copyToDataDirectory(tempPath); - Files.delete(tempPath); + this.filePath = this.copyToDataDirectory(tempDir); + Files.delete(tempDir); return true; } catch (FileNotFoundException e) { diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataMerge.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataMerge.java index f1163da4..8ac19db5 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataMerge.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataMerge.java @@ -4,6 +4,7 @@ import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.crypto.Crypto; +import org.qortal.settings.Settings; import org.qortal.utils.FilesystemUtils; import java.io.File; @@ -11,6 +12,7 @@ import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; +import java.util.UUID; public class ArbitraryDataMerge { @@ -19,6 +21,7 @@ public class ArbitraryDataMerge { private Path pathBefore; private Path pathAfter; private Path mergePath; + private String identifier; public ArbitraryDataMerge(Path pathBefore, Path pathAfter) { this.pathBefore = pathBefore; @@ -37,6 +40,7 @@ public class ArbitraryDataMerge { } private void preExecute() { + this.createRandomIdentifier(); this.createOutputDirectory(); } @@ -44,11 +48,16 @@ public class ArbitraryDataMerge { } + private void createRandomIdentifier() { + this.identifier = UUID.randomUUID().toString(); + } + private void createOutputDirectory() { - // Ensure temp folder exists - Path tempDir; + // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware + String baseDir = Settings.getInstance().getTempDataPath(); + Path tempDir = Paths.get(baseDir, "merge", this.identifier); try { - tempDir = Files.createTempDirectory("qortal-diff"); + Files.createDirectories(tempDir); } catch (IOException e) { throw new IllegalStateException("Unable to create temp directory"); } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index 219d2293..4cf2486e 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -9,6 +9,7 @@ import org.qortal.repository.DataException; import org.qortal.repository.Repository; import org.qortal.repository.RepositoryManager; import org.qortal.arbitrary.ArbitraryDataFile.*; +import org.qortal.settings.Settings; import org.qortal.transform.Transformer; import org.qortal.utils.Base58; import org.qortal.utils.FilesystemUtils; @@ -81,9 +82,9 @@ public class ArbitraryDataReader { } private void createWorkingDirectory() { - // Use the system tmpdir as our base, as it is deterministic - String baseDir = System.getProperty("java.io.tmpdir"); - Path tempDir = Paths.get(baseDir + File.separator + "qortal" + File.separator + this.resourceId); + // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware + String baseDir = Settings.getInstance().getTempDataPath(); + Path tempDir = Paths.get(baseDir, "reader", this.resourceId); try { Files.createDirectories(tempDir); } catch (IOException e) { @@ -93,7 +94,6 @@ public class ArbitraryDataReader { } private void createUncompressedDirectory() { - // Use the system tmpdir as our base, as it is deterministic this.uncompressedPath = Paths.get(this.workingPath.toString() + File.separator + "data"); try { Files.createDirectories(this.uncompressedPath); diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java index 5d987b8d..d87256d0 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java @@ -3,10 +3,13 @@ package org.qortal.arbitrary; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.qortal.crypto.Crypto; import org.qortal.data.transaction.ArbitraryTransactionData.*; import org.qortal.crypto.AES; import org.qortal.repository.DataException; import org.qortal.arbitrary.ArbitraryDataFile.*; +import org.qortal.settings.Settings; +import org.qortal.utils.Base58; import org.qortal.utils.ZipUtils; import javax.crypto.BadPaddingException; @@ -78,10 +81,12 @@ public class ArbitraryDataWriter { } private void createWorkingDirectory() { - // Ensure temp folder exists - Path tempDir; + // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware + String baseDir = Settings.getInstance().getTempDataPath(); + String identifier = Crypto.digest(this.filePath.toString().getBytes()).toString(); + Path tempDir = Paths.get(baseDir, "writer", identifier); try { - tempDir = Files.createTempDirectory("qortal"); + Files.createDirectories(tempDir); } catch (IOException e) { throw new IllegalStateException("Unable to create temp directory"); } diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 7cd0f941..49a8a42c 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -206,6 +206,8 @@ public class Settings { /** Data storage path. */ private String dataPath = "data"; + /** Data storage path (for temporary data). */ + private String tempDataPath = "data/_temp"; // Domain mapping @@ -627,4 +629,8 @@ public class Settings { public String getDataPath() { return this.dataPath; } + + public String getTempDataPath() { + return this.tempDataPath; + } }