[tor-commits] [onionoo/master] Support negative values in IntegerDistribution.

karsten at torproject.org karsten at torproject.org
Tue Apr 28 13:08:30 UTC 2020


commit 678b18f40a9b15f0939301bd673722a1b20f6a85
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Tue Feb 18 12:51:11 2020 +0100

    Support negative values in IntegerDistribution.
    
    Fixes #33360.
---
 .../onionoo/server/IntegerDistribution.java        | 23 +++++++++++++++++-----
 .../onionoo/server/PerformanceMetricsTest.java     | 14 +++++++++++++
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/torproject/metrics/onionoo/server/IntegerDistribution.java b/src/main/java/org/torproject/metrics/onionoo/server/IntegerDistribution.java
index 85e221a..7be8ca0 100644
--- a/src/main/java/org/torproject/metrics/onionoo/server/IntegerDistribution.java
+++ b/src/main/java/org/torproject/metrics/onionoo/server/IntegerDistribution.java
@@ -7,10 +7,18 @@ import java.util.Arrays;
 
 class IntegerDistribution {
 
-  int[] logValues = new int[64];
+  /**
+   * Counts by power of two with negative values at index 0, values < 2^0 at
+   * index 1, values < 2^1 at index 2, and values >= 2^63 at index 64.
+   */
+  int[] logValues = new int[65];
 
   void addLong(long value) {
-    logValues[64 - Long.numberOfLeadingZeros(value)]++;
+    if (value < 0L) {
+      logValues[0]++;
+    } else {
+      logValues[65 - Long.numberOfLeadingZeros(value)]++;
+    }
   }
 
   @Override
@@ -27,9 +35,14 @@ class IntegerDistribution {
         seenValues += logValues[i];
         while (j < permilles.length
             && (seenValues * 1000 > totalValues * permilles[j])) {
-          sb.append(j > 0 ? ", " : "").append(".").append(permilles[j])
-              .append(i < logValues.length - 1 ? "<" + (1L << i)
-              : ">=" + (1L << i - 1));
+          sb.append(j > 0 ? ", " : "").append(".").append(permilles[j]);
+          if (i == 0) {
+            sb.append("<0");
+          } else if (i < logValues.length - 1) {
+            sb.append("<").append(1L << (i - 1));
+          } else {
+            sb.append(">=").append(1L << i - 2);
+          }
           j++;
         }
         if (j == permilles.length) {
diff --git a/src/test/java/org/torproject/metrics/onionoo/server/PerformanceMetricsTest.java b/src/test/java/org/torproject/metrics/onionoo/server/PerformanceMetricsTest.java
index bb3c963..287c287 100644
--- a/src/test/java/org/torproject/metrics/onionoo/server/PerformanceMetricsTest.java
+++ b/src/test/java/org/torproject/metrics/onionoo/server/PerformanceMetricsTest.java
@@ -121,6 +121,20 @@ public class PerformanceMetricsTest {
   }
 
   @Test
+  public void testIntegerDistributionMinusOne() {
+    IntegerDistribution id = new IntegerDistribution();
+    id.addLong(-1L);
+    assertEquals(".500<0, .900<0, .990<0, .999<0", id.toString());
+  }
+
+  @Test
+  public void testIntegerDistributionMinLong() {
+    IntegerDistribution id = new IntegerDistribution();
+    id.addLong(Long.MIN_VALUE);
+    assertEquals(".500<0, .900<0, .990<0, .999<0", id.toString());
+  }
+
+  @Test
   public void testIntegerDistributionZero() {
     IntegerDistribution id = new IntegerDistribution();
     id.addLong(0);



More information about the tor-commits mailing list