[tor-commits] [metrics-lib/release] Added test and cure for corrupted history file.

karsten at torproject.org karsten at torproject.org
Fri Feb 17 15:44:44 UTC 2017


commit 3e37f25eb203a24c4b7b9d807a28b1a98a4e323e
Author: iwakeh <iwakeh at torproject.org>
Date:   Tue Dec 13 20:14:44 2016 +0100

    Added test and cure for corrupted history file.
    In that case a warning is logged and parsing continued.
    
    Warning makes sense, as it could be due to problems with the
    file system, which an operator can do something about.
---
 .../descriptor/impl/DescriptorReaderImpl.java        | 20 ++++++++++----------
 .../descriptor/impl/DescriptorReaderImplTest.java    | 18 +++++++++++++++++-
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/torproject/descriptor/impl/DescriptorReaderImpl.java b/src/main/java/org/torproject/descriptor/impl/DescriptorReaderImpl.java
index cf2939a..6a3cd64 100644
--- a/src/main/java/org/torproject/descriptor/impl/DescriptorReaderImpl.java
+++ b/src/main/java/org/torproject/descriptor/impl/DescriptorReaderImpl.java
@@ -232,20 +232,20 @@ public class DescriptorReaderImpl implements DescriptorReader {
       try {
         lines = Files.readAllLines(historyFile.toPath(),
             StandardCharsets.UTF_8);
+        for (String line : lines) {
+          if (!line.contains(" ")) {
+            log.warn("Unexpected line structure in old history: {}", line);
+            continue;
+          }
+          long lastModifiedMillis = Long.parseLong(line.substring(0,
+              line.indexOf(" ")));
+          String absolutePath = line.substring(line.indexOf(" ") + 1);
+          this.excludedFilesBefore.put(absolutePath, lastModifiedMillis);
+        }
       } catch (IOException | NumberFormatException e) {
         log.warn("Trouble reading given history file {}.", historyFile, e);
         return;
       }
-      for (String line : lines) {
-        if (!line.contains(" ")) {
-          log.warn("Unexpected line structure in old history: {}", line);
-          continue;
-        }
-        long lastModifiedMillis = Long.parseLong(line.substring(0,
-            line.indexOf(" ")));
-        String absolutePath = line.substring(line.indexOf(" ") + 1);
-        this.excludedFilesBefore.put(absolutePath, lastModifiedMillis);
-      }
     }
 
     private void writeNewHistory(File historyFile) {
diff --git a/src/test/java/org/torproject/descriptor/impl/DescriptorReaderImplTest.java b/src/test/java/org/torproject/descriptor/impl/DescriptorReaderImplTest.java
index d5b1572..c01984d 100644
--- a/src/test/java/org/torproject/descriptor/impl/DescriptorReaderImplTest.java
+++ b/src/test/java/org/torproject/descriptor/impl/DescriptorReaderImplTest.java
@@ -62,12 +62,15 @@ public class DescriptorReaderImplTest {
         parseHistoryContents.getBytes(StandardCharsets.UTF_8));
   }
 
-  private void readAllDescriptors() {
+  private int readAllDescriptors() {
     Iterator<DescriptorFile> descriptorFiles =
         this.descriptorReader.readDescriptors();
+    int count = 0;
     while (descriptorFiles.hasNext()) {
+      count++;
       descriptorFiles.next();
     }
+    return count;
   }
 
   private void assertExcludedFilesParsedFilesAndHistoryFileLines(
@@ -147,5 +150,18 @@ public class DescriptorReaderImplTest {
     this.readAllDescriptors();
     this.assertExcludedFilesParsedFilesAndHistoryFileLines(0, 0, 1);
   }
+
+  @Test
+  public void testSetHistoryCorruptFile() throws IOException {
+    File corruptHistoryFile = this.temporaryFolder.newFile("corruptHistory");
+    Files.write(corruptHistoryFile.toPath(),"1293145200000  \n   ".getBytes());
+    this.descriptorReader.setHistoryFile(corruptHistoryFile);
+    this.descriptorReader.addDirectory(this.inputDirectory);
+    int count = this.readAllDescriptors();
+    assertEquals("Two files should have been parsed.", 2, count);
+    descriptorReader.saveHistoryFile(this.historyFile);
+    this.assertExcludedFilesParsedFilesAndHistoryFileLines(0, 2, 2);
+  }
+
 }
 





More information about the tor-commits mailing list