[tor-commits] [onionoo/master] Make BandwidthStatus smarter about itself.
karsten at torproject.org
karsten at torproject.org
Sun Aug 17 07:06:46 UTC 2014
commit ca10a8da5a0d30216c6365faca9cff7ba40a2d7a
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Fri Aug 15 18:54:28 2014 +0200
Make BandwidthStatus smarter about itself.
Removes another dependency on DateTimeHelper, which gets us closer to
implementing #12866.
---
.../torproject/onionoo/docs/BandwidthStatus.java | 92 ++++++++++++++++++++
.../onionoo/updater/BandwidthStatusUpdater.java | 88 ++-----------------
2 files changed, 98 insertions(+), 82 deletions(-)
diff --git a/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java b/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java
index a2980e5..c01a242 100644
--- a/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java
+++ b/src/main/java/org/torproject/onionoo/docs/BandwidthStatus.java
@@ -2,14 +2,25 @@
* See LICENSE for licensing information */
package org.torproject.onionoo.docs;
+import java.util.Map;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.TreeMap;
+import org.torproject.descriptor.BandwidthHistory;
import org.torproject.onionoo.util.DateTimeHelper;
+import org.torproject.onionoo.util.TimeFactory;
public class BandwidthStatus extends Document {
+ private transient boolean isDirty = false;
+ public boolean isDirty() {
+ return this.isDirty;
+ }
+ public void clearDirty() {
+ this.isDirty = false;
+ }
+
private SortedMap<Long, long[]> writeHistory =
new TreeMap<Long, long[]>();
public void setWriteHistory(SortedMap<Long, long[]> writeHistory) {
@@ -62,6 +73,87 @@ public class BandwidthStatus extends Document {
s.close();
}
+ public void addToWriteHistory(BandwidthHistory bandwidthHistory) {
+ this.addToHistory(this.writeHistory, bandwidthHistory);
+ }
+
+ public void addToReadHistory(BandwidthHistory bandwidthHistory) {
+ this.addToHistory(this.readHistory, bandwidthHistory);
+ }
+
+ private void addToHistory(SortedMap<Long, long[]> history,
+ BandwidthHistory bandwidthHistory) {
+ long intervalMillis = bandwidthHistory.getIntervalLength()
+ * DateTimeHelper.ONE_SECOND;
+ for (Map.Entry<Long, Long> e :
+ bandwidthHistory.getBandwidthValues().entrySet()) {
+ long endMillis = e.getKey(),
+ startMillis = endMillis - intervalMillis;
+ long bandwidthValue = e.getValue();
+ /* TODO Should we first check whether an interval is already
+ * contained in history? */
+ history.put(startMillis, new long[] { startMillis, endMillis,
+ bandwidthValue });
+ this.isDirty = true;
+ }
+ }
+
+ public void compressHistory() {
+ this.compressHistory(this.writeHistory);
+ this.compressHistory(this.readHistory);
+ }
+
+ private void compressHistory(SortedMap<Long, long[]> history) {
+ SortedMap<Long, long[]> uncompressedHistory =
+ new TreeMap<Long, long[]>(history);
+ history.clear();
+ long lastStartMillis = 0L, lastEndMillis = 0L, lastBandwidth = 0L;
+ String lastMonthString = "1970-01";
+ long now = TimeFactory.getTime().currentTimeMillis();
+ for (long[] v : uncompressedHistory.values()) {
+ long startMillis = v[0], endMillis = v[1], bandwidth = v[2];
+ long intervalLengthMillis;
+ if (now - endMillis <= DateTimeHelper.THREE_DAYS) {
+ intervalLengthMillis = DateTimeHelper.FIFTEEN_MINUTES;
+ } else if (now - endMillis <= DateTimeHelper.ONE_WEEK) {
+ intervalLengthMillis = DateTimeHelper.ONE_HOUR;
+ } else if (now - endMillis <=
+ DateTimeHelper.ROUGHLY_ONE_MONTH) {
+ intervalLengthMillis = DateTimeHelper.FOUR_HOURS;
+ } else if (now - endMillis <=
+ DateTimeHelper.ROUGHLY_THREE_MONTHS) {
+ intervalLengthMillis = DateTimeHelper.TWELVE_HOURS;
+ } else if (now - endMillis <=
+ DateTimeHelper.ROUGHLY_ONE_YEAR) {
+ intervalLengthMillis = DateTimeHelper.TWO_DAYS;
+ } else {
+ intervalLengthMillis = DateTimeHelper.TEN_DAYS;
+ }
+ String monthString = DateTimeHelper.format(startMillis,
+ DateTimeHelper.ISO_YEARMONTH_FORMAT);
+ if (lastEndMillis == startMillis &&
+ ((lastEndMillis - 1L) / intervalLengthMillis) ==
+ ((endMillis - 1L) / intervalLengthMillis) &&
+ lastMonthString.equals(monthString)) {
+ lastEndMillis = endMillis;
+ lastBandwidth += bandwidth;
+ } else {
+ if (lastStartMillis > 0L) {
+ history.put(lastStartMillis, new long[] { lastStartMillis,
+ lastEndMillis, lastBandwidth });
+ }
+ lastStartMillis = startMillis;
+ lastEndMillis = endMillis;
+ lastBandwidth = bandwidth;
+ }
+ lastMonthString = monthString;
+ }
+ if (lastStartMillis > 0L) {
+ history.put(lastStartMillis, new long[] { lastStartMillis,
+ lastEndMillis, lastBandwidth });
+ }
+ }
+
public String toDocumentString() {
StringBuilder sb = new StringBuilder();
for (long[] v : writeHistory.values()) {
diff --git a/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java
index 5c27464..9a7717c 100644
--- a/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java
+++ b/src/main/java/org/torproject/onionoo/updater/BandwidthStatusUpdater.java
@@ -2,18 +2,11 @@
* See LICENSE for licensing information */
package org.torproject.onionoo.updater;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.torproject.descriptor.BandwidthHistory;
import org.torproject.descriptor.Descriptor;
import org.torproject.descriptor.ExtraInfoDescriptor;
import org.torproject.onionoo.docs.BandwidthStatus;
import org.torproject.onionoo.docs.DocumentStore;
import org.torproject.onionoo.docs.DocumentStoreFactory;
-import org.torproject.onionoo.util.DateTimeHelper;
-import org.torproject.onionoo.util.TimeFactory;
public class BandwidthStatusUpdater implements DescriptorListener,
StatusUpdater {
@@ -22,12 +15,9 @@ public class BandwidthStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
- private long now;
-
public BandwidthStatusUpdater() {
this.descriptorSource = DescriptorSourceFactory.getDescriptorSource();
this.documentStore = DocumentStoreFactory.getDocumentStore();
- this.now = TimeFactory.getTime().currentTimeMillis();
this.registerDescriptorListeners();
}
@@ -56,81 +46,15 @@ public class BandwidthStatusUpdater implements DescriptorListener,
bandwidthStatus = new BandwidthStatus();
}
if (descriptor.getWriteHistory() != null) {
- this.parseHistory(descriptor.getWriteHistory(),
- bandwidthStatus.getWriteHistory());
+ bandwidthStatus.addToWriteHistory(descriptor.getWriteHistory());
}
if (descriptor.getReadHistory() != null) {
- this.parseHistory(descriptor.getReadHistory(),
- bandwidthStatus.getReadHistory());
- }
- this.compressHistory(bandwidthStatus.getWriteHistory());
- this.compressHistory(bandwidthStatus.getReadHistory());
- this.documentStore.store(bandwidthStatus, fingerprint);
- }
-
- private void parseHistory(BandwidthHistory bandwidthHistory,
- SortedMap<Long, long[]> history) {
- long intervalMillis = bandwidthHistory.getIntervalLength()
- * DateTimeHelper.ONE_SECOND;
- for (Map.Entry<Long, Long> e :
- bandwidthHistory.getBandwidthValues().entrySet()) {
- long endMillis = e.getKey(),
- startMillis = endMillis - intervalMillis;
- long bandwidthValue = e.getValue();
- /* TODO Should we first check whether an interval is already
- * contained in history? */
- history.put(startMillis, new long[] { startMillis, endMillis,
- bandwidthValue });
- }
- }
-
- private void compressHistory(SortedMap<Long, long[]> history) {
- SortedMap<Long, long[]> uncompressedHistory =
- new TreeMap<Long, long[]>(history);
- history.clear();
- long lastStartMillis = 0L, lastEndMillis = 0L, lastBandwidth = 0L;
- String lastMonthString = "1970-01";
- for (long[] v : uncompressedHistory.values()) {
- long startMillis = v[0], endMillis = v[1], bandwidth = v[2];
- long intervalLengthMillis;
- if (this.now - endMillis <= DateTimeHelper.THREE_DAYS) {
- intervalLengthMillis = DateTimeHelper.FIFTEEN_MINUTES;
- } else if (this.now - endMillis <= DateTimeHelper.ONE_WEEK) {
- intervalLengthMillis = DateTimeHelper.ONE_HOUR;
- } else if (this.now - endMillis <=
- DateTimeHelper.ROUGHLY_ONE_MONTH) {
- intervalLengthMillis = DateTimeHelper.FOUR_HOURS;
- } else if (this.now - endMillis <=
- DateTimeHelper.ROUGHLY_THREE_MONTHS) {
- intervalLengthMillis = DateTimeHelper.TWELVE_HOURS;
- } else if (this.now - endMillis <=
- DateTimeHelper.ROUGHLY_ONE_YEAR) {
- intervalLengthMillis = DateTimeHelper.TWO_DAYS;
- } else {
- intervalLengthMillis = DateTimeHelper.TEN_DAYS;
- }
- String monthString = DateTimeHelper.format(startMillis,
- DateTimeHelper.ISO_YEARMONTH_FORMAT);
- if (lastEndMillis == startMillis &&
- ((lastEndMillis - 1L) / intervalLengthMillis) ==
- ((endMillis - 1L) / intervalLengthMillis) &&
- lastMonthString.equals(monthString)) {
- lastEndMillis = endMillis;
- lastBandwidth += bandwidth;
- } else {
- if (lastStartMillis > 0L) {
- history.put(lastStartMillis, new long[] { lastStartMillis,
- lastEndMillis, lastBandwidth });
- }
- lastStartMillis = startMillis;
- lastEndMillis = endMillis;
- lastBandwidth = bandwidth;
- }
- lastMonthString = monthString;
+ bandwidthStatus.addToReadHistory(descriptor.getReadHistory());
}
- if (lastStartMillis > 0L) {
- history.put(lastStartMillis, new long[] { lastStartMillis,
- lastEndMillis, lastBandwidth });
+ if (bandwidthStatus.isDirty()) {
+ bandwidthStatus.compressHistory();
+ this.documentStore.store(bandwidthStatus, fingerprint);
+ bandwidthStatus.clearDirty();
}
}
More information about the tor-commits
mailing list