commit 934eff6921bb5e166a551276fb1d698b66507b16 Author: Karsten Loesing karsten.loesing@gmx.net Date: Fri Aug 15 10:54:24 2014 +0200
Make ClientsStatus smarter about itself.
Removes another dependency on DateTimeHelper, which gets us closer to implementing #12866. --- .../org/torproject/onionoo/docs/ClientsStatus.java | 65 +++++++++++++++++++ .../onionoo/updater/ClientsStatusUpdater.java | 66 ++------------------ 2 files changed, 70 insertions(+), 61 deletions(-)
diff --git a/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java b/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java index 2bd2168..2e7e2ee 100644 --- a/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java +++ b/src/main/java/org/torproject/onionoo/docs/ClientsStatus.java @@ -6,8 +6,19 @@ import java.util.Scanner; import java.util.SortedSet; import java.util.TreeSet;
+import org.torproject.onionoo.util.DateTimeHelper; +import org.torproject.onionoo.util.TimeFactory; + public class ClientsStatus extends Document {
+ private transient boolean isDirty = false; + public boolean isDirty() { + return this.isDirty; + } + public void clearDirty() { + this.isDirty = false; + } + private SortedSet<ClientsHistory> history = new TreeSet<ClientsHistory>(); public void setHistory(SortedSet<ClientsHistory> history) { @@ -32,6 +43,60 @@ public class ClientsStatus extends Document { s.close(); }
+ public void addToHistory(SortedSet<ClientsHistory> newIntervals) { + for (ClientsHistory interval : newIntervals) { + if ((this.history.headSet(interval).isEmpty() || + this.history.headSet(interval).last().getEndMillis() <= + interval.getStartMillis()) && + (this.history.tailSet(interval).isEmpty() || + this.history.tailSet(interval).first().getStartMillis() >= + interval.getEndMillis())) { + this.history.add(interval); + this.isDirty = true; + } + } + } + + public void compressHistory() { + SortedSet<ClientsHistory> uncompressedHistory = + new TreeSet<ClientsHistory>(this.history); + history.clear(); + ClientsHistory lastResponses = null; + String lastMonthString = "1970-01"; + long now = TimeFactory.getTime().currentTimeMillis(); + for (ClientsHistory responses : uncompressedHistory) { + long intervalLengthMillis; + if (now - responses.getEndMillis() <= + DateTimeHelper.ROUGHLY_THREE_MONTHS) { + intervalLengthMillis = DateTimeHelper.ONE_DAY; + } else if (now - responses.getEndMillis() <= + DateTimeHelper.ROUGHLY_ONE_YEAR) { + intervalLengthMillis = DateTimeHelper.TWO_DAYS; + } else { + intervalLengthMillis = DateTimeHelper.TEN_DAYS; + } + String monthString = DateTimeHelper.format( + responses.getStartMillis(), + DateTimeHelper.ISO_YEARMONTH_FORMAT); + if (lastResponses != null && + lastResponses.getEndMillis() == responses.getStartMillis() && + ((lastResponses.getEndMillis() - 1L) / intervalLengthMillis) == + ((responses.getEndMillis() - 1L) / intervalLengthMillis) && + lastMonthString.equals(monthString)) { + lastResponses.addResponses(responses); + } else { + if (lastResponses != null) { + this.history.add(lastResponses); + } + lastResponses = responses; + } + lastMonthString = monthString; + } + if (lastResponses != null) { + this.history.add(lastResponses); + } + } + public String toDocumentString() { StringBuilder sb = new StringBuilder(); for (ClientsHistory interval : this.history) { diff --git a/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java index 72d5142..a8797ba 100644 --- a/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java +++ b/src/main/java/org/torproject/onionoo/updater/ClientsStatusUpdater.java @@ -16,7 +16,6 @@ import org.torproject.onionoo.docs.DocumentStore; import org.torproject.onionoo.docs.DocumentStoreFactory; import org.torproject.onionoo.util.DateTimeHelper; import org.torproject.onionoo.util.Logger; -import org.torproject.onionoo.util.TimeFactory;
/* * Example extra-info descriptor used as input: @@ -43,12 +42,9 @@ public class ClientsStatusUpdater implements DescriptorListener,
private DocumentStore documentStore;
- private long now; - public ClientsStatusUpdater() { this.descriptorSource = DescriptorSourceFactory.getDescriptorSource(); this.documentStore = DocumentStoreFactory.getDocumentStore(); - this.now = TimeFactory.getTime().currentTimeMillis(); this.registerDescriptorListeners(); }
@@ -152,67 +148,15 @@ public class ClientsStatusUpdater implements DescriptorListener, if (clientsStatus == null) { clientsStatus = new ClientsStatus(); } - this.addToHistory(clientsStatus, e.getValue()); - this.compressHistory(clientsStatus); - this.documentStore.store(clientsStatus, hashedFingerprint); - } - } - - private void addToHistory(ClientsStatus clientsStatus, - SortedSet<ClientsHistory> newIntervals) { - SortedSet<ClientsHistory> history = clientsStatus.getHistory(); - for (ClientsHistory interval : newIntervals) { - if ((history.headSet(interval).isEmpty() || - history.headSet(interval).last().getEndMillis() <= - interval.getStartMillis()) && - (history.tailSet(interval).isEmpty() || - history.tailSet(interval).first().getStartMillis() >= - interval.getEndMillis())) { - history.add(interval); + clientsStatus.addToHistory(e.getValue()); + if (clientsStatus.isDirty()) { + clientsStatus.compressHistory(); + this.documentStore.store(clientsStatus, hashedFingerprint); + clientsStatus.clearDirty(); } } }
- private void compressHistory(ClientsStatus clientsStatus) { - SortedSet<ClientsHistory> history = clientsStatus.getHistory(); - SortedSet<ClientsHistory> compressedHistory = - new TreeSet<ClientsHistory>(); - ClientsHistory lastResponses = null; - String lastMonthString = "1970-01"; - for (ClientsHistory responses : history) { - long intervalLengthMillis; - if (this.now - responses.getEndMillis() <= - DateTimeHelper.ROUGHLY_THREE_MONTHS) { - intervalLengthMillis = DateTimeHelper.ONE_DAY; - } else if (this.now - responses.getEndMillis() <= - DateTimeHelper.ROUGHLY_ONE_YEAR) { - intervalLengthMillis = DateTimeHelper.TWO_DAYS; - } else { - intervalLengthMillis = DateTimeHelper.TEN_DAYS; - } - String monthString = DateTimeHelper.format( - responses.getStartMillis(), - DateTimeHelper.ISO_YEARMONTH_FORMAT); - if (lastResponses != null && - lastResponses.getEndMillis() == responses.getStartMillis() && - ((lastResponses.getEndMillis() - 1L) / intervalLengthMillis) == - ((responses.getEndMillis() - 1L) / intervalLengthMillis) && - lastMonthString.equals(monthString)) { - lastResponses.addResponses(responses); - } else { - if (lastResponses != null) { - compressedHistory.add(lastResponses); - } - lastResponses = responses; - } - lastMonthString = monthString; - } - if (lastResponses != null) { - compressedHistory.add(lastResponses); - } - clientsStatus.setHistory(compressedHistory); - } - public String getStatsString() { int newIntervals = 0; for (SortedSet<ClientsHistory> hist : this.newResponses.values()) {