[tor-commits] [metrics-lib/master] Handle exceptions when reading descriptors from disk.

karsten at torproject.org karsten at torproject.org
Wed Feb 1 10:32:13 UTC 2012


commit 125d5ededae50f1b563e734fac8abc10ac5a6dbd
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Wed Feb 1 11:26:40 2012 +0100

    Handle exceptions when reading descriptors from disk.
---
 src/org/torproject/descriptor/DescriptorFile.java  |    4 +
 .../descriptor/impl/DescriptorFileImpl.java        |   12 ++++-
 .../impl/RelayOrBridgeDescriptorReaderImpl.java    |   59 +++++++++-----------
 3 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/src/org/torproject/descriptor/DescriptorFile.java b/src/org/torproject/descriptor/DescriptorFile.java
index 7a70e17..863ce92 100644
--- a/src/org/torproject/descriptor/DescriptorFile.java
+++ b/src/org/torproject/descriptor/DescriptorFile.java
@@ -21,5 +21,9 @@ public interface DescriptorFile {
 
   /* Return the descriptors contained in the descriptor file. */
   public List<Descriptor> getDescriptors();
+
+  /* Return the first exception that was thrown when reading this file or
+   * parsing its content, or null if no exception was thrown. */
+  public Exception getException();
 }
 
diff --git a/src/org/torproject/descriptor/impl/DescriptorFileImpl.java b/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
index 29002a5..787961b 100644
--- a/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
@@ -3,6 +3,7 @@
 package org.torproject.descriptor.impl;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.torproject.descriptor.Descriptor;
@@ -39,7 +40,16 @@ public class DescriptorFileImpl implements DescriptorFile {
     this.descriptors = descriptors;
   }
   public List<Descriptor> getDescriptors() {
-    return this.descriptors;
+    return this.descriptors == null ? new ArrayList<Descriptor>() :
+      new ArrayList<Descriptor>(this.descriptors);
+  }
+
+  private Exception exception;
+  protected void setException(Exception exception) {
+    this.exception = exception;
+  }
+  public Exception getException() {
+    return this.exception;
   }
 }
 
diff --git a/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java
index 3cfb18e..60c1e36 100644
--- a/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java
@@ -144,40 +144,35 @@ public class RelayOrBridgeDescriptorReaderImpl
     }
     private void readDescriptors() {
       for (File directory : this.directories) {
-        try {
-          Stack<File> files = new Stack<File>();
-          files.add(directory);
-          while (!files.isEmpty()) {
-            File file = files.pop();
-            if (file.isDirectory()) {
-              files.addAll(Arrays.asList(file.listFiles()));
-            } else {
-              String absolutePath = file.getAbsolutePath();
-              long lastModifiedMillis = file.lastModified();
-              this.newHistory.put(absolutePath, lastModifiedMillis);
-              if (this.oldHistory.containsKey(absolutePath) &&
-                  this.oldHistory.get(absolutePath) ==
-                  lastModifiedMillis) {
-                continue;
-              }
-              try {
-                List<Descriptor> parsedDescriptors = this.readFile(file);
-                DescriptorFileImpl descriptorFile =
-                    new DescriptorFileImpl();
-                descriptorFile.setDirectory(directory);
-                descriptorFile.setFile(file);
-                descriptorFile.setLastModified(lastModifiedMillis);
-                descriptorFile.setDescriptors(parsedDescriptors);
-                this.descriptorQueue.add(descriptorFile);
-              } catch (DescriptorParseException e) {
-                /* TODO Handle me. */
-              }
+        Stack<File> files = new Stack<File>();
+        files.add(directory);
+        boolean abortReading = false;
+        while (!abortReading && !files.isEmpty()) {
+          File file = files.pop();
+          if (file.isDirectory()) {
+            files.addAll(Arrays.asList(file.listFiles()));
+          } else {
+            String absolutePath = file.getAbsolutePath();
+            long lastModifiedMillis = file.lastModified();
+            this.newHistory.put(absolutePath, lastModifiedMillis);
+            if (this.oldHistory.containsKey(absolutePath) &&
+                this.oldHistory.get(absolutePath) == lastModifiedMillis) {
+              continue;
             }
+            DescriptorFileImpl descriptorFile = new DescriptorFileImpl();
+            try {
+              descriptorFile.setDirectory(directory);
+              descriptorFile.setFile(file);
+              descriptorFile.setLastModified(lastModifiedMillis);
+              descriptorFile.setDescriptors(this.readFile(file));
+            } catch (DescriptorParseException e) {
+              descriptorFile.setException(e);
+            } catch (IOException e) {
+              descriptorFile.setException(e);
+              abortReading = true;
+            }
+            this.descriptorQueue.add(descriptorFile);
           }
-        } catch (IOException e) {
-          System.err.println("Error while reading descriptors in '"
-              + directory.getAbsolutePath() + "'.");
-          /* TODO Handle this exception somehow. */
         }
       }
       this.descriptorQueue.setOutOfDescriptors();



More information about the tor-commits mailing list