From 10ae09edd7270e07a184319edca2366a6be55066 Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Tue, 30 Jan 2018 10:32:54 +0100 Subject: Do not create dir when moving compressed data --- .../yahoo/vespa/filedistribution/FileReceiver.java | 14 +++++----- .../vespa/filedistribution/FileReceiverTest.java | 31 +++++++++++++++++++++- 2 files changed, 37 insertions(+), 8 deletions(-) (limited to 'filedistribution') 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 d9d1b4984eb..43a5eae90bf 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java @@ -75,17 +75,11 @@ public class FileReceiver { currentHash = 0; fileReferenceDir = new File(downloadDirectory, reference.value()); this.tmpDir = tmpDirectory; - try { - Files.createDirectories(fileReferenceDir.toPath()); - } catch (IOException e) { - log.log(LogLevel.ERROR, "Failed creating directory(" + fileReferenceDir.toPath() + "): " + e.getMessage(), e); - throw new RuntimeException("Failed creating directory(" + fileReferenceDir.toPath() + "): ", e); - } try { inprogressFile = Files.createTempFile(tmpDirectory.toPath(), fileName, ".inprogress").toFile(); } catch (IOException e) { - String msg = "Failed creating temp file for inprogress file for(" + fileName + ") in '" + fileReferenceDir.toPath() + "': "; + String msg = "Failed creating temp file for inprogress file for " + fileName + " in '" + tmpDirectory.toPath() + "': "; log.log(LogLevel.ERROR, msg + e.getMessage(), e); throw new RuntimeException(msg, e); } @@ -124,6 +118,12 @@ public class FileReceiver { CompressedFileReference.decompress(inprogressFile, decompressedDir); moveFileToDestination(decompressedDir, fileReferenceDir); } else { + try { + Files.createDirectories(fileReferenceDir.toPath()); + } catch (IOException e) { + log.log(LogLevel.ERROR, "Failed creating directory (" + fileReferenceDir.toPath() + "): " + e.getMessage(), e); + throw new RuntimeException("Failed creating directory (" + fileReferenceDir.toPath() + "): ", e); + } log.log(LogLevel.DEBUG, "Uncompressed file, moving to " + file.getAbsolutePath()); moveFileToDestination(inprogressFile, file); } diff --git a/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReceiverTest.java b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReceiverTest.java index afa66f89efc..78fc094a9ef 100644 --- a/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReceiverTest.java +++ b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReceiverTest.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.filedistribution; import com.yahoo.config.FileReference; +import com.yahoo.io.IOUtils; import com.yahoo.text.Utf8; import net.jpountz.xxhash.XXHash64; import net.jpountz.xxhash.XXHashFactory; @@ -12,11 +13,15 @@ import org.junit.rules.TemporaryFolder; import static org.junit.Assert.assertEquals; - import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; public class FileReceiverTest { private File root; @@ -48,6 +53,23 @@ public class FileReceiverTest { transferPartsAndAssert(new FileReference("ref-a"), "myfile-3", all, 3); } + @Test + public void receiveCompressedParts() throws IOException{ + File dirWithFiles = temporaryFolder.newFolder("files"); + FileWriter writerA = new FileWriter(new File(dirWithFiles, "a")); + writerA.write("1"); + writerA.close(); + FileWriter writerB = new FileWriter(new File(dirWithFiles, "b")); + writerB.write("2"); + writerB.close(); + + byte[] data = CompressedFileReference.compress(dirWithFiles); + transferCompressedData(new FileReference("ref"), "a", data); + File downloadDir = new File(root, "ref"); + assertEquals("1", IOUtils.readFile(new File(downloadDir, "a"))); + assertEquals("2", IOUtils.readFile(new File(downloadDir, "b"))); + } + private void transferPartsAndAssert(FileReference ref, String fileName, String all, int numParts) throws IOException { byte [] allContent = Utf8.toBytes(all); @@ -69,4 +91,11 @@ public class FileReceiverTest { file.delete(); assertEquals(all, Utf8.toString(allReadBytes)); } + + private void transferCompressedData(FileReference ref, String fileName, byte[] data) throws IOException { + FileReceiver.Session session = + new FileReceiver.Session(root, tempDir, 1, ref, FileReferenceData.Type.compressed, fileName, data.length); + session.addPart(0, data); + session.close(hasher.hash(ByteBuffer.wrap(data), 0)); + } } -- cgit v1.2.3