[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [metrics-db/master] Remove consensus-health page generation.
commit db0a90cd59dd5faed32927ceba4f465ce2d250b3
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Mon Feb 28 12:09:23 2011 +0100
Remove consensus-health page generation.
---
src/org/torproject/ernie/db/Configuration.java | 11 +-
.../ernie/db/ConsensusHealthChecker.java | 912 --------------------
src/org/torproject/ernie/db/Main.java | 17 +-
.../torproject/ernie/db/RelayDescriptorParser.java | 12 +-
4 files changed, 7 insertions(+), 945 deletions(-)
diff --git a/src/org/torproject/ernie/db/Configuration.java b/src/org/torproject/ernie/db/Configuration.java
index 8b0fc1f..262ec78 100644
--- a/src/org/torproject/ernie/db/Configuration.java
+++ b/src/org/torproject/ernie/db/Configuration.java
@@ -47,7 +47,6 @@ public class Configuration {
private String getTorStatsUrl = "http://gettor.torproject.org:8080/"
+ "~gettor/gettor_stats.txt";
private boolean downloadExitList = false;
- private boolean writeConsensusHealth = false;
public Configuration() {
/* Initialize logger. */
@@ -168,9 +167,6 @@ public class Configuration {
} else if (line.startsWith("DownloadExitList")) {
this.downloadExitList = Integer.parseInt(
line.split(" ")[1]) != 0;
- } else if (line.startsWith("WriteConsensusHealth")) {
- this.writeConsensusHealth = Integer.parseInt(
- line.split(" ")[1]) != 0;
} else {
logger.severe("Configuration file contains unrecognized "
+ "configuration key in line '" + line + "'! Exiting!");
@@ -206,7 +202,7 @@ public class Configuration {
!this.writeRelayDescriptorDatabase &&
!this.writeAggregateStatsDatabase &&
!this.writeSanitizedBridges && !this.writeConsensusStats &&
- !this.writeBridgeStats && !this.writeConsensusHealth) {
+ !this.writeBridgeStats) {
logger.warning("We have not been configured to read data from any "
+ "data source or write data to any data sink. You need to "
+ "edit your config file (" + configFile.getAbsolutePath()
@@ -218,7 +214,7 @@ public class Configuration {
!(this.writeDirectoryArchives ||
this.writeRelayDescriptorDatabase ||
this.writeRelayDescriptorsRawFiles || this.writeConsensusStats ||
- this.writeBridgeStats || this.writeConsensusHealth)) {
+ this.writeBridgeStats)) {
logger.warning("We are configured to import/download relay "
+ "descriptors, but we don't have a single data sink to write "
+ "relay descriptors to.");
@@ -348,8 +344,5 @@ public class Configuration {
public boolean getDownloadExitList() {
return this.downloadExitList;
}
- public boolean getWriteConsensusHealth() {
- return this.writeConsensusHealth;
- }
}
diff --git a/src/org/torproject/ernie/db/ConsensusHealthChecker.java b/src/org/torproject/ernie/db/ConsensusHealthChecker.java
deleted file mode 100644
index 5af1523..0000000
--- a/src/org/torproject/ernie/db/ConsensusHealthChecker.java
+++ /dev/null
@@ -1,912 +0,0 @@
-/* Copyright 2010 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.ernie.db;
-
-import java.io.*;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.logging.*;
-import org.apache.commons.codec.binary.*;
-
-/*
- * TODO Possible extensions:
- * - Include consensus signatures and tell by which Tor versions the
- * consensus will be accepted (and by which not)
- */
-public class ConsensusHealthChecker {
-
- private String mostRecentValidAfterTime = null;
-
- private byte[] mostRecentConsensus = null;
-
- /**
- * Logger for this class.
- */
- private Logger logger;
-
- private SortedMap<String, byte[]> mostRecentVotes =
- new TreeMap<String, byte[]>();
-
- public ConsensusHealthChecker() {
- /* Initialize logger. */
- this.logger = Logger.getLogger(
- ConsensusHealthChecker.class.getName());
- }
-
- public void processConsensus(String validAfterTime, byte[] data) {
- /* Do we already know a consensus and/or vote(s)? */
- if (this.mostRecentValidAfterTime != null) {
- int compareKnownToNew =
- this.mostRecentValidAfterTime.compareTo(validAfterTime);
- if (compareKnownToNew > 0) {
- /* The consensus or vote(s) we know are more recent than this
- * consensus. No need to store it. */
- return;
- } else if (compareKnownToNew < 0) {
- /* This consensus is newer than the known consensus or vote(s).
- * Discard all known votes and overwrite the consensus below. */
- this.mostRecentVotes.clear();
- }
- }
- /* Store this consensus. */
- this.mostRecentValidAfterTime = validAfterTime;
- this.mostRecentConsensus = data;
- }
-
- public void processVote(String validAfterTime, String dirSource,
- byte[] data) {
- if (this.mostRecentValidAfterTime == null ||
- this.mostRecentValidAfterTime.compareTo(validAfterTime) < 0) {
- /* This vote is more recent than the known consensus. Discard the
- * consensus and all currently known votes. */
- this.mostRecentValidAfterTime = validAfterTime;
- this.mostRecentVotes.clear();
- this.mostRecentConsensus = null;
- }
- if (this.mostRecentValidAfterTime.equals(validAfterTime)) {
- /* Store this vote which belongs to the known consensus and/or
- * other votes. */
- this.mostRecentVotes.put(dirSource, data);
- }
- }
-
- public void writeStatusWebsite() {
-
- /* If we don't have any consensus, we cannot write useful consensus
- * health information to the website. Do not overwrite existing page
- * with a warning, because we might just not have learned about a new
- * consensus in this execution. */
- if (this.mostRecentConsensus == null) {
- return;
- }
-
- /* Prepare parsing dates. */
- SimpleDateFormat dateTimeFormat =
- new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
- StringBuilder knownFlagsResults = new StringBuilder();
- StringBuilder numRelaysVotesResults = new StringBuilder();
- StringBuilder consensusMethodsResults = new StringBuilder();
- StringBuilder versionsResults = new StringBuilder();
- StringBuilder paramsResults = new StringBuilder();
- StringBuilder authorityKeysResults = new StringBuilder();
- StringBuilder bandwidthScannersResults = new StringBuilder();
- StringBuilder authorityVersionsResults = new StringBuilder();
- SortedSet<String> allKnownFlags = new TreeSet<String>();
- SortedSet<String> allKnownVotes = new TreeSet<String>();
- SortedMap<String, String> consensusAssignedFlags =
- new TreeMap<String, String>();
- SortedMap<String, SortedSet<String>> votesAssignedFlags =
- new TreeMap<String, SortedSet<String>>();
- SortedMap<String, String> votesKnownFlags =
- new TreeMap<String, String>();
- SortedMap<String, SortedMap<String, Integer>> flagsAgree =
- new TreeMap<String, SortedMap<String, Integer>>();
- SortedMap<String, SortedMap<String, Integer>> flagsLost =
- new TreeMap<String, SortedMap<String, Integer>>();
- SortedMap<String, SortedMap<String, Integer>> flagsMissing =
- new TreeMap<String, SortedMap<String, Integer>>();
-
-
- /* Read consensus and parse all information that we want to compare to
- * votes. */
- String consensusConsensusMethod = null, consensusKnownFlags = null,
- consensusClientVersions = null, consensusServerVersions = null,
- consensusParams = null, rLineTemp = null, sLineTemp = null;
- int consensusTotalRelays = 0, consensusRunningRelays = 0;
- try {
- BufferedReader br = new BufferedReader(new StringReader(new String(
- this.mostRecentConsensus)));
- String line = null;
- while ((line = br.readLine()) != null) {
- if (line.startsWith("consensus-method ")) {
- consensusConsensusMethod = line;
- } else if (line.startsWith("client-versions ")) {
- consensusClientVersions = line;
- } else if (line.startsWith("server-versions ")) {
- consensusServerVersions = line;
- } else if (line.startsWith("known-flags ")) {
- consensusKnownFlags = line;
- } else if (line.startsWith("params ")) {
- consensusParams = line;
- } else if (line.startsWith("r ")) {
- rLineTemp = line;
- } else if (line.startsWith("s ")) {
- sLineTemp = line;
- consensusTotalRelays++;
- if (line.contains(" Running")) {
- consensusRunningRelays++;
- }
- consensusAssignedFlags.put(Hex.encodeHexString(
- Base64.decodeBase64(rLineTemp.split(" ")[2] + "=")).
- toUpperCase() + " " + rLineTemp.split(" ")[1], line);
- } else if (line.startsWith("v ") &&
- sLineTemp.contains(" Authority")) {
- authorityVersionsResults.append(" <tr>\n"
- + " <td>" + rLineTemp.split(" ")[1] + "</td>\n"
- + " <td>" + line.substring(2) + "</td>\n"
- + " </tr>\n");
- }
- }
- br.close();
- } catch (IOException e) {
- /* There should be no I/O taking place when reading a String. */
- }
-
- /* Read votes and parse all information to compare with the
- * consensus. */
- for (byte[] voteBytes : this.mostRecentVotes.values()) {
- String voteConsensusMethods = null, voteKnownFlags = null,
- voteClientVersions = null, voteServerVersions = null,
- voteParams = null, dirSource = null, voteDirKeyExpires = null;
- int voteTotalRelays = 0, voteRunningRelays = 0,
- voteContainsBandwidthWeights = 0;
- try {
- BufferedReader br = new BufferedReader(new StringReader(
- new String(voteBytes)));
- String line = null;
- while ((line = br.readLine()) != null) {
- if (line.startsWith("consensus-methods ")) {
- voteConsensusMethods = line;
- } else if (line.startsWith("client-versions ")) {
- voteClientVersions = line;
- } else if (line.startsWith("server-versions ")) {
- voteServerVersions = line;
- } else if (line.startsWith("known-flags ")) {
- voteKnownFlags = line;
- } else if (line.startsWith("params ")) {
- voteParams = line;
- } else if (line.startsWith("dir-source ")) {
- dirSource = line.split(" ")[1];
- allKnownVotes.add(dirSource);
- } else if (line.startsWith("dir-key-expires ")) {
- voteDirKeyExpires = line;
- } else if (line.startsWith("r ")) {
- rLineTemp = line;
- } else if (line.startsWith("s ")) {
- voteTotalRelays++;
- if (line.contains(" Running")) {
- voteRunningRelays++;
- }
- String relayKey = Hex.encodeHexString(Base64.decodeBase64(
- rLineTemp.split(" ")[2] + "=")).toUpperCase() + " "
- + rLineTemp.split(" ")[1];
- SortedSet<String> sLines = null;
- if (votesAssignedFlags.containsKey(relayKey)) {
- sLines = votesAssignedFlags.get(relayKey);
- } else {
- sLines = new TreeSet<String>();
- votesAssignedFlags.put(relayKey, sLines);
- }
- sLines.add(dirSource + " " + line);
- } else if (line.startsWith("w ")) {
- if (line.contains(" Measured")) {
- voteContainsBandwidthWeights++;
- }
- }
- }
- br.close();
- } catch (IOException e) {
- /* There should be no I/O taking place when reading a String. */
- }
-
- /* Write known flags. */
- knownFlagsResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteKnownFlags + "</td>\n"
- + " </tr>\n");
- votesKnownFlags.put(dirSource, voteKnownFlags);
- for (String flag : voteKnownFlags.substring(
- "known-flags ".length()).split(" ")) {
- allKnownFlags.add(flag);
- }
-
- /* Write number of relays voted about. */
- numRelaysVotesResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteTotalRelays + " total</td>\n"
- + " <td>" + voteRunningRelays + " Running</td>\n"
- + " </tr>\n");
-
- /* Write supported consensus methods. */
- if (!voteConsensusMethods.contains(consensusConsensusMethod.
- split(" ")[1])) {
- consensusMethodsResults.append(" <tr>\n"
- + " <td><font color=\"red\">" + dirSource
- + "</font></td>\n"
- + " <td><font color=\"red\">"
- + voteConsensusMethods + "</font></td>\n"
- + " </tr>\n");
- this.logger.warning(dirSource + " does not support consensus "
- + "method " + consensusConsensusMethod.split(" ")[1] + ": "
- + voteConsensusMethods);
- } else {
- consensusMethodsResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteConsensusMethods + "</td>\n"
- + " </tr>\n");
- this.logger.fine(dirSource + " supports consensus method "
- + consensusConsensusMethod.split(" ")[1] + ": "
- + voteConsensusMethods);
- }
-
- /* Write recommended versions. */
- if (voteClientVersions == null) {
- /* Not a versioning authority. */
- } else if (!voteClientVersions.equals(consensusClientVersions)) {
- versionsResults.append(" <tr>\n"
- + " <td><font color=\"red\">" + dirSource
- + "</font></td>\n"
- + " <td><font color=\"red\">"
- + voteClientVersions + "</font></td>\n"
- + " </tr>\n");
- this.logger.warning(dirSource + " recommends other client "
- + "versions than the consensus: " + voteClientVersions);
- } else {
- versionsResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteClientVersions + "</td>\n"
- + " </tr>\n");
- this.logger.fine(dirSource + " recommends the same client "
- + "versions as the consensus: " + voteClientVersions);
- }
- if (voteServerVersions == null) {
- /* Not a versioning authority. */
- } else if (!voteServerVersions.equals(consensusServerVersions)) {
- versionsResults.append(" <tr>\n"
- + " <td></td>\n"
- + " <td><font color=\"red\">"
- + voteServerVersions + "</font></td>\n"
- + " </tr>\n");
- this.logger.warning(dirSource + " recommends other server "
- + "versions than the consensus: " + voteServerVersions);
- } else {
- versionsResults.append(" <tr>\n"
- + " <td></td>\n"
- + " <td>" + voteServerVersions + "</td>\n"
- + " </tr>\n");
- this.logger.fine(dirSource + " recommends the same server "
- + "versions as the consensus: " + voteServerVersions);
- }
-
- /* Write consensus parameters. */
- boolean conflictOrInvalid = false;
- Set<String> validParameters = new HashSet<String>(Arrays.asList(
- ("circwindow,CircuitPriorityHalflifeMsec,refuseunknownexits,"
- + "cbtdisabled,cbtnummodes,cbtrecentcount,cbtmaxtimeouts,"
- + "cbtmincircs,cbtquantile,cbtclosequantile,cbttestfreq,"
- + "cbtmintimeout,cbtinitialtimeout").split(",")));
- if (voteParams == null) {
- /* Authority doesn't set consensus parameters. */
- } else {
- for (String param : voteParams.split(" ")) {
- if (!param.equals("params") &&
- (!consensusParams.contains(param) ||
- !validParameters.contains(param.split("=")[0]))) {
- conflictOrInvalid = true;
- break;
- }
- }
- }
- if (conflictOrInvalid) {
- paramsResults.append(" <tr>\n"
- + " <td><font color=\"red\">" + dirSource
- + "</font></td>\n"
- + " <td><font color=\"red\">"
- + voteParams + "</font></td>\n"
- + " </tr>\n");
- this.logger.warning(dirSource + " sets conflicting or invalid "
- + "consensus parameters: " + voteParams);
- } else {
- paramsResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteParams + "</td>\n"
- + " </tr>\n");
- this.logger.fine(dirSource + " sets only non-conflicting and "
- + "valid consensus parameters: " + voteParams);
- }
-
- /* Write authority key expiration date. */
- if (voteDirKeyExpires != null) {
- boolean expiresIn14Days = false;
- try {
- expiresIn14Days = (System.currentTimeMillis()
- + 14L * 24L * 60L * 60L * 1000L >
- dateTimeFormat.parse(voteDirKeyExpires.substring(
- "dir-key-expires ".length())).getTime());
- } catch (ParseException e) {
- /* Can't parse the timestamp? Whatever. */
- }
- if (expiresIn14Days) {
- authorityKeysResults.append(" <tr>\n"
- + " <td><font color=\"red\">" + dirSource
- + "</font></td>\n"
- + " <td><font color=\"red\">"
- + voteDirKeyExpires + "</font></td>\n"
- + " </tr>\n");
- this.logger.warning(dirSource + "'s certificate expires in the "
- + "next 14 days: " + voteDirKeyExpires);
- } else {
- authorityKeysResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteDirKeyExpires + "</td>\n"
- + " </tr>\n");
- this.logger.fine(dirSource + "'s certificate does not "
- + "expire in the next 14 days: " + voteDirKeyExpires);
- }
- }
-
- /* Write results for bandwidth scanner status. */
- if (voteContainsBandwidthWeights > 0) {
- bandwidthScannersResults.append(" <tr>\n"
- + " <td>" + dirSource + "</td>\n"
- + " <td>" + voteContainsBandwidthWeights
- + " Measured values in w lines</td>\n"
- + " </tr>\n");
- }
- }
-
- /* Check if we're missing a vote. TODO make this configurable */
- SortedSet<String> knownAuthorities = new TreeSet<String>(
- Arrays.asList(("dannenberg,dizum,gabelmoo,ides,maatuska,moria1,"
- + "tor26,urras").split(",")));
- for (String dir : allKnownVotes) {
- knownAuthorities.remove(dir);
- }
- if (!knownAuthorities.isEmpty()) {
- StringBuilder sb = new StringBuilder();
- for (String dir : knownAuthorities) {
- sb.append(", " + dir);
- }
- this.logger.warning("We're missing votes from the following "
- + "directory authorities: " + sb.toString().substring(2));
- }
-
- try {
-
- /* Keep the past two consensus health statuses. */
- File file0 = new File("website/consensus-health.html");
- File file1 = new File("website/consensus-health-1.html");
- File file2 = new File("website/consensus-health-2.html");
- if (file2.exists()) {
- file2.delete();
- }
- if (file1.exists()) {
- file1.renameTo(file2);
- }
- if (file0.exists()) {
- file0.renameTo(file1);
- }
-
- /* Start writing web page. */
- BufferedWriter bw = new BufferedWriter(
- new FileWriter("website/consensus-health.html"));
- bw.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
- + "Transitional//EN\">\n"
- + "<html>\n"
- + " <head>\n"
- + " <title>Tor Metrics Portal: Consensus health</title>\n"
- + " <meta http-equiv=\"content-type\" content=\"text/html; "
- + "charset=ISO-8859-1\">\n"
- + " <link href=\"/css/stylesheet-ltr.css\" type=\"text/css\" "
- + "rel=\"stylesheet\">\n"
- + " <link href=\"/images/favicon.ico\" "
- + "type=\"image/x-icon\" rel=\"shortcut icon\">\n"
- + " </head>\n"
- + " <body>\n"
- + " <div class=\"center\">\n"
- + " <table class=\"banner\" border=\"0\" "
- + "cellpadding=\"0\" cellspacing=\"0\" summary=\"\">\n"
- + " <tr>\n"
- + " <td class=\"banner-left\"><a "
- + "href=\"/index.html\"><img src=\"/images/top-left.png\" "
- + "alt=\"Click to go to home page\" width=\"193\" "
- + "height=\"79\"></a></td>\n"
- + " <td class=\"banner-middle\">\n"
- + " <a href=\"/\">Home</a>\n"
- + " <a href=\"graphs.html\">Graphs</a>\n"
- + " <a href=\"research.html\">Research</a>\n"
- + " <a href=\"status.html\">Status</a>\n"
- + " <br>\n"
- + " <font size=\"2\">\n"
- + " <a href=\"exonerator.html\">ExoneraTor</a>\n"
- + " <a href=\"relay-search.html\">Relay Search</a>\n"
- + " <a class=\"current\">Consensus Health</a>\n"
- + " </font>\n"
- + " </td>\n"
- + " <td class=\"banner-right\"></td>\n"
- + " </tr>\n"
- + " </table>\n"
- + " <div class=\"main-column\">\n"
- + " <h2>Tor Metrics Portal: Consensus Health</h2>\n"
- + " <br>\n"
- + " <p>This page shows statistics about the current "
- + "consensus and votes to facilitate debugging of the "
- + "directory consensus process.</p>\n");
-
- /* Write valid-after time. */
- bw.write(" <br>\n"
- + " <h3>Valid-after time</h3>\n"
- + " <br>\n"
- + " <p>Consensus was published ");
- boolean consensusIsStale = false;
- try {
- consensusIsStale = System.currentTimeMillis()
- - 3L * 60L * 60L * 1000L >
- dateTimeFormat.parse(this.mostRecentValidAfterTime).getTime();
- } catch (ParseException e) {
- /* Can't parse the timestamp? Whatever. */
- }
- if (consensusIsStale) {
- bw.write("<font color=\"red\">" + this.mostRecentValidAfterTime
- + "</font>");
- this.logger.warning("The last consensus published at "
- + this.mostRecentValidAfterTime + " is more than 3 hours "
- + "old.");
- } else {
- bw.write(this.mostRecentValidAfterTime);
- this.logger.fine("The last consensus published at "
- + this.mostRecentValidAfterTime + " is less than 3 hours "
- + "old.");
- }
- bw.write(". <i>Note that it takes "
- + "15 to 30 minutes for the metrics portal to learn about "
- + "new consensus and votes and process them.</i></p>\n");
-
- /* Write known flags. */
- bw.write(" <br>\n"
- + " <h3>Known flags</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (knownFlagsResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(knownFlagsResults.toString());
- }
- bw.write(" <tr>\n"
- + " <td><font color=\"blue\">consensus</font>"
- + "</td>\n"
- + " <td><font color=\"blue\">"
- + consensusKnownFlags + "</font></td>\n"
- + " </tr>\n");
- bw.write(" </table>\n");
-
- /* Write number of relays voted about. */
- bw.write(" <br>\n"
- + " <h3>Number of relays voted about</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"320\">\n"
- + " <col width=\"320\">\n"
- + " </colgroup>\n");
- if (numRelaysVotesResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td><td></td></tr>\n");
- } else {
- bw.write(numRelaysVotesResults.toString());
- }
- bw.write(" <tr>\n"
- + " <td><font color=\"blue\">consensus</font>"
- + "</td>\n"
- + " <td><font color=\"blue\">"
- + consensusTotalRelays + " total</font></td>\n"
- + " <td><font color=\"blue\">"
- + consensusRunningRelays + " Running</font></td>\n"
- + " </tr>\n");
- bw.write(" </table>\n");
-
- /* Write consensus methods. */
- bw.write(" <br>\n"
- + " <h3>Consensus methods</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (consensusMethodsResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(consensusMethodsResults.toString());
- }
- bw.write(" <tr>\n"
- + " <td><font color=\"blue\">consensus</font>"
- + "</td>\n"
- + " <td><font color=\"blue\">"
- + consensusConsensusMethod + "</font></td>\n"
- + " </tr>\n");
- bw.write(" </table>\n");
-
- /* Write recommended versions. */
- bw.write(" <br>\n"
- + " <h3>Recommended versions</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (versionsResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(versionsResults.toString());
- }
- bw.write(" <tr>\n"
- + " <td><font color=\"blue\">consensus</font>"
- + "</td>\n"
- + " <td><font color=\"blue\">"
- + consensusClientVersions + "</font></td>\n"
- + " </tr>\n");
- bw.write(" <tr>\n"
- + " <td></td>\n"
- + " <td><font color=\"blue\">"
- + consensusServerVersions + "</font></td>\n"
- + " </tr>\n");
- bw.write(" </table>\n");
-
- /* Write consensus parameters. */
- bw.write(" <br>\n"
- + " <h3>Consensus parameters</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (paramsResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(paramsResults.toString());
- }
- bw.write(" <tr>\n"
- + " <td><font color=\"blue\">consensus</font>"
- + "</td>\n"
- + " <td><font color=\"blue\">"
- + consensusParams + "</font></td>\n"
- + " </tr>\n");
- bw.write(" </table>\n");
-
- /* Write authority keys. */
- bw.write(" <br>\n"
- + " <h3>Authority keys</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (authorityKeysResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(authorityKeysResults.toString());
- }
- bw.write(" </table>\n"
- + " <br>\n"
- + " <p><i>Note that expiration dates of legacy keys are "
- + "not included in votes and therefore not listed here!</i>"
- + "</p>\n");
-
- /* Write bandwidth scanner status. */
- bw.write(" <br>\n"
- + " <h3>Bandwidth scanner status</h3>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- if (bandwidthScannersResults.length() < 1) {
- bw.write(" <tr><td>(No votes.)</td><td></td></tr>\n");
- } else {
- bw.write(bandwidthScannersResults.toString());
- }
- bw.write(" </table>\n");
-
- /* Write authority versions. */
- bw.write(" <br>\n"
- + " <h3>Authority versions</h3>\n"
- + " <br>\n");
- if (authorityVersionsResults.length() < 1) {
- bw.write(" <p>(No relays with Authority flag found.)"
- + "</p>\n");
- } else {
- bw.write(" <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"640\">\n"
- + " </colgroup>\n");
- bw.write(authorityVersionsResults.toString());
- bw.write(" </table>\n"
- + " <br>\n"
- + " <p><i>Note that this list of relays with the "
- + "Authority flag may be different from the list of v3 "
- + "directory authorities!</i></p>\n");
- }
-
- /* Write (huge) table with all flags. */
- bw.write(" <br>\n"
- + " <h3>Relay flags</h3>\n"
- + " <br>\n"
- + " <p>The semantics of flags written in the table is "
- + "as follows:</p>\n"
- + " <ul>\n"
- + " <li><b>In vote and consensus:</b> Flag in vote "
- + "matches flag in consensus, or relay is not listed in "
- + "consensus (because it doesn't have the Running "
- + "flag)</li>\n"
- + " <li><b><font color=\"red\">Only in "
- + "vote:</font></b> Flag in vote, but missing in the "
- + "consensus, because there was no majority for the flag or "
- + "the flag was invalidated (e.g., Named gets invalidated by "
- + "Unnamed)</li>\n"
- + " <li><b><font color=\"gray\"><s>Only in "
- + "consensus:</s></font></b> Flag in consensus, but missing "
- + "in a vote of a directory authority voting on this "
- + "flag</li>\n"
- + " <li><b><font color=\"blue\">In "
- + "consensus:</font></b> Flag in consensus</li>\n"
- + " </ul>\n"
- + " <br>\n"
- + " <p>See also the summary below the table.</p>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"120\">\n"
- + " <col width=\"80\">\n");
- for (int i = 0; i < allKnownVotes.size(); i++) {
- bw.write(" <col width=\""
- + (640 / allKnownVotes.size()) + "\">\n");
- }
- bw.write(" </colgroup>\n");
- int linesWritten = 0;
- for (Map.Entry<String, SortedSet<String>> e :
- votesAssignedFlags.entrySet()) {
- if (linesWritten++ % 10 == 0) {
- bw.write(" <tr><td><br><b>Fingerprint</b></td>"
- + "<td><br><b>Nickname</b></td>\n");
- for (String dir : allKnownVotes) {
- String shortDirName = dir.length() > 6 ?
- dir.substring(0, 5) + "." : dir;
- bw.write("<td><br><b>" + shortDirName + "</b></td>");
- }
- bw.write("<td><br><b>consensus</b></td></tr>\n");
- }
- String relayKey = e.getKey();
- SortedSet<String> votes = e.getValue();
- String fingerprint = relayKey.split(" ")[0].substring(0, 8);
- String nickname = relayKey.split(" ")[1];
- bw.write(" <tr>\n");
- if (consensusAssignedFlags.containsKey(relayKey) &&
- consensusAssignedFlags.get(relayKey).contains(" Named") &&
- !Character.isDigit(nickname.charAt(0))) {
- bw.write(" <td id=\"" + nickname
- + "\"><a href=\"relay.html?fingerprint="
- + relayKey.split(" ")[0] + "\" target=\"_blank\">"
- + fingerprint + "</a></td>\n");
- } else {
- bw.write(" <td><a href=\"relay.html?fingerprint="
- + fingerprint + "\" target=\"_blank\">" + fingerprint
- + "</a></td>\n");
- }
- bw.write(" <td>" + nickname + "</td>\n");
- SortedSet<String> relevantFlags = new TreeSet<String>();
- for (String vote : votes) {
- String[] parts = vote.split(" ");
- for (int j = 2; j < parts.length; j++) {
- relevantFlags.add(parts[j]);
- }
- }
- String consensusFlags = null;
- if (consensusAssignedFlags.containsKey(relayKey)) {
- consensusFlags = consensusAssignedFlags.get(relayKey);
- String[] parts = consensusFlags.split(" ");
- for (int j = 1; j < parts.length; j++) {
- relevantFlags.add(parts[j]);
- }
- }
- for (String dir : allKnownVotes) {
- String flags = null;
- for (String vote : votes) {
- if (vote.startsWith(dir)) {
- flags = vote;
- break;
- }
- }
- if (flags != null) {
- votes.remove(flags);
- bw.write(" <td>");
- int flagsWritten = 0;
- for (String flag : relevantFlags) {
- bw.write(flagsWritten++ > 0 ? "<br>" : "");
- SortedMap<String, SortedMap<String, Integer>> sums = null;
- if (flags.contains(" " + flag)) {
- if (consensusFlags == null ||
- consensusFlags.contains(" " + flag)) {
- bw.write(flag);
- sums = flagsAgree;
- } else {
- bw.write("<font color=\"red\">" + flag + "</font>");
- sums = flagsLost;
- }
- } else if (consensusFlags != null &&
- votesKnownFlags.get(dir).contains(" " + flag) &&
- consensusFlags.contains(" " + flag)) {
- bw.write("<font color=\"gray\"><s>" + flag
- + "</s></font>");
- sums = flagsMissing;
- }
- if (sums != null) {
- SortedMap<String, Integer> sum = null;
- if (sums.containsKey(dir)) {
- sum = sums.get(dir);
- } else {
- sum = new TreeMap<String, Integer>();
- sums.put(dir, sum);
- }
- sum.put(flag, sum.containsKey(flag) ?
- sum.get(flag) + 1 : 1);
- }
- }
- bw.write("</td>\n");
- } else {
- bw.write(" <td></td>\n");
- }
- }
- if (consensusFlags != null) {
- bw.write(" <td>");
- int flagsWritten = 0;
- for (String flag : relevantFlags) {
- bw.write(flagsWritten++ > 0 ? "<br>" : "");
- if (consensusFlags.contains(" " + flag)) {
- bw.write("<font color=\"blue\">" + flag + "</font>");
- }
- }
- bw.write("</td>\n");
- } else {
- bw.write(" <td></td>\n");
- }
- bw.write(" </tr>\n");
- }
- bw.write(" </table>\n");
-
- /* Write summary of overlap between votes and consensus. */
- bw.write(" <br>\n"
- + " <h3>Overlap between votes and consensus</h3>\n"
- + " <br>\n"
- + " <p>The semantics of columns is similar to the "
- + "table above:</p>\n"
- + " <ul>\n"
- + " <li><b>In vote and consensus:</b> Flag in vote "
- + "matches flag in consensus, or relay is not listed in "
- + "consensus (because it doesn't have the Running "
- + "flag)</li>\n"
- + " <li><b><font color=\"red\">Only in "
- + "vote:</font></b> Flag in vote, but missing in the "
- + "consensus, because there was no majority for the flag or "
- + "the flag was invalidated (e.g., Named gets invalidated by "
- + "Unnamed)</li>\n"
- + " <li><b><font color=\"gray\"><s>Only in "
- + "consensus:</s></font></b> Flag in consensus, but missing "
- + "in a vote of a directory authority voting on this "
- + "flag</li>\n"
- + " </ul>\n"
- + " <br>\n"
- + " <table border=\"0\" cellpadding=\"4\" "
- + "cellspacing=\"0\" summary=\"\">\n"
- + " <colgroup>\n"
- + " <col width=\"160\">\n"
- + " <col width=\"210\">\n"
- + " <col width=\"210\">\n"
- + " <col width=\"210\">\n"
- + " </colgroup>\n");
- bw.write(" <tr><td></td><td><b>Only in vote</b></td>"
- + "<td><b>In vote and consensus</b></td>"
- + "<td><b>Only in consensus</b></td>\n");
- for (String dir : allKnownVotes) {
- boolean firstFlagWritten = false;
- String[] flags = votesKnownFlags.get(dir).substring(
- "known-flags ".length()).split(" ");
- for (String flag : flags) {
- bw.write(" <tr>\n");
- if (firstFlagWritten) {
- bw.write(" <td></td>\n");
- } else {
- bw.write(" <td>" + dir + "</td>\n");
- firstFlagWritten = true;
- }
- if (flagsLost.containsKey(dir) &&
- flagsLost.get(dir).containsKey(flag)) {
- bw.write(" <td><font color=\"red\"> "
- + flagsLost.get(dir).get(flag) + " " + flag
- + "</font></td>\n");
- } else {
- bw.write(" <td></td>\n");
- }
- if (flagsAgree.containsKey(dir) &&
- flagsAgree.get(dir).containsKey(flag)) {
- bw.write(" <td>" + flagsAgree.get(dir).get(flag)
- + " " + flag + "</td>\n");
- } else {
- bw.write(" <td></td>\n");
- }
- if (flagsMissing.containsKey(dir) &&
- flagsMissing.get(dir).containsKey(flag)) {
- bw.write(" <td><font color=\"gray\"><s>"
- + flagsMissing.get(dir).get(flag) + " " + flag
- + "</s></font></td>\n");
- } else {
- bw.write(" <td></td>\n");
- }
- bw.write(" </tr>\n");
- }
- }
- bw.write(" </table>\n");
-
- /* Finish writing. */
- bw.write(" </div>\n"
- + " </div>\n"
- + " <div class=\"bottom\" id=\"bottom\">\n"
- + " <p>This material is supported in part by the "
- + "National Science Foundation under Grant No. "
- + "CNS-0959138. Any opinions, finding, and conclusions "
- + "or recommendations expressed in this material are "
- + "those of the author(s) and do not necessarily reflect "
- + "the views of the National Science Foundation.</p>\n"
- + " <p>\"Tor\" and the \"Onion Logo\" are <a "
- + "href=\"https://www.torproject.org/docs/trademark-faq.html"
- + ".en\">"
- + "registered trademarks</a> of The Tor Project, "
- + "Inc.</p>\n"
- + " <p>Data on this site is freely available under a "
- + "<a href=\"http://creativecommons.org/publicdomain/"
- + "zero/1.0/\">CC0 no copyright declaration</a>: To the "
- + "extent possible under law, the Tor Project has waived "
- + "all copyright and related or neighboring rights in "
- + "the data. Graphs are licensed under a <a "
- + "href=\"http://creativecommons.org/licenses/by/3.0/"
- + "us/\">Creative Commons Attribution 3.0 United States "
- + "License</a>.</p>\n"
- + " </div>\n"
- + " </body>\n"
- + "</html>");
- bw.close();
-
- } catch (IOException e) {
- }
- }
-}
-
diff --git a/src/org/torproject/ernie/db/Main.java b/src/org/torproject/ernie/db/Main.java
index 20107d0..a495a03 100644
--- a/src/org/torproject/ernie/db/Main.java
+++ b/src/org/torproject/ernie/db/Main.java
@@ -39,10 +39,6 @@ public class Main {
config.getWriteAggregateStatsDatabase() ?
config.getRelayDescriptorDatabaseJDBC() : null) : null;
- // Prepare consensus health checker
- ConsensusHealthChecker chc = config.getWriteConsensusHealth() ?
- new ConsensusHealthChecker() : null;
-
// Prepare writing relay descriptor archive to disk
ArchiveWriter aw = config.getWriteDirectoryArchives() ?
new ArchiveWriter(
@@ -63,9 +59,8 @@ public class Main {
RelayDescriptorParser rdp = config.getWriteBridgeStats() ||
config.getWriteDirectoryArchives() ||
config.getWriteRelayDescriptorDatabase() ||
- config.getWriteRelayDescriptorsRawFiles() ||
- config.getWriteConsensusHealth() ?
- new RelayDescriptorParser(bsfh, aw, rddi, chc) : null;
+ config.getWriteRelayDescriptorsRawFiles() ?
+ new RelayDescriptorParser(bsfh, aw, rddi) : null;
// Import/download relay descriptors from the various sources
if (rdp != null) {
@@ -74,8 +69,8 @@ public class Main {
List<String> dirSources =
config.getDownloadFromDirectoryAuthorities();
boolean downloadCurrentConsensus = aw != null || bsfh != null ||
- rddi != null || chc != null;
- boolean downloadCurrentVotes = aw != null || chc != null;
+ rddi != null;
+ boolean downloadCurrentVotes = aw != null;
boolean downloadAllServerDescriptors = aw != null ||
rddi != null;
boolean downloadAllExtraInfos = aw != null || rddi != null;
@@ -119,10 +114,6 @@ public class Main {
}
// Write output to disk that only depends on relay descriptors
- if (chc != null) {
- chc.writeStatusWebsite();
- chc = null;
- }
if (aw != null) {
aw.dumpStats();
aw = null;
diff --git a/src/org/torproject/ernie/db/RelayDescriptorParser.java b/src/org/torproject/ernie/db/RelayDescriptorParser.java
index 2c31473..e94b55b 100644
--- a/src/org/torproject/ernie/db/RelayDescriptorParser.java
+++ b/src/org/torproject/ernie/db/RelayDescriptorParser.java
@@ -40,8 +40,6 @@ public class RelayDescriptorParser {
*/
private RelayDescriptorDatabaseImporter rddi;
- private ConsensusHealthChecker chc;
-
/**
* Logger for this class.
*/
@@ -53,12 +51,10 @@ public class RelayDescriptorParser {
* Initializes this class.
*/
public RelayDescriptorParser(BridgeStatsFileHandler bsfh,
- ArchiveWriter aw, RelayDescriptorDatabaseImporter rddi,
- ConsensusHealthChecker chc) {
+ ArchiveWriter aw, RelayDescriptorDatabaseImporter rddi) {
this.bsfh = bsfh;
this.aw = aw;
this.rddi = rddi;
- this.chc = chc;
/* Initialize logger. */
this.logger = Logger.getLogger(RelayDescriptorParser.class.getName());
@@ -209,9 +205,6 @@ public class RelayDescriptorParser {
if (this.aw != null) {
this.aw.storeConsensus(data, validAfter);
}
- if (this.chc != null) {
- this.chc.processConsensus(validAfterTime, data);
- }
} else {
if (this.rddi != null) {
this.rddi.addVote(validAfter, dirSource, data);
@@ -236,9 +229,6 @@ public class RelayDescriptorParser {
}
}
}
- if (this.chc != null) {
- this.chc.processVote(validAfterTime, dirSource, data);
- }
}
} else if (line.startsWith("router ")) {
String platformLine = null, publishedLine = null,
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits