[tor-commits] [metrics-lib/master] Make queue size of descriptor reader configurable.

karsten at torproject.org karsten at torproject.org
Sun Jun 1 09:46:37 UTC 2014


commit 8722de70447434ebb0d92551c8622566efb6d800
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Tue May 27 20:53:04 2014 +0200

    Make queue size of descriptor reader configurable.
    
    By default, the descriptor reader puts up to 100 parsed descriptor files
    in a queue in order to hand them out as quickly as possible.  But if
    descriptor files contain hundreds or even thousands of descriptors, that
    default may be too high.  Add a new method to make it configurable.
---
 src/org/torproject/descriptor/DescriptorReader.java      |    5 +++++
 .../torproject/descriptor/impl/BlockingIteratorImpl.java |   11 +++++++++--
 .../torproject/descriptor/impl/DescriptorReaderImpl.java |   14 +++++++++++++-
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/org/torproject/descriptor/DescriptorReader.java b/src/org/torproject/descriptor/DescriptorReader.java
index 2783bd4..5fe8197 100644
--- a/src/org/torproject/descriptor/DescriptorReader.java
+++ b/src/org/torproject/descriptor/DescriptorReader.java
@@ -49,6 +49,11 @@ public interface DescriptorReader {
    * explicitly. */
   public void setFailUnrecognizedDescriptorLines();
 
+  /* Don't keep more than this number of parsed descriptor files in the
+   * queue.  The default is 100, but if descriptor files contain hundreds
+   * or even thousands of descriptors, that default may be too high. */
+  public void setMaxDescriptorFilesInQueue(int max);
+
   /* Read the previously configured descriptors and make them available
    * via the returned blocking iterator.  Whenever the reader runs out of
    * descriptors and expects to provide more shortly after, it blocks the
diff --git a/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java b/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
index e23034a..477e6f1 100644
--- a/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
+++ b/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
@@ -15,19 +15,26 @@ public class BlockingIteratorImpl<T> implements Iterator<T> {
   /* Queue containing produced elemnts waiting for consumers. */
   private Queue<T> queue = new LinkedList<T>();
 
+  /* Maximum number of elements in queue. */
+  private int maxQueueSize = 100;
+
   /* Restrict object construction to the impl package. */
   protected BlockingIteratorImpl() {
   }
 
+  /* Create instance with maximum queue size. */
+  protected BlockingIteratorImpl(int maxQueueSize) {
+    this.maxQueueSize = maxQueueSize;
+  }
+
   /* Add an object to the queue if there's still room. */
-  final int MAX_DESCRIPTORS = 100;
   protected synchronized void add(T object) {
     if (this.outOfDescriptors) {
       throw new IllegalStateException("Internal error: Adding results to "
           + "descriptor queue not allowed after sending end-of-stream "
           + "object.");
     }
-    while (this.queue.size() >= this.MAX_DESCRIPTORS) {
+    while (this.queue.size() >= this.maxQueueSize) {
       try {
         wait();
       } catch (InterruptedException e) {
diff --git a/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
index e3fb908..d679154 100644
--- a/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorReaderImpl.java
@@ -93,6 +93,15 @@ public class DescriptorReaderImpl implements DescriptorReader {
     this.failUnrecognizedDescriptorLines = true;
   }
 
+  private Integer maxDescriptorFilesInQueue = null;
+  public void setMaxDescriptorFilesInQueue(int max) {
+    if (this.hasStartedReading) {
+      throw new IllegalStateException("Reconfiguration is not permitted "
+          + "after starting to read.");
+    }
+    this.maxDescriptorFilesInQueue = max;
+  }
+
   private DescriptorReaderRunnable reader;
   public Iterator<DescriptorFile> readDescriptors() {
     if (this.hasStartedReading) {
@@ -101,7 +110,10 @@ public class DescriptorReaderImpl implements DescriptorReader {
     }
     this.hasStartedReading = true;
     BlockingIteratorImpl<DescriptorFile> descriptorQueue =
-        new BlockingIteratorImpl<DescriptorFile>();
+        this.maxDescriptorFilesInQueue == null
+        ? new BlockingIteratorImpl<DescriptorFile>()
+        : new BlockingIteratorImpl<DescriptorFile>(
+        this.maxDescriptorFilesInQueue);
     this.reader = new DescriptorReaderRunnable(this.directories,
         this.tarballs, descriptorQueue, this.historyFile,
         this.excludedFiles, this.failUnrecognizedDescriptorLines);





More information about the tor-commits mailing list