From ff98082a143dc4b158d646f734518df51d061823 Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Sun, 22 May 2022 15:43:40 +0200 Subject: Make sure to delete directory for decompressed files if something fails Some other cosmetic fixes --- .../yahoo/vespa/filedistribution/FileReceiver.java | 21 ++++++++++----------- .../vespa/filedistribution/FileReferenceData.java | 21 +++++++++------------ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java index a2c5fee1e51..748d9eb1003 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java @@ -1,5 +1,4 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - package com.yahoo.vespa.filedistribution; import com.yahoo.config.FileReference; @@ -106,14 +105,15 @@ public class FileReceiver { } File close(long hash) { - if (hasher.getValue() != hash) { + if (hasher.getValue() != hash) throw new RuntimeException("xxhash from content (" + currentHash + ") is not equal to xxhash in request (" + hash + ")"); - } + File file = new File(fileReferenceDir, fileName); + File decompressedDir = null; try { // Unpack if necessary if (fileType == FileReferenceData.Type.compressed) { - File decompressedDir = Files.createTempDirectory(tmpDir.toPath(), "archive").toFile(); + decompressedDir = Files.createTempDirectory(tmpDir.toPath(), "archive").toFile(); CompressedFileReference.decompress(inprogressFile, decompressedDir); moveFileToDestination(decompressedDir, fileReferenceDir); } else { @@ -130,11 +130,8 @@ public class FileReceiver { log.log(Level.SEVERE, "Failed writing file: " + e.getMessage(), e); throw new RuntimeException("Failed writing file: ", e); } finally { - try { - Files.deleteIfExists(inprogressFile.toPath()); - } catch (IOException e) { - log.log(Level.SEVERE, "Failed deleting " + inprogressFile.getAbsolutePath() + ": " + e.getMessage(), e); - } + deletePath(inprogressFile); + deletePath(decompressedDir); } return file; } @@ -196,12 +193,14 @@ public class FileReceiver { log.log(Level.SEVERE, message, e); throw new RuntimeException(message, e); } finally { - deleteFileOrDirectory(tempFile); + deletePath(tempFile); } } - private static void deleteFileOrDirectory(File path) { + private static void deletePath(File path) { + if (path == null) return; if ( ! path.exists()) return; + try { if (path.isDirectory()) IOUtils.recursiveDeleteDir(path); diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceData.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceData.java index db6c4b70b83..03f8d184f94 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceData.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceData.java @@ -5,7 +5,6 @@ import com.yahoo.config.FileReference; import java.nio.ByteBuffer; - /** * Utility class for a file reference with data and metadata * @@ -13,7 +12,7 @@ import java.nio.ByteBuffer; */ public abstract class FileReferenceData { - public enum Type {file, compressed} + public enum Type { file, compressed } private final FileReference fileReference; private final String filename; @@ -25,17 +24,11 @@ public abstract class FileReferenceData { this.type = type; } - public FileReference fileReference() { - return fileReference; - } + public FileReference fileReference() {return fileReference;} - public String filename() { - return filename; - } + public String filename() {return filename;} - public Type type() { - return type; - } + public Type type() {return type;} public ByteBuffer content() { ByteBuffer bb = ByteBuffer.allocate((int)size()); @@ -54,7 +47,7 @@ public abstract class FileReferenceData { /** * Only guaranteed to be valid after all content has been consumed. - * @return xx64hash of content + * @return xxhash64 of content */ public abstract long xxhash(); @@ -70,4 +63,8 @@ public abstract class FileReferenceData { * */ public abstract void close(); + + @Override + public String toString() { return fileReference.value() + " (" + filename + "), " + type.name(); } + } -- cgit v1.2.3