summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2018-06-19 11:11:32 +0200
committerHarald Musum <musum@oath.com>2018-06-19 11:11:32 +0200
commit6e815de3db4027208184eebca20c8f953276ec45 (patch)
treeb711dcfde3095dc908bc0206164c063656863e90
parent149d942cb6f66f7d7d01e15f48fb84a9c6bad6e4 (diff)
Fix hash calculation for directory file references
Use the path to each file when walking through directory
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileDirectoryTest.java30
3 files changed, 22 insertions, 14 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
index df2287c64cb..a8159405edd 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java
@@ -78,7 +78,7 @@ public class FileDirectory {
return Files.walk(file.toPath(), 100).map(path -> {
try {
log.log(LogLevel.DEBUG, "Calculating hash for '" + path + "'");
- return hash(file, hasher);
+ return hash(path.toFile(), hasher);
} catch (IOException e) {
log.log(LogLevel.WARNING, "Failed getting hash from '" + path + "'");
return 0;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java
index 42bf269e9d2..37379a9aadc 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java
@@ -87,8 +87,8 @@ public class FileServer {
this.pullExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
}
- public boolean hasFile(String fileName) {
- return hasFile(new FileReference(fileName));
+ public boolean hasFile(String fileReference) {
+ return hasFile(new FileReference(fileReference));
}
private boolean hasFile(FileReference reference) {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileDirectoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileDirectoryTest.java
index 88a6b1a0303..400ae4734af 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileDirectoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileDirectoryTest.java
@@ -18,6 +18,7 @@ import java.nio.file.attribute.FileTime;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
public class FileDirectoryTest {
@@ -49,22 +50,29 @@ public class FileDirectoryTest {
String subdirName = "subdir";
File subDirectory = new File(temporaryFolder.getRoot(), subdirName);
- createFileInSubDir(subDirectory, "foo");
+ createFileInSubDir(subDirectory, "foo", "some content");
FileReference fileReference = fileDirectory.addFile(subDirectory);
File dir = fileDirectory.getFile(fileReference);
assertTrue(dir.exists());
assertTrue(new File(dir, "foo").exists());
assertFalse(new File(dir, "doesnotexist").exists());
- assertEquals("1315a322fc323608", fileReference.value());
+ assertEquals("bebc5a1aee74223d", fileReference.value());
+ // Change contents of a file, file reference value should change
+ createFileInSubDir(subDirectory, "foo", "new content");
+ FileReference fileReference2 = fileDirectory.addFile(subDirectory);
+ dir = fileDirectory.getFile(fileReference2);
+ assertTrue(new File(dir, "foo").exists());
+ assertNotEquals(fileReference + " should not be equal to " + fileReference2, fileReference, fileReference2);
+ assertEquals("e5d4b3fe5ee3ede3", fileReference2.value());
// Add a file, should be available and file reference should have another value
- createFileInSubDir(subDirectory, "bar");
- fileReference = fileDirectory.addFile(subDirectory);
- dir = fileDirectory.getFile(fileReference);
+ createFileInSubDir(subDirectory, "bar", "some other content");
+ FileReference fileReference3 = fileDirectory.addFile(subDirectory);
+ dir = fileDirectory.getFile(fileReference3);
assertTrue(new File(dir, "foo").exists());
assertTrue(new File(dir, "bar").exists());
- assertEquals("9ca074b47a4b510c", fileReference.value());
+ assertEquals("894bced3fc9d199b", fileReference3.value());
}
@Test
@@ -73,7 +81,7 @@ public class FileDirectoryTest {
String subdirName = "subdir";
File subDirectory = new File(temporaryFolder.getRoot(), subdirName);
- createFileInSubDir(subDirectory, "foo");
+ createFileInSubDir(subDirectory, "foo", "some content");
FileReference fileReference = fileDirectory.addFile(subDirectory);
File dir = fileDirectory.getFile(fileReference);
assertTrue(dir.exists());
@@ -81,7 +89,7 @@ public class FileDirectoryTest {
assertTrue(foo.exists());
FileTime fooCreatedTimestamp = Files.readAttributes(foo.toPath(), BasicFileAttributes.class).creationTime();
assertFalse(new File(dir, "doesnotexist").exists());
- assertEquals("1315a322fc323608", fileReference.value());
+ assertEquals("bebc5a1aee74223d", fileReference.value());
// Remove a file, directory should be deleted before adding a new file
try { Thread.sleep(1000);} catch (InterruptedException e) {/*ignore */} // Needed since we have timestamp resolution of 1 second
@@ -95,7 +103,7 @@ public class FileDirectoryTest {
// Check that creation timestamp is newer than the old one to be sure that a new file was written
assertTrue(foo2CreatedTimestamp.compareTo(fooCreatedTimestamp) > 0);
assertFalse(new File(dir, "doesnotexist").exists());
- assertEquals("1315a322fc323608", fileReference.value());
+ assertEquals("bebc5a1aee74223d", fileReference.value());
}
// Content in created file is equal to the filename string
@@ -105,11 +113,11 @@ public class FileDirectoryTest {
return fileDirectory.addFile(file);
}
- private void createFileInSubDir(File subDirectory, String filename) throws IOException {
+ private void createFileInSubDir(File subDirectory, String filename, String fileContent) throws IOException {
if (!subDirectory.exists())
subDirectory.mkdirs();
File file = new File(subDirectory, filename);
- IOUtils.writeFile(file, filename, false);
+ IOUtils.writeFile(file, fileContent, false);
}
}