[tor-commits] [metrics-lib/master] Merge relay and bridge descriptor readers.
karsten at torproject.org
karsten at torproject.org
Sun Jan 15 07:16:06 UTC 2012
commit 09f9be613307fca70f0eaef8e862981e42fee134
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Sun Jan 15 08:12:44 2012 +0100
Merge relay and bridge descriptor readers.
---
.../descriptor/BridgeDescriptorReader.java | 11 +-
.../descriptor/DescriptorSourceFactory.java | 7 +-
.../example/MetricsRelayDescriptorAggregator.java | 4 +-
.../example/TorStatusDatabaseUpdater.java | 4 +-
.../impl/BridgeDescriptorReaderImpl.java | 106 ------------
.../torproject/descriptor/impl/DescriptorImpl.java | 38 +----
.../descriptor/impl/RelayDescriptorReaderImpl.java | 172 -------------------
.../impl/RelayOrBridgeDescriptorReaderImpl.java | 173 ++++++++++++++++++++
8 files changed, 193 insertions(+), 322 deletions(-)
diff --git a/src/org/torproject/descriptor/BridgeDescriptorReader.java b/src/org/torproject/descriptor/BridgeDescriptorReader.java
index fdb30d0..c055557 100644
--- a/src/org/torproject/descriptor/BridgeDescriptorReader.java
+++ b/src/org/torproject/descriptor/BridgeDescriptorReader.java
@@ -13,11 +13,12 @@ public interface BridgeDescriptorReader {
/* Add a local directory to read bridge descriptors from. */
public void addDirectory(File directory);
- /* Exclude the given file from the results. */
- public void setExcludeFile(File fileToExclude);
-
- /* Exclude the given files from the results. */
- public void setExcludeFiles(Set<File> filesToExclude);
+ /* Exclude files that are contained in the given history file and that
+ * haven't changed since they were last read. Add reads from the
+ * current run to the history file. Remove files that don't exist
+ * anymore from the history file. Lines in the history file contain the
+ * last modified timestamp and the absolute path of a file. */
+ public void setExcludeFiles(File historyFile);
/* Read the previously configured bridge descriptors and make them
* available via the returned blocking iterator. Whenever the reader
diff --git a/src/org/torproject/descriptor/DescriptorSourceFactory.java b/src/org/torproject/descriptor/DescriptorSourceFactory.java
index ec7479b..9dcba61 100644
--- a/src/org/torproject/descriptor/DescriptorSourceFactory.java
+++ b/src/org/torproject/descriptor/DescriptorSourceFactory.java
@@ -2,16 +2,15 @@
* See LICENSE for licensing information */
package org.torproject.descriptor;
-import org.torproject.descriptor.impl.RelayDescriptorReaderImpl;
+import org.torproject.descriptor.impl.RelayOrBridgeDescriptorReaderImpl;
import org.torproject.descriptor.impl.RelayDescriptorDownloaderImpl;
-import org.torproject.descriptor.impl.BridgeDescriptorReaderImpl;
/* Create descriptor source instances. */
public class DescriptorSourceFactory {
/* Create a relay descriptor reader. */
public static RelayDescriptorReader createRelayDescriptorReader() {
- return new RelayDescriptorReaderImpl();
+ return new RelayOrBridgeDescriptorReaderImpl();
}
/* Create a relay descriptor downloader. */
@@ -22,7 +21,7 @@ public class DescriptorSourceFactory {
/* Create a bridge descriptor reader. */
public static BridgeDescriptorReader createBridgeDescriptorReader() {
- return new BridgeDescriptorReaderImpl();
+ return new RelayOrBridgeDescriptorReaderImpl();
}
}
diff --git a/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java b/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
index 9aa2600..0d9da8d 100644
--- a/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
+++ b/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
@@ -52,8 +52,8 @@ public class MetricsRelayDescriptorAggregator {
/* Exclude cached descriptor files that haven't changed since we last
* ran this application. */
- reader.setExcludeFile(new File("tor-data-dir/cached-descriptors"),
- 1234567890000L);
+ //reader.setExcludeFile(new File("tor-data-dir/cached-descriptors"),
+ // 1234567890000L);
/* Read descriptors and process them. */
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
diff --git a/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java b/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
index 428f3b5..f3ee341 100644
--- a/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
+++ b/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
@@ -35,8 +35,8 @@ public class TorStatusDatabaseUpdater {
* ran this application. This may save some execution time. The
* application needs to store the information when files were last
* modified, because the API is supposed to be stateless. */
- reader.setExcludeFile(new File("tor-data-dir/cached-descriptors"),
- 1234567890000L);
+ //reader.setExcludeFile(new File("tor-data-dir/cached-descriptors"),
+ // 1234567890000L);
/* Read all descriptors in the given directory and import them into
* the database. Also go through the list of parsed files and store
diff --git a/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java
deleted file mode 100644
index 04e5d2a..0000000
--- a/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Copyright 2011, 2012 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.descriptor.impl;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
-import org.torproject.descriptor.Descriptor;
-import org.torproject.descriptor.DescriptorFile;
-import org.torproject.descriptor.BridgeDescriptorReader;
-
-public class BridgeDescriptorReaderImpl
- implements BridgeDescriptorReader {
-
- private List<File> directories = new ArrayList<File>();
- public void addDirectory(File directory) {
- this.directories.add(directory);
- }
-
- public void setExcludeFile(File fileToExclude) {
- throw new UnsupportedOperationException("Not implemented yet.");
- /* TODO Implement me. */
- }
-
- public void setExcludeFiles(Set<File> filesToExclude) {
- throw new UnsupportedOperationException("Not implemented yet.");
- /* TODO Implement me. */
- }
-
- public Iterator<DescriptorFile> readDescriptors() {
- BlockingIteratorImpl<DescriptorFile> descriptorQueue =
- new BlockingIteratorImpl<DescriptorFile>();
- DescriptorReader reader = new DescriptorReader(this.directories,
- descriptorQueue);
- new Thread(reader).start();
- return descriptorQueue;
- }
-
- private static class DescriptorReader implements Runnable {
- private List<File> directories;
- private BlockingIteratorImpl<DescriptorFile> descriptorQueue;
- private DescriptorReader(List<File> directories,
- BlockingIteratorImpl<DescriptorFile> descriptorQueue) {
- this.directories = directories;
- this.descriptorQueue = descriptorQueue;
- }
- public void run() {
- 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 {
- try {
- List<Descriptor> parsedDescriptors = this.readFile(file);
- DescriptorFileImpl descriptorFile =
- new DescriptorFileImpl();
- descriptorFile.setDirectory(directory);
- descriptorFile.setFile(file);
- descriptorFile.setLastModified(file.lastModified());
- descriptorFile.setDescriptors(parsedDescriptors);
- this.descriptorQueue.add(descriptorFile);
- } catch (DescriptorParseException e) {
- /* TODO Handle me. */
- }
- }
- }
- } catch (IOException e) {
- System.err.println("Error while reading descriptors in '"
- + directory.getAbsolutePath() + "'.");
- /* TODO Handle this exception somehow. */
- } finally {
- this.descriptorQueue.setOutOfDescriptors();
- }
- }
- }
- private List<Descriptor> readFile(File file) throws IOException,
- DescriptorParseException {
- FileInputStream fis = new FileInputStream(file);
- BufferedInputStream bis = new BufferedInputStream(fis);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int len;
- byte[] data = new byte[1024];
- while ((len = bis.read(data, 0, 1024)) >= 0) {
- baos.write(data, 0, len);
- }
- bis.close();
- byte[] rawDescriptorBytes = baos.toByteArray();
- return DescriptorImpl.parseBridgeDescriptors(rawDescriptorBytes,
- file.getName());
- }
- }
-}
-
diff --git a/src/org/torproject/descriptor/impl/DescriptorImpl.java b/src/org/torproject/descriptor/impl/DescriptorImpl.java
index 233b2df..68b70e1 100644
--- a/src/org/torproject/descriptor/impl/DescriptorImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorImpl.java
@@ -14,8 +14,9 @@ import org.torproject.descriptor.Descriptor;
public abstract class DescriptorImpl implements Descriptor {
- protected static List<Descriptor> parseRelayDescriptors(
- byte[] rawDescriptorBytes) throws DescriptorParseException {
+ protected static List<Descriptor> parseRelayOrBridgeDescriptors(
+ byte[] rawDescriptorBytes, String fileName)
+ throws DescriptorParseException {
List<Descriptor> parsedDescriptors = new ArrayList<Descriptor>();
byte[] first100Chars = new byte[Math.min(100,
rawDescriptorBytes.length)];
@@ -35,32 +36,7 @@ public abstract class DescriptorImpl implements Descriptor {
+ "network status type in descriptor starting with '"
+ firstLines + "'.");
}
- } else if (firstLines.startsWith("router ") ||
- firstLines.contains("\nrouter ")) {
- parsedDescriptors.addAll(ServerDescriptorImpl.
- parseDescriptors(rawDescriptorBytes));
- } else if (firstLines.startsWith("extra-info ") ||
- firstLines.contains("\nextra-info ")) {
- parsedDescriptors.addAll(ExtraInfoDescriptorImpl.
- parseDescriptors(rawDescriptorBytes));
- } else {
- throw new DescriptorParseException("Could not detect relay "
- + "descriptor type in descriptor starting with '" + firstLines
- + "'.");
- }
- return parsedDescriptors;
- }
-
- protected static List<Descriptor> parseBridgeDescriptors(
- byte[] rawDescriptorBytes, String fileName)
- throws DescriptorParseException {
- List<Descriptor> parsedDescriptors = new ArrayList<Descriptor>();
- byte[] first100Chars = new byte[Math.min(100,
- rawDescriptorBytes.length)];
- System.arraycopy(rawDescriptorBytes, 0, first100Chars, 0,
- first100Chars.length);
- String firstLines = new String(first100Chars);
- if (firstLines.startsWith("r ")) {
+ } else if (firstLines.startsWith("r ")) {
parsedDescriptors.add(new BridgeNetworkStatusImpl(
rawDescriptorBytes, fileName));
} else if (firstLines.startsWith("router ") ||
@@ -72,9 +48,9 @@ public abstract class DescriptorImpl implements Descriptor {
parsedDescriptors.addAll(ExtraInfoDescriptorImpl.
parseDescriptors(rawDescriptorBytes));
} else {
- throw new DescriptorParseException("Could not detect bridge "
- + "descriptor type in descriptor starting with '" + firstLines
- + "'.");
+ throw new DescriptorParseException("Could not detect relay or "
+ + "bridge descriptor type in descriptor starting with '"
+ + firstLines + "'.");
}
return parsedDescriptors;
}
diff --git a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
deleted file mode 100644
index 81435e0..0000000
--- a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/* Copyright 2011, 2012 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.descriptor.impl;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.Stack;
-import java.util.TreeMap;
-import org.torproject.descriptor.Descriptor;
-import org.torproject.descriptor.DescriptorFile;
-import org.torproject.descriptor.RelayDescriptorReader;
-import org.torproject.descriptor.RelayNetworkStatusConsensus;
-import org.torproject.descriptor.RelayNetworkStatusVote;
-
-public class RelayDescriptorReaderImpl implements RelayDescriptorReader {
-
- private List<File> directories = new ArrayList<File>();
- public void addDirectory(File directory) {
- this.directories.add(directory);
- }
-
- private File historyFile;
- public void setExcludeFiles(File historyFile) {
- this.historyFile = historyFile;
- }
-
- public Iterator<DescriptorFile> readDescriptors() {
- BlockingIteratorImpl<DescriptorFile> descriptorQueue =
- new BlockingIteratorImpl<DescriptorFile>();
- DescriptorReader reader = new DescriptorReader(this.directories,
- descriptorQueue, this.historyFile);
- new Thread(reader).start();
- return descriptorQueue;
- }
-
- private static class DescriptorReader implements Runnable {
- private List<File> directories;
- private BlockingIteratorImpl<DescriptorFile> descriptorQueue;
- private File historyFile;
- private DescriptorReader(List<File> directories,
- BlockingIteratorImpl<DescriptorFile> descriptorQueue,
- File historyFile) {
- this.directories = directories;
- this.descriptorQueue = descriptorQueue;
- this.historyFile = historyFile;
- }
- public void run() {
- this.readOldHistory();
- this.readDescriptors();
- this.writeNewHistory();
- }
- private SortedMap<String, Long>
- oldHistory = new TreeMap<String, Long>(),
- newHistory = new TreeMap<String, Long>();
- private void readOldHistory() {
- if (this.historyFile == null) {
- return;
- }
- try {
- BufferedReader br = new BufferedReader(new FileReader(
- this.historyFile));
- String line;
- while ((line = br.readLine()) != null) {
- if (!line.contains(" ")) {
- /* TODO Handle this problem? */
- continue;
- }
- long lastModifiedMillis = Long.parseLong(line.substring(0,
- line.indexOf(" ")));
- String absolutePath = line.substring(line.indexOf(" ") + 1);
- this.oldHistory.put(absolutePath, lastModifiedMillis);
- }
- br.close();
- } catch (IOException e) {
- /* TODO Handle this exception. */
- } catch (NumberFormatException e) {
- /* TODO Handle this exception. */
- }
- }
- private void writeNewHistory() {
- if (this.historyFile == null) {
- return;
- }
- try {
- if (this.historyFile.getParentFile() != null) {
- this.historyFile.getParentFile().mkdirs();
- }
- BufferedWriter bw = new BufferedWriter(new FileWriter(
- this.historyFile));
- for (Map.Entry<String, Long> e : this.newHistory.entrySet()) {
- String absolutePath = e.getKey();
- long lastModifiedMillis = e.getValue();
- bw.write(String.valueOf(lastModifiedMillis) + " " + absolutePath
- + "\n");
- }
- bw.close();
- } catch (IOException e) {
- /* TODO Handle this exception. */
- }
- }
- 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. */
- }
- }
- }
- } catch (IOException e) {
- System.err.println("Error while reading descriptors in '"
- + directory.getAbsolutePath() + "'.");
- /* TODO Handle this exception somehow. */
- } finally {
- this.descriptorQueue.setOutOfDescriptors();
- }
- }
- }
- private List<Descriptor> readFile(File file) throws IOException,
- DescriptorParseException {
- FileInputStream fis = new FileInputStream(file);
- BufferedInputStream bis = new BufferedInputStream(fis);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int len;
- byte[] data = new byte[1024];
- while ((len = bis.read(data, 0, 1024)) >= 0) {
- baos.write(data, 0, len);
- }
- bis.close();
- byte[] rawDescriptorBytes = baos.toByteArray();
- return DescriptorImpl.parseRelayDescriptors(rawDescriptorBytes);
- }
- }
-}
-
diff --git a/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java
new file mode 100644
index 0000000..8e1c3bc
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/RelayOrBridgeDescriptorReaderImpl.java
@@ -0,0 +1,173 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.Stack;
+import java.util.TreeMap;
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorFile;
+import org.torproject.descriptor.RelayDescriptorReader;
+import org.torproject.descriptor.BridgeDescriptorReader;
+
+public class RelayOrBridgeDescriptorReaderImpl
+ implements RelayDescriptorReader, BridgeDescriptorReader {
+
+ private List<File> directories = new ArrayList<File>();
+ public void addDirectory(File directory) {
+ this.directories.add(directory);
+ }
+
+ private File historyFile;
+ public void setExcludeFiles(File historyFile) {
+ this.historyFile = historyFile;
+ }
+
+ public Iterator<DescriptorFile> readDescriptors() {
+ BlockingIteratorImpl<DescriptorFile> descriptorQueue =
+ new BlockingIteratorImpl<DescriptorFile>();
+ DescriptorReader reader = new DescriptorReader(this.directories,
+ descriptorQueue, this.historyFile);
+ new Thread(reader).start();
+ return descriptorQueue;
+ }
+
+ private static class DescriptorReader implements Runnable {
+ private List<File> directories;
+ private BlockingIteratorImpl<DescriptorFile> descriptorQueue;
+ private File historyFile;
+ private DescriptorReader(List<File> directories,
+ BlockingIteratorImpl<DescriptorFile> descriptorQueue,
+ File historyFile) {
+ this.directories = directories;
+ this.descriptorQueue = descriptorQueue;
+ this.historyFile = historyFile;
+ }
+ public void run() {
+ this.readOldHistory();
+ this.readDescriptors();
+ this.writeNewHistory();
+ }
+ private SortedMap<String, Long>
+ oldHistory = new TreeMap<String, Long>(),
+ newHistory = new TreeMap<String, Long>();
+ private void readOldHistory() {
+ if (this.historyFile == null) {
+ return;
+ }
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(
+ this.historyFile));
+ String line;
+ while ((line = br.readLine()) != null) {
+ if (!line.contains(" ")) {
+ /* TODO Handle this problem? */
+ continue;
+ }
+ long lastModifiedMillis = Long.parseLong(line.substring(0,
+ line.indexOf(" ")));
+ String absolutePath = line.substring(line.indexOf(" ") + 1);
+ this.oldHistory.put(absolutePath, lastModifiedMillis);
+ }
+ br.close();
+ } catch (IOException e) {
+ /* TODO Handle this exception. */
+ } catch (NumberFormatException e) {
+ /* TODO Handle this exception. */
+ }
+ }
+ private void writeNewHistory() {
+ if (this.historyFile == null) {
+ return;
+ }
+ try {
+ if (this.historyFile.getParentFile() != null) {
+ this.historyFile.getParentFile().mkdirs();
+ }
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ this.historyFile));
+ for (Map.Entry<String, Long> e : this.newHistory.entrySet()) {
+ String absolutePath = e.getKey();
+ long lastModifiedMillis = e.getValue();
+ bw.write(String.valueOf(lastModifiedMillis) + " " + absolutePath
+ + "\n");
+ }
+ bw.close();
+ } catch (IOException e) {
+ /* TODO Handle this exception. */
+ }
+ }
+ 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. */
+ }
+ }
+ }
+ } catch (IOException e) {
+ System.err.println("Error while reading descriptors in '"
+ + directory.getAbsolutePath() + "'.");
+ /* TODO Handle this exception somehow. */
+ } finally {
+ this.descriptorQueue.setOutOfDescriptors();
+ }
+ }
+ }
+ private List<Descriptor> readFile(File file) throws IOException,
+ DescriptorParseException {
+ FileInputStream fis = new FileInputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int len;
+ byte[] data = new byte[1024];
+ while ((len = bis.read(data, 0, 1024)) >= 0) {
+ baos.write(data, 0, len);
+ }
+ bis.close();
+ byte[] rawDescriptorBytes = baos.toByteArray();
+ return DescriptorImpl.parseRelayOrBridgeDescriptors(
+ rawDescriptorBytes, file.getName());
+ }
+ }
+}
+
More information about the tor-commits
mailing list