[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