tor-commits
Threads by month
- ----- 2025 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
December 2018
- 14 participants
- 1480 discussions

15 Dec '18
commit d63d4a2b74ca1232c3140098253b5fab6a2a5229
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 15 18:46:10 2018 +0000
Update translations for tails-iuk
---
zh_CN.po | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/zh_CN.po b/zh_CN.po
index 5b0be8c63..cf9c49d6f 100644
--- a/zh_CN.po
+++ b/zh_CN.po
@@ -5,6 +5,7 @@
# Translators:
# Words, 2016
# Chi-Hsun Tsai, 2017
+# Chris Xiao, 2018
# paperbag, 2016
# ihints <inactive+ihints(a)transifex.com>, 2014
# kwh(Kim Wan-Ho), 2013
@@ -16,8 +17,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
"POT-Creation-Date: 2018-12-09 13:56+0100\n"
-"PO-Revision-Date: 2018-12-09 14:14+0000\n"
-"Last-Translator: carolyn <carolyn(a)anhalt.org>\n"
+"PO-Revision-Date: 2018-12-15 18:21+0000\n"
+"Last-Translator: Chris Xiao\n"
"Language-Team: Chinese (China) (http://www.transifex.com/otf/torproject/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -115,7 +116,7 @@ msgid ""
"Download size: %{size}s\n"
"\n"
"Do you want to upgrade now?"
-msgstr ""
+msgstr "<b>您应该升级到 %{name}s %{version}s.</b>\n\n请到%{details_url}s查看更多关于这个新版本的信息。\n\n我们建议您在升级过程中关闭所有打开的应用程序。\n下载更新可能需要很长时间,从数分钟到数小时不等。\n\n下载文件大小:%{size}s\n\n您想现在升级吗?"
#: ../lib/Tails/IUK/Frontend.pm:386
msgid "Upgrade available"
@@ -199,15 +200,15 @@ msgid ""
"The network connection will now be disabled.\n"
"\n"
"Please save your work and close all other applications."
-msgstr ""
+msgstr "更新下载成功。\n\n网络连接将被禁用。\n\n请保存所有工作,并关闭其他所有应用程序。"
#: ../lib/Tails/IUK/Frontend.pm:612
msgid "Upgrade successfully downloaded"
-msgstr ""
+msgstr "更新下载成功"
#: ../lib/Tails/IUK/Frontend.pm:614
msgid "Apply upgrade"
-msgstr ""
+msgstr "安装更新"
#: ../lib/Tails/IUK/Frontend.pm:621
msgid ""
1
0

[translation/tbmanual-contentspot] Update translations for tbmanual-contentspot
by translation@torproject.org 15 Dec '18
by translation@torproject.org 15 Dec '18
15 Dec '18
commit 99c0a8d2404eafaf6c25faf55b6e1fb77d14fc5c
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 15 18:17:18 2018 +0000
Update translations for tbmanual-contentspot
---
contents+zh-CN.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/contents+zh-CN.po b/contents+zh-CN.po
index 50322f5b6..33251433f 100644
--- a/contents+zh-CN.po
+++ b/contents+zh-CN.po
@@ -1,7 +1,7 @@
# Translators:
# Emma Peel, 2018
-# Chris Xiao, 2018
# erinm, 2018
+# Chris Xiao, 2018
#
msgid ""
msgstr ""
@@ -9,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-13 17:25+CET\n"
"PO-Revision-Date: 2018-11-14 12:31+0000\n"
-"Last-Translator: erinm, 2018\n"
+"Last-Translator: Chris Xiao, 2018\n"
"Language-Team: Chinese (China) (https://www.transifex.com/otf/teams/1519/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -171,7 +171,7 @@ msgstr ""
msgid ""
"Tor Browser features “New Identity” and “New Tor Circuit for this Site” "
"options, located in the main menu (hamburger menu)."
-msgstr ""
+msgstr "在 Tor Browser 主菜单(汉堡菜单)中有“新身份”和“为此站点使用新 Tor 线路”这两个选项。"
#: https//tb-manual.torproject.org/en-US/managing-identities/
#: (content/managing-identities/contents+en-US.lrtopic.body)
1
0

[translation/tails-persistence-setup] Update translations for tails-persistence-setup
by translation@torproject.org 15 Dec '18
by translation@torproject.org 15 Dec '18
15 Dec '18
commit 96a3a46d78955d76f13066bbeee5c7f218113308
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 15 11:16:57 2018 +0000
Update translations for tails-persistence-setup
---
ar/ar.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ar/ar.po b/ar/ar.po
index 663972ba1..241b188a7 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -22,7 +22,7 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
"POT-Creation-Date: 2018-11-01 12:21+0100\n"
-"PO-Revision-Date: 2018-12-13 11:18+0000\n"
+"PO-Revision-Date: 2018-12-15 11:04+0000\n"
"Last-Translator: Ahmed Essam\n"
"Language-Team: Arabic (http://www.transifex.com/otf/torproject/language/ar/)\n"
"MIME-Version: 1.0\n"
1
0

15 Dec '18
commit c0ba389d25a19f5d194e07541e53f6005991fb47
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Nov 29 11:38:16 2018 +0100
Add consensuses to totalcw graph.
Implements #28352.
---
src/main/R/rserver/graphs.R | 5 +-
.../torproject/metrics/stats/totalcw/Database.java | 62 +++--
.../org/torproject/metrics/stats/totalcw/Main.java | 11 +-
.../metrics/stats/totalcw/OutputLine.java | 8 +-
.../torproject/metrics/stats/totalcw/Parser.java | 47 +++-
...tusVote.java => TotalcwRelayNetworkStatus.java} | 8 +-
src/main/sql/totalcw/init-totalcw.sql | 23 +-
...est.java => TotalcwRelayNetworkStatusTest.java} | 26 ++-
.../totalcw/2018-10-15-00-00-00-consensus.part | 251 +++++++++++++++++++++
9 files changed, 388 insertions(+), 53 deletions(-)
diff --git a/src/main/R/rserver/graphs.R b/src/main/R/rserver/graphs.R
index e3ac598..7501a95 100644
--- a/src/main/R/rserver/graphs.R
+++ b/src/main/R/rserver/graphs.R
@@ -1558,7 +1558,7 @@ write_advbw_ipv6 <- function(start_p = NULL, end_p = NULL, path_p) {
prepare_totalcw <- function(start_p, end_p) {
read.csv(paste(stats_dir, "totalcw.csv", sep = ""),
- colClasses = c("valid_after_date" = "Date")) %>%
+ colClasses = c("valid_after_date" = "Date", "nickname" = "character")) %>%
filter(if (!is.null(start_p))
valid_after_date >= as.Date(start_p) else TRUE) %>%
filter(if (!is.null(end_p))
@@ -1569,6 +1569,9 @@ prepare_totalcw <- function(start_p, end_p) {
plot_totalcw <- function(start_p, end_p, path_p) {
prepare_totalcw(start_p, end_p) %>%
+ mutate(nickname = ifelse(nickname == "", "consensus", nickname)) %>%
+ mutate(nickname = factor(nickname,
+ levels = c("consensus", unique(nickname[nickname != "consensus"])))) %>%
complete(valid_after_date = full_seq(valid_after_date, period = 1),
nesting(nickname)) %>%
ggplot(aes(x = valid_after_date, y = measured_sum_avg,
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
index b6dc87c..e842bc6 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
@@ -10,6 +10,8 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
+import java.sql.Types;
+import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
@@ -63,23 +65,36 @@ class Database implements AutoCloseable {
"INSERT INTO authority (nickname, identity_hex) VALUES (?, ?)",
Statement.RETURN_GENERATED_KEYS);
this.psVoteSelect = this.connection.prepareStatement(
- "SELECT EXISTS (SELECT 1 FROM vote "
+ "SELECT EXISTS (SELECT 1 FROM status "
+ "WHERE valid_after = ? AND authority_id = ?)");
this.psVoteInsert = this.connection.prepareStatement(
- "INSERT INTO vote (valid_after, authority_id, have_guard_flag, "
+ "INSERT INTO status (valid_after, authority_id, have_guard_flag, "
+ "have_exit_flag, measured_sum) VALUES (?, ?, ?, ?, ?)");
}
- /** Insert a parsed vote into the vote table. */
- void insertVote(TotalcwRelayNetworkStatusVote vote) throws SQLException {
- if (null == vote) {
- /* Nothing to insert. */
- return;
+ /** Insert a parsed consensus into the status table. */
+ void insertConsensus(TotalcwRelayNetworkStatus consensus)
+ throws SQLException {
+ if (null != consensus) {
+ insertStatusIfAbsent(consensus.validAfter, null, consensus.measuredSums);
}
+ }
+
+ /** Insert a parsed vote into the status table. */
+ void insertVote(TotalcwRelayNetworkStatus vote) throws SQLException {
+ if (null != vote) {
+ int authorityId = insertAuthorityIfAbsent(vote.nickname,
+ vote.identityHex);
+ insertStatusIfAbsent(vote.validAfter, authorityId, vote.measuredSums);
+ }
+ }
+
+ private int insertAuthorityIfAbsent(String nickname, String identityHex)
+ throws SQLException {
int authorityId = -1;
this.psAuthoritySelect.clearParameters();
- this.psAuthoritySelect.setString(1, vote.nickname);
- this.psAuthoritySelect.setString(2, vote.identityHex);
+ this.psAuthoritySelect.setString(1, nickname);
+ this.psAuthoritySelect.setString(2, identityHex);
try (ResultSet rs = this.psAuthoritySelect.executeQuery()) {
if (rs.next()) {
authorityId = rs.getInt(1);
@@ -87,8 +102,8 @@ class Database implements AutoCloseable {
}
if (authorityId < 0) {
this.psAuthorityInsert.clearParameters();
- this.psAuthorityInsert.setString(1, vote.nickname);
- this.psAuthorityInsert.setString(2, vote.identityHex);
+ this.psAuthorityInsert.setString(1, nickname);
+ this.psAuthorityInsert.setString(2, identityHex);
this.psAuthorityInsert.execute();
try (ResultSet rs = this.psAuthorityInsert.getGeneratedKeys()) {
if (rs.next()) {
@@ -100,13 +115,22 @@ class Database implements AutoCloseable {
+ "authority entry.");
}
}
+ return authorityId;
+ }
+
+ private void insertStatusIfAbsent(LocalDateTime validAfter,
+ Integer authorityId, long[] measuredSums) throws SQLException {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
Locale.US);
this.psVoteSelect.clearParameters();
this.psVoteSelect.setTimestamp(1,
- Timestamp.from(ZonedDateTime.of(vote.validAfter,
- ZoneId.of("UTC")).toInstant()), calendar);
- this.psVoteSelect.setInt(2, authorityId);
+ Timestamp.from(ZonedDateTime.of(validAfter,
+ ZoneId.of("UTC")).toInstant()), calendar);
+ if (null == authorityId) {
+ this.psVoteSelect.setNull(2, Types.INTEGER);
+ } else {
+ this.psVoteSelect.setInt(2, authorityId);
+ }
try (ResultSet rs = this.psVoteSelect.executeQuery()) {
if (rs.next()) {
if (rs.getBoolean(1)) {
@@ -119,12 +143,16 @@ class Database implements AutoCloseable {
measuredSumsIndex++) {
this.psVoteInsert.clearParameters();
this.psVoteInsert.setTimestamp(1,
- Timestamp.from(ZonedDateTime.of(vote.validAfter,
+ Timestamp.from(ZonedDateTime.of(validAfter,
ZoneId.of("UTC")).toInstant()), calendar);
- this.psVoteInsert.setInt(2, authorityId);
+ if (null == authorityId) {
+ this.psVoteInsert.setNull(2, Types.INTEGER);
+ } else {
+ this.psVoteInsert.setInt(2, authorityId);
+ }
this.psVoteInsert.setBoolean(3, 1 == (measuredSumsIndex & 1));
this.psVoteInsert.setBoolean(4, 2 == (measuredSumsIndex & 2));
- this.psVoteInsert.setLong(5, vote.measuredSums[measuredSumsIndex]);
+ this.psVoteInsert.setLong(5, measuredSums[measuredSumsIndex]);
this.psVoteInsert.execute();
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Main.java b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
index 7c77160..e5ba8ab 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
@@ -6,6 +6,7 @@ package org.torproject.metrics.stats.totalcw;
import org.torproject.descriptor.Descriptor;
import org.torproject.descriptor.DescriptorReader;
import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.RelayNetworkStatusConsensus;
import org.torproject.descriptor.RelayNetworkStatusVote;
import org.slf4j.Logger;
@@ -24,6 +25,8 @@ public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
private static String[][] paths = {
+ {"recent", "relay-descriptors", "consensuses"},
+ {"archive", "relay-descriptors", "consensuses"},
{"recent", "relay-descriptors", "votes"},
{"archive", "relay-descriptors", "votes"}};
@@ -32,7 +35,8 @@ public class Main {
log.info("Starting totalcw module.");
- log.info("Reading votes and inserting relevant parts into the database.");
+ log.info("Reading consensuses and votes and inserting relevant parts into "
+ + "the database.");
DescriptorReader reader = DescriptorSourceFactory.createDescriptorReader();
File historyFile = new File(Configuration.history);
reader.setHistoryFile(historyFile);
@@ -43,7 +47,10 @@ public class Main {
Arrays.stream(paths).map((String[] path)
-> Paths.get(Configuration.descriptors, path).toFile())
.toArray(File[]::new))) {
- if (descriptor instanceof RelayNetworkStatusVote) {
+ if (descriptor instanceof RelayNetworkStatusConsensus) {
+ database.insertConsensus(parser.parseRelayNetworkStatusConsensus(
+ (RelayNetworkStatusConsensus) descriptor));
+ } else if (descriptor instanceof RelayNetworkStatusVote) {
database.insertVote(parser.parseRelayNetworkStatusVote(
(RelayNetworkStatusVote) descriptor));
} else {
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
index 5587e5d..3534e2a 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
@@ -26,7 +26,8 @@ class OutputLine {
/** Date. */
LocalDate validAfterDate;
- /** Server type, which can be "relay" or "bridge". */
+ /** Nickname of the authority generating votes, or <code>null</code> in case
+ * of consensuses. */
String nickname;
/** Whether contained relays all have the "Guard" flag. */
@@ -42,8 +43,9 @@ class OutputLine {
* file. */
@Override
public String toString() {
- return String.format("%s,%s,%s,%s,%d", validAfterDate, nickname,
- haveGuardFlag ? "t" : "f", haveExitFlag ? "t" : "f", measuredSumAvg);
+ return String.format("%s,%s,%s,%s,%d", validAfterDate,
+ null == nickname ? "" : nickname, haveGuardFlag ? "t" : "f",
+ haveExitFlag ? "t" : "f", measuredSumAvg);
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
index 6070822..7d7e095 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
@@ -4,6 +4,7 @@
package org.torproject.metrics.stats.totalcw;
import org.torproject.descriptor.NetworkStatusEntry;
+import org.torproject.descriptor.RelayNetworkStatusConsensus;
import org.torproject.descriptor.RelayNetworkStatusVote;
import java.time.Instant;
@@ -13,9 +14,40 @@ import java.time.ZoneId;
* data objects for them. */
class Parser {
+ /** Parse and return a consensus, but return <code>null</code> if the
+ * consensus did not contain any bandwidth values. */
+ TotalcwRelayNetworkStatus parseRelayNetworkStatusConsensus(
+ RelayNetworkStatusConsensus consensus) {
+ boolean containsBandwidthValues = false;
+ long[] measuredSums = new long[4];
+ for (NetworkStatusEntry entry : consensus.getStatusEntries().values()) {
+ if (null == entry.getFlags() || !entry.getFlags().contains("Running")
+ || entry.getBandwidth() < 0L) {
+ continue;
+ }
+ containsBandwidthValues = true;
+ /* Encode flags as sum of Guard = 1 and (Exit and !BadExit) = 2. */
+ int measuredSumsIndex = (entry.getFlags().contains("Guard") ? 1 : 0)
+ + (entry.getFlags().contains("Exit")
+ && !entry.getFlags().contains("BadExit") ? 2 : 0);
+ measuredSums[measuredSumsIndex] += entry.getBandwidth();
+ }
+ if (!containsBandwidthValues) {
+ /* Return null, because we wouldn't want to add this consensus to the
+ * database anyway. */
+ return null;
+ }
+ TotalcwRelayNetworkStatus parsedStatus = new TotalcwRelayNetworkStatus();
+ parsedStatus.validAfter = Instant.ofEpochMilli(
+ consensus.getValidAfterMillis())
+ .atZone(ZoneId.of("UTC")).toLocalDateTime();
+ parsedStatus.measuredSums = measuredSums;
+ return parsedStatus;
+ }
+
/** Parse and return a vote, but return <code>null</code> if the vote did not
* contain any bandwidth measurements. */
- TotalcwRelayNetworkStatusVote parseRelayNetworkStatusVote(
+ TotalcwRelayNetworkStatus parseRelayNetworkStatusVote(
RelayNetworkStatusVote vote) {
boolean containsMeasuredBandwidths = false;
long[] measuredSums = new long[4];
@@ -36,14 +68,13 @@ class Parser {
* anyway. */
return null;
}
- TotalcwRelayNetworkStatusVote parsedVote
- = new TotalcwRelayNetworkStatusVote();
- parsedVote.validAfter = Instant.ofEpochMilli(vote.getValidAfterMillis())
+ TotalcwRelayNetworkStatus parsedStatus = new TotalcwRelayNetworkStatus();
+ parsedStatus.validAfter = Instant.ofEpochMilli(vote.getValidAfterMillis())
.atZone(ZoneId.of("UTC")).toLocalDateTime();
- parsedVote.identityHex = vote.getIdentity();
- parsedVote.nickname = vote.getNickname();
- parsedVote.measuredSums = measuredSums;
- return parsedVote;
+ parsedStatus.identityHex = vote.getIdentity();
+ parsedStatus.nickname = vote.getNickname();
+ parsedStatus.measuredSums = measuredSums;
+ return parsedStatus;
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatus.java
similarity index 72%
rename from src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
rename to src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatus.java
index 0c5a095..f9b6610 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatus.java
@@ -5,18 +5,18 @@ package org.torproject.metrics.stats.totalcw;
import java.time.LocalDateTime;
-/** Data object holding all relevant parts parsed from a vote. */
-class TotalcwRelayNetworkStatusVote {
+/** Data object holding all relevant parts parsed from a consensus or vote. */
+class TotalcwRelayNetworkStatus {
/** Valid-after time of the vote. */
LocalDateTime validAfter;
/** The 1 to 19 character long alphanumeric nickname assigned to the authority
- * by its operator. */
+ * by its operator, or <code>null</code> if this is a consensus. */
String nickname;
/** Uppercase hex fingerprint of the authority's (v3 authority) identity
- * key. */
+ * key, or <code>null</code> if this is a consensus. */
String identityHex;
/** Sums of bandwidth measurements of all contained status entries with four
diff --git a/src/main/sql/totalcw/init-totalcw.sql b/src/main/sql/totalcw/init-totalcw.sql
index cdba275..62778d4 100644
--- a/src/main/sql/totalcw/init-totalcw.sql
+++ b/src/main/sql/totalcw/init-totalcw.sql
@@ -18,17 +18,19 @@ CREATE TABLE authority (
UNIQUE (nickname, identity_hex)
);
--- Table of all votes with statistics on contained bandwidth measurements. Only
--- contains votes containing bandwidth measurements.
-CREATE TABLE vote (
+-- Table of all consensuses and votes with statistics on contained bandwidth
+-- measurements. Only contains consensuses containing bandwidth values and votes
+-- containing bandwidth measurements.
+CREATE TABLE status (
- -- The auto-incremented numeric identifier for a vote.
- vote_id SERIAL PRIMARY KEY,
+ -- The auto-incremented numeric identifier for a status.
+ status_id SERIAL PRIMARY KEY,
-- Timestamp at which the consensus is supposed to become valid.
valid_after TIMESTAMP WITHOUT TIME ZONE NOT NULL,
- -- Numeric identifier uniquely identifying the authority generating this vote.
+ -- Numeric identifier uniquely identifying the authority generating this vote,
+ -- or NULL if this a consensus.
authority_id INTEGER REFERENCES authority (authority_id),
-- Whether contained relays had the Guard flag assigned.
@@ -45,13 +47,14 @@ CREATE TABLE vote (
-- View on aggregated total consensus weight statistics in a format that is
-- compatible for writing to an output CSV file. Votes are only included in the
--- output if at least 12 votes are known for a given authority and day.
+-- output if at least 12 statuses are known for a given authority and day.
CREATE OR REPLACE VIEW totalcw AS
SELECT DATE(valid_after) AS valid_after_date, nickname, have_guard_flag,
have_exit_flag, FLOOR(AVG(measured_sum)) AS measured_sum_avg
-FROM vote NATURAL JOIN authority
+FROM status LEFT JOIN authority
+ON status.authority_id = authority.authority_id
GROUP BY DATE(valid_after), nickname, have_guard_flag, have_exit_flag
-HAVING COUNT(vote_id) >= 12
- AND DATE(valid_after) < (SELECT MAX(DATE(valid_after)) FROM vote)
+HAVING COUNT(status_id) >= 12
+ AND DATE(valid_after) < (SELECT MAX(DATE(valid_after)) FROM status)
ORDER BY DATE(valid_after), nickname, have_guard_flag, have_exit_flag;
diff --git a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusTest.java
similarity index 76%
rename from src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
rename to src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusTest.java
index 189b3b7..1c5b408 100644
--- a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
+++ b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusTest.java
@@ -9,6 +9,7 @@ import static org.junit.Assert.assertNull;
import org.torproject.descriptor.Descriptor;
import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.RelayNetworkStatusConsensus;
import org.torproject.descriptor.RelayNetworkStatusVote;
import org.junit.Test;
@@ -27,12 +28,15 @@ import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
-public class TotalcwRelayNetworkStatusVoteTest {
+public class TotalcwRelayNetworkStatusTest {
/** Provide test data. */
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
+ { "2018-10-15-00-00-00-consensus.part",
+ ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
+ null, null, new long[] { 16774L, 44820L, 26600L, 49500L } },
{ "2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-"
+ "55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
@@ -84,15 +88,21 @@ public class TotalcwRelayNetworkStatusVoteTest {
for (Descriptor descriptor
: DescriptorSourceFactory.createDescriptorParser().parseDescriptors(
sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
- TotalcwRelayNetworkStatusVote parsedVote = new Parser()
- .parseRelayNetworkStatusVote((RelayNetworkStatusVote) descriptor);
+ TotalcwRelayNetworkStatus parsedStatus;
+ if (descriptor instanceof RelayNetworkStatusConsensus) {
+ parsedStatus = new Parser().parseRelayNetworkStatusConsensus(
+ (RelayNetworkStatusConsensus) descriptor);
+ } else {
+ parsedStatus = new Parser().parseRelayNetworkStatusVote(
+ (RelayNetworkStatusVote) descriptor);
+ }
if (null == this.expectedMeasuredSums) {
- assertNull(parsedVote);
+ assertNull(parsedStatus);
} else {
- assertEquals(this.expectedValidAfter, parsedVote.validAfter);
- assertEquals(this.expectedNickname, parsedVote.nickname);
- assertEquals(this.expectedIdentityHex, parsedVote.identityHex);
- assertArrayEquals(this.expectedMeasuredSums, parsedVote.measuredSums);
+ assertEquals(this.expectedValidAfter, parsedStatus.validAfter);
+ assertEquals(this.expectedNickname, parsedStatus.nickname);
+ assertEquals(this.expectedIdentityHex, parsedStatus.identityHex);
+ assertArrayEquals(this.expectedMeasuredSums, parsedStatus.measuredSums);
}
}
}
diff --git a/src/test/resources/totalcw/2018-10-15-00-00-00-consensus.part b/src/test/resources/totalcw/2018-10-15-00-00-00-consensus.part
new file mode 100644
index 0000000..b1ef7c5
--- /dev/null
+++ b/src/test/resources/totalcw/2018-10-15-00-00-00-consensus.part
@@ -0,0 +1,251 @@
+@type network-status-consensus-3 1.0
+network-status-version 3
+vote-status consensus
+consensus-method 28
+valid-after 2018-10-15 00:00:00
+fresh-until 2018-10-15 01:00:00
+valid-until 2018-10-15 03:00:00
+voting-delay 300 300
+client-versions 0.2.9.14,0.2.9.15,0.2.9.16,0.2.9.17,0.3.2.6-alpha,0.3.2.7-rc,0.3.2.8-rc,0.3.2.9,0.3.2.10,0.3.2.11,0.3.2.12,0.3.3.1-alpha,0.3.3.2-alpha,0.3.3.3-alpha,0.3.3.4-alpha,0.3.3.5-rc,0.3.3.6,0.3.3.7,0.3.3.8,0.3.3.9,0.3.3.10,0.3.4.1-alpha,0.3.4.2-alpha,0.3.4.3-alpha,0.3.4.4-rc,0.3.4.5-rc,0.3.4.6-rc,0.3.4.7-rc,0.3.4.8,0.3.5.1-alpha,0.3.5.2-alpha,0.3.5.3-alpha
+server-versions 0.2.9.14,0.2.9.15,0.2.9.16,0.2.9.17,0.3.2.10,0.3.2.11,0.3.2.12,0.3.3.2-alpha,0.3.3.3-alpha,0.3.3.4-alpha,0.3.3.5-rc,0.3.3.6,0.3.3.7,0.3.3.8,0.3.3.9,0.3.3.10,0.3.4.1-alpha,0.3.4.2-alpha,0.3.4.3-alpha,0.3.4.4-rc,0.3.4.5-rc,0.3.4.6-rc,0.3.4.7-rc,0.3.4.8,0.3.5.1-alpha,0.3.5.2-alpha,0.3.5.3-alpha
+known-flags Authority BadExit Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 Microdesc=1 Relay=1-2
+params CircuitPriorityHalflifeMsec=30000 DoSCircuitCreationEnabled=1 DoSConnectionEnabled=1 DoSConnectionMaxConcurrentCount=50 DoSRefuseSingleHopClientRendezvous=1 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 hs_service_max_rdv_failures=1 hsdir_spread_store=4 pb_disablepct=0 usecreatefast=0
+shared-rand-previous-value 9 Vd2znClwwth89jp91diG/Bs1AH+0ExSgRFmyVOMJwwE=
+shared-rand-current-value 9 oiXRUZGkT26O9aQmu/A52utoBF3gp27h0TvJ4gkDHkw=
+dir-source dannenberg 0232AF901C31A04EE9848595AF9BB7620D4C5B2E dannenberg.torauth.de 193.23.244.244 80 443
+contact Andreas Lehner
+vote-digest 55A38ED50848BE1F13C6A35C3CA637B0D962C2EF
+dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443
+contact Peter Palfrader
+vote-digest EB6F8C0AF9DBC7A6CCA92C633B1AEF38BE55C5DF
+dir-source longclaw 23D15D965BC35114467363C165C4F724B64B4F66 199.58.81.140 199.58.81.140 80 443
+contact Riseup Networks <collective at riseup dot net> - 1nNzekuHGGzBYRzyjfjFEfeisNvxkn4RT
+vote-digest 867D4F189EA9C6A0A4A688DA08B5BE63E0F974F9
+dir-source bastet 27102BC123E7AF1D4741AE047E160C91ADC76B21 204.13.164.118 204.13.164.118 80 443
+contact stefani <nocat at readthefinemanual dot net>
+vote-digest 049AB3179B12DACC391F06A10C2A8904E4339D33
+dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80
+contact 4096R/1E8BF34923291265 Linus Nordberg <linus(a)nordberg.se>
+vote-digest C1FD622901C12211758F9FF507DAD821EA2B4A4D
+dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101
+contact 1024D/28988BF5 arma mit edu
+vote-digest 9BD97F7B3205048B1FF8FC02EFE9D10B64BAB4EB
+dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443
+contact 1024R/8D56913D Alex de Joode <adejoode(a)sabotage.org>
+vote-digest 6E40986B3025BB5916966EB98851D35809FF2B54
+dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 131.188.40.189 131.188.40.189 80 443
+contact 4096R/261C5FBE77285F88FB0C343266C8C2D7C5AA446D Sebastian Hahn <tor(a)sebastianhahn.net> - 12NbRAjAG5U3LLWETSF7fSTcdaz32Mu5CN
+vote-digest 2669AD153408F88E416CE6206D1A75EC3324A2F4
+dir-source Faravahar EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 154.35.175.225 154.35.175.225 80 443
+contact 0x0B47D56D Sina Rabbani (inf0) <sina redteam net>
+vote-digest 38C6A19F78948B689345EE41D7119D76246C4D3E
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw xlbC5aW8ovDVh2t6VcKF/phheSg 2018-10-14 21:41:22 67.174.243.193 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=16
+p reject 1-65535
+r PutoElQueLee293884 AAwffNL+oHO5EdyUoWAOwvEX3ws Ay3cnaaHjnolSRe3ZjKcGlY17Q8 2018-10-14 08:06:47 174.127.217.73 55554 0
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.3.9
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=5620
+p reject 1-65535
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 +8xNQyAVPkKgtLH0AISVZFNuAq0 2018-10-14 11:10:20 162.247.74.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=14700
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544,554,563,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8087-8088,8332-8333,8443,8888,9418,9999-10000,11371,12350,19294,19638,23456,33033,64738
+r Neldoreth ABUk3UA9cp8I9+XXeBPvEnVs+o0 nms8ZM18C/K5XzLmgO5fHchjhFc 2018-10-14 19:09:56 185.13.39.197 443 80
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=10400
+p reject 1-65535
+r rotor25 ADQsDhVdRULlU5F4iy13nxRXjes m/3hkTP+ETmoYWZ3JrniJAeRHho 2018-10-14 17:19:08 188.24.22.193 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=5580
+p reject 1-65535
+r torbogen AEHgFQsKMHUGwoY+/J8rfjpSOzY DXa3G+iPbGQo4AK2iazVY6R4eKs 2018-10-14 20:19:33 178.142.72.49 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.3.9
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=1070
+p reject 1-65535
+r nicolass67atoll AES/YhfxWxj3ZvK1O85bPg4BV+k iK+QhopNtEipMSL+EeI6b/DitVc 2018-10-14 15:48:15 163.172.10.89 9001 0
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.16
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=856
+p reject 1-65535
+r zzzzzzzzzzzzzzzzzzz AEVz/pNLpV0H2ucjF3k69OQbdbY 1FUGYNQtQo1MgV4jRP2XJapWemI 2018-10-14 23:43:10 77.12.174.141 9002 9031
+s Fast Running V2Dir Valid
+v Tor 0.3.2.10
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=235
+p reject 1-65535
+r helga AFnZKULbO4TlLrTYfp97GVz00AU ngp++P8hEV+Pj/j9OvvDCyuDqKA 2018-10-14 17:09:42 88.99.216.194 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=261
+p reject 1-65535
+r Torpi AHJ/OiwdDxcxqRJnxBFQecFrILQ bLi/i6JuuPmoWm1aGd73dy2tYlA 2018-10-14 15:51:48 110.146.4.151 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.4.29
+pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2
+w Bandwidth=23
+p reject 1-65535
+r VeespRU2 AHTsqCvVi4uxkJycTyN/2XebI/w r3AsIyXKvSFzC+5eDuiUgPTmG9g 2018-10-14 09:25:26 185.22.172.237 443 80
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=21300
+p reject 1-65535
+r Quintex13 AHe8unJE2z5qXtJ0boYXAGZoSIc GwoBS5ddT7ktxwqHjHYNc2u53xU 2018-10-14 07:38:44 199.249.223.62 443 80
+s Exit Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=5000
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8082,8087-8088,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+r torrelay04 AH/ZCOnPz1nmT7pCt1cdLPQBvF0 n5XUymNehFnO8hTftwd4NIozrjQ 2018-10-14 18:52:54 159.69.153.73 9000 0
+a [2a01:4f8:1c1c:5cec::1]:9000
+s Fast Running Stable Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=8460
+p reject 1-65535
+r bigamy AH/cDMglli4ShKYaaMk4pmr75XA dMrr7wRTfKoVfCRHLuR0IZFSWsI 2018-10-14 13:28:57 185.24.218.171 9001 8080
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=21600
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+r zech1989 AI57cMO0p1ILW+q4Bnq83I5j8f0 boK7UYxCaZy4lpe8irfYPFsX6SY 2018-10-14 21:18:08 185.243.53.99 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=7500
+p reject 1-65535
+r paris AJf70aisEQPfmPHoXdUsUPAdOtY 9x4Jiv45IDG4EDSSXfOd+Ss9qtc 2018-10-14 22:06:20 178.19.111.147 9001 8000
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=34800
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+r jactr AJhR35M3VLAN3odvzkCIzhtJQME RLckbaDnNUH4qGCkOmDo20UwE28 2018-10-14 23:26:36 84.40.112.70 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.9.15
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=68
+p reject 1-65535
+r IsThisAGoodIdea AJ2M8WzPcSMatc5VyCoDRG2j+Us Gce3qKSpkK8w2D+9k75V7vNdWzI 2018-10-14 16:51:45 220.233.27.93 9001 0
+s Running Valid
+v Tor 0.3.3.9
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=5
+p reject 1-65535
+r hozipi ALIqOUZNig9oebg/jlqo4oMPdAw vFalrkfCLlJRmGrSva7qK2nc30A 2018-10-14 15:27:06 93.104.163.230 80 110
+s Fast Running Stable V2Dir Valid
+v Tor 0.3.4.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=162
+p reject 1-65535
+r Unnamed ALPJ+3njaQWlF6SJsFgkZ1mr+8g 6CQL/R+ltI9Jzx9GTDFJ3YLvMOg 2018-10-14 12:18:53 80.254.128.45 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.2.9.14
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=38
+p reject 1-65535
+directory-footer
+bandwidth-weights Wbd=0 Wbe=0 Wbg=3669 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 Wem=10000 Wgb=10000 Wgd=0 Wgg=6331 Wgm=6331 Wmb=10000 Wmd=0 Wme=0 Wmg=3669 Wmm=10000
+directory-signature 0232AF901C31A04EE9848595AF9BB7620D4C5B2E CD1FD971855430880D3C31E0331C5C55800C2F79
+-----BEGIN SIGNATURE-----
+qLfqP5BkUTTxumtU7RAY5KM54bP6LPkU8dQqznJsipE7VyDXdZI+WHJztdvnuAyY
+5U97ZEypm/KLqlJz64eu5KoNb3I3nq5iOdONUZYZVY2THAaIUtx1I1ciHmmtjdiM
+deAZeD5hQEC255Nv12mSq5+1ILcXb2ubpUOMsYXZ/llLdLPD0z7YObaQYZ3dbfNW
+LocnNAN96ecAzBsanbTZoH6+dU4XkNNenH1VFokkpDEQggXyERYB1M/2bd2r62tO
+HD2NqSb45n5ZimeeSfFBJ7qLyMZBHmGCwaFY/AKl/MYYSNQzFOAPuKwP1Jqcx6nY
+3CcLZUeGtwmMwRpAX2+jxg==
+-----END SIGNATURE-----
+directory-signature 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 1F4D49989DA1503D5B20EAADB0673C948BA73B49
+-----BEGIN SIGNATURE-----
+e4lIInOkXIN0ZxnBng5gzo/zO8VM6u/iQHUCG0RwIRbRVmJ51RCM0YktTI+gm3ML
+OIm8QwnAC9yzXsmqI7ebqCylAXKv4bvNttowVkVD3YHv5qZ3wPWLN74W4xvLbCqc
+yIW3Lt/Uo2PSS7yUPcwi8vVgR9rkDmBol+Wz9E8GsUoeaVDdNa1D3rXzcxZLFeuF
+kcnDIAkapKw9gFylzIKAh4UnpmorKd5+CLIcclKCp/Q3beG4XeFVP+DmlUIZxaxW
+B9jd13flJbiMtAk6FBZEThVYf1zL6tgFHigJ0/l3elEBV42RlvHRlxOD3p4xsqq5
+IbM6qmjNi+2QYLVURG6F/3oYuwunP7hP42OC8Z2BlL2bOetMFfm+b1mFcKZSlnuU
+6k8uWXl0yLVovd0s/+bJGp81SiPsFzKY7Ng/QiYnNzWgNduNGAyL40P6jd9oJzqX
+ex4p4OIf1EukgbM8QA4AErzmL9QqfP2EnFYNDjXogzUrVeLulOpZfp00Iwbth1QY
+-----END SIGNATURE-----
+directory-signature 23D15D965BC35114467363C165C4F724B64B4F66 A2E5511319AD43DF88EABFB8BB1FFD767D005601
+-----BEGIN SIGNATURE-----
+gVI0n2dVpbJHfMVxOrvFSXNGfMjNKVzWi9CsIhhq1fgg1oCsiK2z2w2K+3WXlZuI
+op8USZAXC4FFocBrWXcazv+8BMUZ8CyWHhi5nKV82wOsA7nj0UQg85ODzukYHAl6
+NMr7guHxGBZajjfSvvtyoA9EzFfu/Vctv25+sXAKI0VN/F16GBL7riZYh21L/jUs
+cLC2T3EptDpJSBD8DwE9dbBrWjdL6nQlvVnGnVPhhVV4ydMRrF4S91dxE1SfShRa
+x9PT9g/RfpO1m5JKqY9oiczj5DYKEUa+uUYAsgxrXerr/OBtMtIblve/OUD6iAR8
+1gZDUJgZFd/USuuE0Cd/hw==
+-----END SIGNATURE-----
+directory-signature 27102BC123E7AF1D4741AE047E160C91ADC76B21 6FF3CD454038B7FDD7862B2DD778E4F702C31419
+-----BEGIN SIGNATURE-----
+dHbu/GLZPwmSwKCWCapZqN9RA+kN71t8dARvyoA0AS4E8J2I7/IEs9fonIcbqgWI
+6K77YJhPnVrLJ2/lAiWXcgbQEW079egTdt9OspSm2EiDm+XhsNJu5Gi7vbltVgou
+p1A+8L1qlawHiJjJ1xr01sK3vsvyLpjC3KWidV4epyTL9AXXX81eMhTa0o8jH1k2
+JZ9R7FIXlNd18F+RpUW0cAUpyY1JMUf2Zh/4YoJE9PO3ToJWukOLVbp0Td96rJo8
+/9LhhKAK0gytZEGmZhgBAxEK3YBEeGjfFNWcLr5KXEV1SmKI58JuqMDCSp/eMCrr
+EkYIG/ZCdcoA5Y8pa8GR7Q==
+-----END SIGNATURE-----
+directory-signature 49015F787433103580E3B66A1707A00E60F2D15B 10A69F531F8421310537EAC881F7DD354F251D31
+-----BEGIN SIGNATURE-----
+JsNCDE1RvcKaTXmExZvt7JfiZuCom7VQOl2E3Ree/szIfbD6Py4z3i4MVi5YVRX2
+3T6UZlImnm6dXRDv78rcUm9C/swuTSzTXHHWJE2n+yY/Gveq097dQBUfoS0tRNUj
+KsvNhbaXu5VSrQg/L1q1h6YpZ6tvvwYOxdGykIAvSqfo2XmV0iRziNOHcRPLaupu
+Wg1JFDwn9PRGsqR8HUan7SaP9VpVM8IZVkQVVJhtIdZfq9ioPIXs3uF64vwpTxQZ
+sLW0SR2Spn+M4SJ/ds9GCO/fIIWQBrFZsl6z0wEWGqSboN2Xc90jBrIqZ7TSGG2N
+ruSzC54U3bf4F/fTO85p2A==
+-----END SIGNATURE-----
+directory-signature D586D18309DED4CD6D57C18FDB97EFA96D330566 8A45BACC94A6023A90C24FBCD10520C1741828F7
+-----BEGIN SIGNATURE-----
+y1OoF+WUYaJRjx7m0xgetRbi7nIP8z7rMeoRYDhSxtGnXSyJfZ20QMDQofNDsLtW
+B5iW+vfAj4osaKYk6RW47rIedSlgtGru4vPNawRsVKAnefU707lfOsgpchFY0GYM
+QyIryrCfoFWdbXcrnguvU22ZbTgHZIQ4oa9sJIpgEOk2OwjrGwQeUuq3O27bw2Tt
+VNEqBx+co3XSvWGZmejAI2OKEw9dpgFyM9GoNW3d9U35atxy6yRtm4ki8HeLkQMm
+VYXTVVE9nGoKv7h8n0jt3oxd3HMz5PhI3ZEj96TFIXiVscHZ7EtvbOrc4/MkiuMH
+M9yHJFKbhnhcCedgUrq37g==
+-----END SIGNATURE-----
+directory-signature E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 109A865D7DBE58367C120353CBE9947EE263695A
+-----BEGIN SIGNATURE-----
+Y7yEDJd6cz9Xa9w/FCxn8MNWH6kstjQsMmgOTpEY75h79E3ZVZQKJhJ7yJUMYdVh
+tWINafeVvTsWIX5D3MN1WdXt09UJgP4G+CJtQfohiiUBWwCeFJALBNF+9PINIQHU
+1Lgnv2qRVyYz4FZum0pDFFMv2oemZzXOvTVoQHN0nmZdxZBFA5BNRK/EJupxxJYi
+sTt3WOdoiB5OZX5RUQcfOQwzhR0NcMbvWcEqPyucbSuvKHiN7Iga2FY7B9o167v2
+Ee9XIK2qDaAXcii9i5k0LJjTn/kSlzdbjILlPTJFnVnaMtpilYz59Mk24JiKGkny
+iZGcA8yD6AHjvtC76r6eag==
+-----END SIGNATURE-----
+directory-signature ED03BB616EB2F60BEC80151114BB25CEF515B226 E1249D5F87EAD43CD4A48DF9CFCFE810BEEE5287
+-----BEGIN SIGNATURE-----
+TiqLj1g8iGiVF+IPNVwMGC1n6iCZu4Q/GLT/x920A2DPt01mwuCx4fMp12mVdPj4
+vvEpNbjqsMaqlDYBlSsZ+80l2KP1+U5ydJSoYek+meuJlSEByXdoF00UFrW8/e2s
+Jl+ARex56j+vSzj1c1qHbAfIKw/N+7/F4/9IBgLUwOVoTuvd8qcBT/UtE/gyE+kR
+Hzdrpolgu6zVICKpxa8FA/PVNaya+PYIwEfhONqw84EiJXxShTdOYFTSM+FlhBkq
+MZEVVmFrPNOxH69vnBiNvt0X0nn6tVr8QhLki6zvlVzfvvE2JkJ2fGLMhOl33q/T
+312j/QBcQ3oOBv+rF+Dnpw==
+-----END SIGNATURE-----
+directory-signature EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 517095062288D1B5C7BD6517A677C586D996818B
+-----BEGIN SIGNATURE-----
+21SUNen81Mcgubfn5MLVdxM65tNN9DOIwJBTxlqmQ9UzrN5TsC8ygc89lp0l8Q3t
+GP2cuw4BBShmsaU0yVT7GdONc/gqgR3SCJs9vq1BS7/7tNPPufh8ycD5xmIIsiX2
+HcC9Bh2na9Z9cfERu3s7lLwfOekPhc+Z1nf1KWLKrl+saA/zUuPjMq0AVKJedOns
+vIvockXv98cYrSc6cJ+TQ9qCR7eyG2+5TzUFmXiyH6uDfeaoetIKbJK3f9iaLisS
+73KLagxjurzRFGN9r1fwgJe14WBh3eVLfDcnXKwkqjArlBDVS3QhnLbK2W/BGr+9
+URs9oqYJlBwBp2Ia26odSg==
+-----END SIGNATURE-----
1
0

15 Dec '18
commit ffaab885748c5340b01ad87ddb88819cd779c2b0
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Nov 29 11:53:41 2018 +0100
Document changes to the totalcw graph.
Still part of #28137, #28328, and #28352.
---
.../resources/web/jsps/reproducible-metrics.jsp | 22 ++++++++++++++++++----
src/main/resources/web/jsps/stats.jsp | 6 +++---
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/main/resources/web/jsps/reproducible-metrics.jsp b/src/main/resources/web/jsps/reproducible-metrics.jsp
index b6df6c3..24bdba0 100644
--- a/src/main/resources/web/jsps/reproducible-metrics.jsp
+++ b/src/main/resources/web/jsps/reproducible-metrics.jsp
@@ -380,7 +380,18 @@ The goal is to avoid over-representing a few statuses during periods when the br
<li>Total consensus weights across bandwidth authorities <a href="/totalcw.html" class="btn btn-primary btn-xs"><i class="fa fa-chevron-right" aria-hidden="true"></i> graph</a></li>
</ul>
-<h4>Step 1: Parse votes.</h4>
+<h4>Step 1: Parse consensuses.</h4>
+
+<p>Obtain consensuses from <a href="/collector.html#type-network-status-consensus-3">CollecTor</a>.
+Refer to the <a href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt">Tor directory protocol, version 3</a> for details on the descriptor format.</p>
+
+<p>Parse and memorize the <code>"valid-after"</code> time from the consensus header. We use this UTC timestamp to aggregate by the UTC date.</p>
+
+<p>Parse the <code>"s"</code> lines of all status entries and skip entries without the <code>"Running"</code> flag. Optionally distinguish relays by assigned <code>"Guard"</code> and <code>"Exit"</code> flags.</p>
+
+<p>Parse the (optional) <code>"w"</code> lines of all status entries and compute the total of all bandwidth values denoted by the <code>"Bandwidth="</code> keyword. If an entry does not contain such a value, skip the entry. If a consensus does not contain a single bandwidth value, skip the consensus.</code>
+
+<h4>Step 2: Parse votes.</h4>
<p>Obtain votes from <a href="/collector.html#type-network-status-vote-3">CollecTor</a>.
Refer to the <a href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt">Tor directory protocol, version 3</a> for details on the descriptor format.</p>
@@ -389,11 +400,14 @@ Refer to the <a href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.tx
<p>Also parse the <code>"nickname"</code> and <code>"identity"</code> fields from the <code>"dir-source"</code> line. We use the identity to aggregate by authority and the nickname for display purposes.</p>
-<p>Parse the (optional) <code>"w"</code> lines of all status entries and compute the total of all measured bandwidth values denoted by the <code>"Measured="</code> keyword. If an entry does not contain such a value, skip the entry. If a vote does not contain a single measured bandwidth value, skip the vote.</code>
+<p>Parse the <code>"s"</code> lines of all status entries and skip entries without the <code>"Running"</code> flag. Optionally distinguish relays by assigned <code>"Guard"</code> and <code>"Exit"</code> flags.</p>
-<h4>Step 2: Compute daily averages</h4>
+<p>Parse the (optional) <code>"w"</code> lines of all status entries and compute the total of all measured bandwidth values denoted by the <code>"Measured="</code> keyword. If an entry does not contain such a value, skip the entry. If a vote does not contain a single measured bandwidth value, skip the vote.</p>
+
+<h4>Step 3: Compute daily averages</h4>
-<p>Go through all previously processed votes by valid-after UTC date and authority.
+<p>Go through all previously processed consensuses and votes by valid-after UTC date and authority.
+If there are less than 12 consensuses known for a given UTC date, skip consensuses from this date.
If an authority published less than 12 votes on a given UTC date, skip this date and authority.
Also skip the last date of the results, because those averages may still change throughout the day.
For all remaining combinations of date and authority, compute the arithmetic mean of total measured bandwidth, rounded down to the next-smaller integer number.</p>
diff --git a/src/main/resources/web/jsps/stats.jsp b/src/main/resources/web/jsps/stats.jsp
index 002a3af..e5f9c6a 100644
--- a/src/main/resources/web/jsps/stats.jsp
+++ b/src/main/resources/web/jsps/stats.jsp
@@ -321,9 +321,9 @@ Servers <a href="#servers" name="servers" class="anchor">#</a></h2>
<h4>Columns</h4>
<ul>
-<li><b>date:</b> UTC date (YYYY-MM-DD) when bridges have been listed as running.</li>
-<li><b>nickname:</b> Bandwidth authority nickname.</li>
-<li><b>totalcw:</b> Total consensus weight of all relays measured by the bandwidth authority.</li>
+<li><b>date:</b> UTC date (YYYY-MM-DD) when relays have been listed as running.</li>
+<li><b>nickname:</b> Bandwidth authority nickname, or the empty string in case of the consensus.</li>
+<li><b>totalcw:</b> Total consensus weight of all running relays measured by the bandwidth authority or contained in the consensus.</li>
</ul>
</div>
1
0

[metrics-web/master] Break down totalcw numbers by Guard/(Bad)Exit flags.
by karsten@torproject.org 15 Dec '18
by karsten@torproject.org 15 Dec '18
15 Dec '18
commit 7b39042ecfae011d5891af963ae94bd35141fbc0
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Nov 29 10:09:28 2018 +0100
Break down totalcw numbers by Guard/(Bad)Exit flags.
Requires updating the vote table and the totalcw view in the database.
Implements #28328.
---
src/main/R/rserver/graphs.R | 4 ++-
.../torproject/metrics/stats/totalcw/Database.java | 36 ++++++++++------------
.../metrics/stats/totalcw/OutputLine.java | 12 ++++++--
.../torproject/metrics/stats/totalcw/Parser.java | 17 +++++-----
.../totalcw/TotalcwRelayNetworkStatusVote.java | 6 ++--
src/main/sql/totalcw/init-totalcw.sql | 16 +++++++---
.../totalcw/TotalcwRelayNetworkStatusVoteTest.java | 18 ++++++-----
7 files changed, 66 insertions(+), 43 deletions(-)
diff --git a/src/main/R/rserver/graphs.R b/src/main/R/rserver/graphs.R
index df108e2..e3ac598 100644
--- a/src/main/R/rserver/graphs.R
+++ b/src/main/R/rserver/graphs.R
@@ -1562,7 +1562,9 @@ prepare_totalcw <- function(start_p, end_p) {
filter(if (!is.null(start_p))
valid_after_date >= as.Date(start_p) else TRUE) %>%
filter(if (!is.null(end_p))
- valid_after_date <= as.Date(end_p) else TRUE)
+ valid_after_date <= as.Date(end_p) else TRUE) %>%
+ group_by(valid_after_date, nickname) %>%
+ summarize(measured_sum_avg = sum(measured_sum_avg))
}
plot_totalcw <- function(start_p, end_p, path_p) {
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
index 66b0366..b6dc87c 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
@@ -66,9 +66,8 @@ class Database implements AutoCloseable {
"SELECT EXISTS (SELECT 1 FROM vote "
+ "WHERE valid_after = ? AND authority_id = ?)");
this.psVoteInsert = this.connection.prepareStatement(
- "INSERT INTO vote (valid_after, authority_id, measured_sum) "
- + "VALUES (?, ?, ?)",
- Statement.RETURN_GENERATED_KEYS);
+ "INSERT INTO vote (valid_after, authority_id, have_guard_flag, "
+ + "have_exit_flag, measured_sum) VALUES (?, ?, ?, ?, ?)");
}
/** Insert a parsed vote into the vote table. */
@@ -116,22 +115,17 @@ class Database implements AutoCloseable {
}
}
}
- int voteId = -1;
- this.psVoteInsert.clearParameters();
- this.psVoteInsert.setTimestamp(1,
- Timestamp.from(ZonedDateTime.of(vote.validAfter,
- ZoneId.of("UTC")).toInstant()), calendar);
- this.psVoteInsert.setInt(2, authorityId);
- this.psVoteInsert.setLong(3, vote.measuredSum);
- this.psVoteInsert.execute();
- try (ResultSet rs = this.psVoteInsert.getGeneratedKeys()) {
- if (rs.next()) {
- voteId = rs.getInt(1);
- }
- }
- if (voteId < 0) {
- throw new SQLException("Could not retrieve auto-generated key for new "
- + "vote entry.");
+ for (int measuredSumsIndex = 0; measuredSumsIndex < 4;
+ measuredSumsIndex++) {
+ this.psVoteInsert.clearParameters();
+ this.psVoteInsert.setTimestamp(1,
+ Timestamp.from(ZonedDateTime.of(vote.validAfter,
+ ZoneId.of("UTC")).toInstant()), calendar);
+ this.psVoteInsert.setInt(2, authorityId);
+ this.psVoteInsert.setBoolean(3, 1 == (measuredSumsIndex & 1));
+ this.psVoteInsert.setBoolean(4, 2 == (measuredSumsIndex & 2));
+ this.psVoteInsert.setLong(5, vote.measuredSums[measuredSumsIndex]);
+ this.psVoteInsert.execute();
}
}
@@ -159,6 +153,10 @@ class Database implements AutoCloseable {
outputLine.validAfterDate = rs.getDate(
OutputLine.Column.VALID_AFTER_DATE.name(), calendar).toLocalDate();
outputLine.nickname = rs.getString(OutputLine.Column.NICKNAME.name());
+ outputLine.haveGuardFlag = rs.getBoolean(
+ OutputLine.Column.HAVE_GUARD_FLAG.name());
+ outputLine.haveExitFlag = rs.getBoolean(
+ OutputLine.Column.HAVE_EXIT_FLAG.name());
outputLine.measuredSumAvg = rs.getLong(
OutputLine.Column.MEASURED_SUM_AVG.name());
statistics.add(outputLine);
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
index 450dbac..5587e5d 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
@@ -13,7 +13,8 @@ class OutputLine {
/** Column names used in the database and in the first line of the output
* file. */
enum Column {
- VALID_AFTER_DATE, NICKNAME, MEASURED_SUM_AVG
+ VALID_AFTER_DATE, NICKNAME, HAVE_GUARD_FLAG, HAVE_EXIT_FLAG,
+ MEASURED_SUM_AVG
}
/** Column headers joined together with the given delimiter. */
@@ -28,6 +29,12 @@ class OutputLine {
/** Server type, which can be "relay" or "bridge". */
String nickname;
+ /** Whether contained relays all have the "Guard" flag. */
+ boolean haveGuardFlag;
+
+ /** Whether contained relays all have the "Exit" flag. */
+ boolean haveExitFlag;
+
/** Mean value of total measured bandwidths of all relays over the day. */
Long measuredSumAvg;
@@ -35,7 +42,8 @@ class OutputLine {
* file. */
@Override
public String toString() {
- return String.format("%s,%s,%d", validAfterDate, nickname, measuredSumAvg);
+ return String.format("%s,%s,%s,%s,%d", validAfterDate, nickname,
+ haveGuardFlag ? "t" : "f", haveExitFlag ? "t" : "f", measuredSumAvg);
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
index b6a35b4..6070822 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
@@ -17,18 +17,21 @@ class Parser {
* contain any bandwidth measurements. */
TotalcwRelayNetworkStatusVote parseRelayNetworkStatusVote(
RelayNetworkStatusVote vote) {
- Long measuredSum = null;
+ boolean containsMeasuredBandwidths = false;
+ long[] measuredSums = new long[4];
for (NetworkStatusEntry entry : vote.getStatusEntries().values()) {
if (null == entry.getFlags() || !entry.getFlags().contains("Running")
|| entry.getMeasured() < 0L) {
continue;
}
- if (null == measuredSum) {
- measuredSum = 0L;
- }
- measuredSum += entry.getMeasured();
+ containsMeasuredBandwidths = true;
+ /* Encode flags as sum of Guard = 1 and (Exit and !BadExit) = 2. */
+ int measuredSumsIndex = (entry.getFlags().contains("Guard") ? 1 : 0)
+ + (entry.getFlags().contains("Exit")
+ && !entry.getFlags().contains("BadExit") ? 2 : 0);
+ measuredSums[measuredSumsIndex] += entry.getMeasured();
}
- if (null == measuredSum) {
+ if (!containsMeasuredBandwidths) {
/* Return null, because we wouldn't want to add this vote to the database
* anyway. */
return null;
@@ -39,7 +42,7 @@ class Parser {
.atZone(ZoneId.of("UTC")).toLocalDateTime();
parsedVote.identityHex = vote.getIdentity();
parsedVote.nickname = vote.getNickname();
- parsedVote.measuredSum = measuredSum;
+ parsedVote.measuredSums = measuredSums;
return parsedVote;
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
index ff56d91..0c5a095 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
@@ -19,7 +19,9 @@ class TotalcwRelayNetworkStatusVote {
* key. */
String identityHex;
- /** Sum of bandwidth measurements of all contained status entries. */
- long measuredSum;
+ /** Sums of bandwidth measurements of all contained status entries with four
+ * entries: 0 = neither Exit nor Guard, 1 = only Guard, 2 = only Exit, and
+ * 3 = both Guard and Exit. */
+ long[] measuredSums;
}
diff --git a/src/main/sql/totalcw/init-totalcw.sql b/src/main/sql/totalcw/init-totalcw.sql
index d723adb..cdba275 100644
--- a/src/main/sql/totalcw/init-totalcw.sql
+++ b/src/main/sql/totalcw/init-totalcw.sql
@@ -31,21 +31,27 @@ CREATE TABLE vote (
-- Numeric identifier uniquely identifying the authority generating this vote.
authority_id INTEGER REFERENCES authority (authority_id),
+ -- Whether contained relays had the Guard flag assigned.
+ have_guard_flag BOOLEAN NOT NULL,
+
+ -- Whether contained relays had the Exit flag assigned.
+ have_exit_flag BOOLEAN NOT NULL,
+
-- Sum of bandwidth measurements of all contained status entries.
measured_sum BIGINT NOT NULL,
- UNIQUE (valid_after, authority_id)
+ UNIQUE (valid_after, authority_id, have_guard_flag, have_exit_flag)
);
-- View on aggregated total consensus weight statistics in a format that is
-- compatible for writing to an output CSV file. Votes are only included in the
-- output if at least 12 votes are known for a given authority and day.
CREATE OR REPLACE VIEW totalcw AS
-SELECT DATE(valid_after) AS valid_after_date, nickname,
- FLOOR(AVG(measured_sum)) AS measured_sum_avg
+SELECT DATE(valid_after) AS valid_after_date, nickname, have_guard_flag,
+ have_exit_flag, FLOOR(AVG(measured_sum)) AS measured_sum_avg
FROM vote NATURAL JOIN authority
-GROUP BY DATE(valid_after), nickname
+GROUP BY DATE(valid_after), nickname, have_guard_flag, have_exit_flag
HAVING COUNT(vote_id) >= 12
AND DATE(valid_after) < (SELECT MAX(DATE(valid_after)) FROM vote)
-ORDER BY DATE(valid_after), nickname;
+ORDER BY DATE(valid_after), nickname, have_guard_flag, have_exit_flag;
diff --git a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
index 7c5ecc7..189b3b7 100644
--- a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
+++ b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
@@ -4,6 +4,7 @@
package org.torproject.metrics.stats.totalcw;
import static junit.framework.TestCase.assertEquals;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNull;
import org.torproject.descriptor.Descriptor;
@@ -35,19 +36,22 @@ public class TotalcwRelayNetworkStatusVoteTest {
{ "2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-"
+ "55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "dannenberg", "0232AF901C31A04EE9848595AF9BB7620D4C5B2E", -1L },
+ "dannenberg", "0232AF901C31A04EE9848595AF9BB7620D4C5B2E", null },
{ "2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-"
+ "049AB3179B12DACC391F06A10C2A8904E4339D33.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21", 138700L },
+ "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21",
+ new long[] { 13700L, 47220L, 17080L, 60700L } },
{ "2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-"
+ "2669AD153408F88E416CE6206D1A75EC3324A2F4.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226", 133370L },
+ "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226",
+ new long[] { 18020L, 43200L, 26150L, 46000L } },
{ "2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-"
+ "38C6A19F78948B689345EE41D7119D76246C4D3E.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97", 158395L }
+ "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97",
+ new long[] { 17365L, 52030L, 35400L, 53600L } }
});
}
@@ -64,7 +68,7 @@ public class TotalcwRelayNetworkStatusVoteTest {
public String expectedIdentityHex;
@Parameter(4)
- public long expectedMeasuredSum;
+ public long[] expectedMeasuredSums;
@Test
public void testParseVote() throws Exception {
@@ -82,13 +86,13 @@ public class TotalcwRelayNetworkStatusVoteTest {
sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
TotalcwRelayNetworkStatusVote parsedVote = new Parser()
.parseRelayNetworkStatusVote((RelayNetworkStatusVote) descriptor);
- if (this.expectedMeasuredSum < 0L) {
+ if (null == this.expectedMeasuredSums) {
assertNull(parsedVote);
} else {
assertEquals(this.expectedValidAfter, parsedVote.validAfter);
assertEquals(this.expectedNickname, parsedVote.nickname);
assertEquals(this.expectedIdentityHex, parsedVote.identityHex);
- assertEquals(this.expectedMeasuredSum, parsedVote.measuredSum);
+ assertArrayEquals(this.expectedMeasuredSums, parsedVote.measuredSums);
}
}
}
1
0

[metrics-web/master] Only include Running relays in totalcw graph.
by karsten@torproject.org 15 Dec '18
by karsten@torproject.org 15 Dec '18
15 Dec '18
commit 9df357886ebfca86da41fb7835282a3b57d249c0
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Nov 29 08:45:10 2018 +0100
Only include Running relays in totalcw graph.
Previously we included measured bandwidths of all relays in a vote in
the totalcw graph. Now we only include relays with the Running flag in
the vote.
Implements #28137.
---
src/main/java/org/torproject/metrics/stats/totalcw/Parser.java | 3 ++-
.../metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java | 6 +++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
index 893184c..b6a35b4 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
@@ -19,7 +19,8 @@ class Parser {
RelayNetworkStatusVote vote) {
Long measuredSum = null;
for (NetworkStatusEntry entry : vote.getStatusEntries().values()) {
- if (entry.getMeasured() < 0L) {
+ if (null == entry.getFlags() || !entry.getFlags().contains("Running")
+ || entry.getMeasured() < 0L) {
continue;
}
if (null == measuredSum) {
diff --git a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
index 11f931d..7c5ecc7 100644
--- a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
+++ b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
@@ -39,15 +39,15 @@ public class TotalcwRelayNetworkStatusVoteTest {
{ "2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-"
+ "049AB3179B12DACC391F06A10C2A8904E4339D33.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21", 138803L },
+ "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21", 138700L },
{ "2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-"
+ "2669AD153408F88E416CE6206D1A75EC3324A2F4.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226", 133441L },
+ "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226", 133370L },
{ "2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-"
+ "38C6A19F78948B689345EE41D7119D76246C4D3E.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97", 158534L }
+ "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97", 158395L }
});
}
1
0

15 Dec '18
commit e94ceeb9b6763374f6edb0105ae6da9fd5098d99
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Nov 29 08:07:11 2018 +0100
Remove unused parts of totalcw module.
Requires updating the vote table of the database.
Part of #28137, #28328, and #28352.
---
.../torproject/metrics/stats/totalcw/Database.java | 15 ++------
.../torproject/metrics/stats/totalcw/Parser.java | 36 +++++--------------
.../totalcw/TotalcwRelayNetworkStatusVote.java | 25 -------------
src/main/sql/totalcw/init-totalcw.sql | 23 ------------
.../totalcw/TotalcwRelayNetworkStatusVoteTest.java | 42 +++-------------------
5 files changed, 17 insertions(+), 124 deletions(-)
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
index be4cad3..66b0366 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
@@ -66,10 +66,8 @@ class Database implements AutoCloseable {
"SELECT EXISTS (SELECT 1 FROM vote "
+ "WHERE valid_after = ? AND authority_id = ?)");
this.psVoteInsert = this.connection.prepareStatement(
- "INSERT INTO vote (valid_after, authority_id, measured_count, "
- + "measured_sum, measured_mean, measured_min, measured_q1, "
- + "measured_median, measured_q3, measured_max) "
- + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ "INSERT INTO vote (valid_after, authority_id, measured_sum) "
+ + "VALUES (?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
}
@@ -124,14 +122,7 @@ class Database implements AutoCloseable {
Timestamp.from(ZonedDateTime.of(vote.validAfter,
ZoneId.of("UTC")).toInstant()), calendar);
this.psVoteInsert.setInt(2, authorityId);
- this.psVoteInsert.setLong(3, vote.measuredCount);
- this.psVoteInsert.setLong(4, vote.measuredSum);
- this.psVoteInsert.setLong(5, vote.measuredMean);
- this.psVoteInsert.setLong(6, vote.measuredMin);
- this.psVoteInsert.setLong(7, vote.measuredQ1);
- this.psVoteInsert.setLong(8, vote.measuredMedian);
- this.psVoteInsert.setLong(9, vote.measuredQ3);
- this.psVoteInsert.setLong(10, vote.measuredMax);
+ this.psVoteInsert.setLong(3, vote.measuredSum);
this.psVoteInsert.execute();
try (ResultSet rs = this.psVoteInsert.getGeneratedKeys()) {
if (rs.next()) {
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
index 4367200..893184c 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
@@ -6,13 +6,8 @@ package org.torproject.metrics.stats.totalcw;
import org.torproject.descriptor.NetworkStatusEntry;
import org.torproject.descriptor.RelayNetworkStatusVote;
-import org.apache.commons.math3.stat.descriptive.rank.Percentile;
-
import java.time.Instant;
import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
/** Parser that extracts bandwidth measurement statistics from votes and creates
* data objects for them. */
@@ -22,13 +17,17 @@ class Parser {
* contain any bandwidth measurements. */
TotalcwRelayNetworkStatusVote parseRelayNetworkStatusVote(
RelayNetworkStatusVote vote) {
- List<Long> measuredBandwidths = new ArrayList<>();
+ Long measuredSum = null;
for (NetworkStatusEntry entry : vote.getStatusEntries().values()) {
- if (entry.getMeasured() >= 0L) {
- measuredBandwidths.add(entry.getMeasured());
+ if (entry.getMeasured() < 0L) {
+ continue;
+ }
+ if (null == measuredSum) {
+ measuredSum = 0L;
}
+ measuredSum += entry.getMeasured();
}
- if (measuredBandwidths.isEmpty()) {
+ if (null == measuredSum) {
/* Return null, because we wouldn't want to add this vote to the database
* anyway. */
return null;
@@ -39,24 +38,7 @@ class Parser {
.atZone(ZoneId.of("UTC")).toLocalDateTime();
parsedVote.identityHex = vote.getIdentity();
parsedVote.nickname = vote.getNickname();
- Collections.sort(measuredBandwidths);
- long totalValue = 0L;
- double[] values = new double[measuredBandwidths.size()];
- for (int i = 0; i < measuredBandwidths.size(); i++) {
- values[i] = (double) measuredBandwidths.get(i);
- totalValue += measuredBandwidths.get(i);
- }
- parsedVote.measuredCount = values.length;
- parsedVote.measuredSum = totalValue;
- parsedVote.measuredMean = totalValue / values.length;
- parsedVote.measuredMin = (long) Math.floor(values[0]);
- parsedVote.measuredMax = (long) Math.floor(values[values.length - 1]);
- Percentile percentile = new Percentile().withEstimationType(
- Percentile.EstimationType.R_7);
- percentile.setData(values);
- parsedVote.measuredQ1 = (long) Math.floor(percentile.evaluate(25.0));
- parsedVote.measuredMedian = (long) Math.floor(percentile.evaluate(50.0));
- parsedVote.measuredQ3 = (long) Math.floor(percentile.evaluate(75.0));
+ parsedVote.measuredSum = measuredSum;
return parsedVote;
}
}
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
index c139cdc..ff56d91 100644
--- a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
@@ -19,32 +19,7 @@ class TotalcwRelayNetworkStatusVote {
* key. */
String identityHex;
- /** Count of status entries containing bandwidth measurements. */
- long measuredCount;
-
/** Sum of bandwidth measurements of all contained status entries. */
long measuredSum;
-
- /** Mean value of bandwidth measurements of all contained status entries. */
- long measuredMean;
-
- /** Minimum value of bandwidth measurements of all contained status
- * entries. */
- long measuredMin;
-
- /** First quartile value of bandwidth measurements of all contained status
- * entries. */
- long measuredQ1;
-
- /** Median value of bandwidth measurements of all contained status entries. */
- long measuredMedian;
-
- /** Third quartile value of bandwidth measurements of all contained status
- * entries. */
- long measuredQ3;
-
- /** Maximum value of bandwidth measurements of all contained status
- * entries. */
- long measuredMax;
}
diff --git a/src/main/sql/totalcw/init-totalcw.sql b/src/main/sql/totalcw/init-totalcw.sql
index bbb6cac..d723adb 100644
--- a/src/main/sql/totalcw/init-totalcw.sql
+++ b/src/main/sql/totalcw/init-totalcw.sql
@@ -31,32 +31,9 @@ CREATE TABLE vote (
-- Numeric identifier uniquely identifying the authority generating this vote.
authority_id INTEGER REFERENCES authority (authority_id),
- -- Count of status entries containing bandwidth measurements.
- measured_count BIGINT NOT NULL,
-
-- Sum of bandwidth measurements of all contained status entries.
measured_sum BIGINT NOT NULL,
- -- Mean value of bandwidth measurements of all contained status entries.
- measured_mean BIGINT NOT NULL,
-
- -- Minimum value of bandwidth measurements of all contained status entries.
- measured_min BIGINT NOT NULL,
-
- -- First quartile value of bandwidth measurements of all contained status
- -- entries.
- measured_q1 BIGINT NOT NULL,
-
- -- Median value of bandwidth measurements of all contained status entries.
- measured_median BIGINT NOT NULL,
-
- -- Third quartile value of bandwidth measurements of all contained status
- -- entries.
- measured_q3 BIGINT NOT NULL,
-
- -- Maximum value of bandwidth measurements of all contained status entries.
- measured_max BIGINT NOT NULL,
-
UNIQUE (valid_after, authority_id)
);
diff --git a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
index dc9df7f..11f931d 100644
--- a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
+++ b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
@@ -35,23 +35,19 @@ public class TotalcwRelayNetworkStatusVoteTest {
{ "2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-"
+ "55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "dannenberg", "0232AF901C31A04EE9848595AF9BB7620D4C5B2E",
- 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L },
+ "dannenberg", "0232AF901C31A04EE9848595AF9BB7620D4C5B2E", -1L },
{ "2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-"
+ "049AB3179B12DACC391F06A10C2A8904E4339D33.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21",
- 20L, 138803L, 6940L, 5L, 76L, 2490L, 9732L, 34800L },
+ "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21", 138803L },
{ "2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-"
+ "2669AD153408F88E416CE6206D1A75EC3324A2F4.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226",
- 19, 133441L, 7023L, 2L, 153L, 3920L, 11030L, 31600L },
+ "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226", 133441L },
{ "2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-"
+ "38C6A19F78948B689345EE41D7119D76246C4D3E.part",
ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
- "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97",
- 20, 158534L, 7926L, 6L, 109L, 3215L, 9582L, 40700L }
+ "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97", 158534L }
});
}
@@ -68,29 +64,8 @@ public class TotalcwRelayNetworkStatusVoteTest {
public String expectedIdentityHex;
@Parameter(4)
- public long expectedMeasuredCount;
-
- @Parameter(5)
public long expectedMeasuredSum;
- @Parameter(6)
- public long expectedMeasuredMean;
-
- @Parameter(7)
- public long expectedMeasuredMin;
-
- @Parameter(8)
- public long expectedMeasuredQ1;
-
- @Parameter(9)
- public long expectedMeasuredMedian;
-
- @Parameter(10)
- public long expectedMeasuredQ3;
-
- @Parameter(11)
- public long expectedMeasuredMax;
-
@Test
public void testParseVote() throws Exception {
InputStream is = getClass().getClassLoader().getResourceAsStream(
@@ -107,20 +82,13 @@ public class TotalcwRelayNetworkStatusVoteTest {
sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
TotalcwRelayNetworkStatusVote parsedVote = new Parser()
.parseRelayNetworkStatusVote((RelayNetworkStatusVote) descriptor);
- if (0L == expectedMeasuredCount) {
+ if (this.expectedMeasuredSum < 0L) {
assertNull(parsedVote);
} else {
assertEquals(this.expectedValidAfter, parsedVote.validAfter);
assertEquals(this.expectedNickname, parsedVote.nickname);
assertEquals(this.expectedIdentityHex, parsedVote.identityHex);
- assertEquals(this.expectedMeasuredCount, parsedVote.measuredCount);
assertEquals(this.expectedMeasuredSum, parsedVote.measuredSum);
- assertEquals(this.expectedMeasuredMean, parsedVote.measuredMean);
- assertEquals(this.expectedMeasuredMin, parsedVote.measuredMin);
- assertEquals(this.expectedMeasuredQ1, parsedVote.measuredQ1);
- assertEquals(this.expectedMeasuredMedian, parsedVote.measuredMedian);
- assertEquals(this.expectedMeasuredQ3, parsedVote.measuredQ3);
- assertEquals(this.expectedMeasuredMax, parsedVote.measuredMax);
}
}
}
1
0

[translation/tails-iuk_completed] Update translations for tails-iuk_completed
by translation@torproject.org 15 Dec '18
by translation@torproject.org 15 Dec '18
15 Dec '18
commit 8a09b8488548c5ab7a90fb4556ade2c282f2c567
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 15 02:16:27 2018 +0000
Update translations for tails-iuk_completed
---
pt_BR.po | 90 ++++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 53 insertions(+), 37 deletions(-)
diff --git a/pt_BR.po b/pt_BR.po
index 8cc5ec02e..17b034910 100644
--- a/pt_BR.po
+++ b/pt_BR.po
@@ -3,7 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Communia <ameaneantie(a)riseup.net>, 2014-2016
+# Communia <ameaneantie(a)riseup.net>, 2014-2016,2018
# carlo giusepe tadei valente sasaki <carlo.gt.valente(a)gmail.com>, 2014
# drebs <drebs(a)riseup.net>, 2014
# Eduardo Bonsi, 2013
@@ -11,11 +11,11 @@
# Isabel Ferreira, 2014
msgid ""
msgstr ""
-"Project-Id-Version: The Tor Project\n"
+"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
-"POT-Creation-Date: 2018-03-01 21:30+0100\n"
-"PO-Revision-Date: 2018-04-12 19:08+0000\n"
-"Last-Translator: nilson t. c.\n"
+"POT-Creation-Date: 2018-12-09 13:56+0100\n"
+"PO-Revision-Date: 2018-12-15 01:58+0000\n"
+"Last-Translator: Communia <ameaneantie(a)riseup.net>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/torproject/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,18 +23,18 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ../lib/Tails/IUK/Frontend.pm:148 ../lib/Tails/IUK/Frontend.pm:524
-#: ../lib/Tails/IUK/Frontend.pm:697
+#: ../lib/Tails/IUK/Frontend.pm:147 ../lib/Tails/IUK/Frontend.pm:524
+#: ../lib/Tails/IUK/Frontend.pm:710
msgid ""
"For debugging information, execute the following command: sudo tails-"
"debugging-info"
msgstr "Para informações sobre depuração, executar o seguinte comando: sudo tails-debugging-info"
-#: ../lib/Tails/IUK/Frontend.pm:217
+#: ../lib/Tails/IUK/Frontend.pm:218
msgid "Error while checking for upgrades"
msgstr "Erro ao verificar as atualizações"
-#: ../lib/Tails/IUK/Frontend.pm:220
+#: ../lib/Tails/IUK/Frontend.pm:221
msgid ""
"<b>Could not determine whether an upgrade is available from our website.</b>\n"
"\n"
@@ -43,78 +43,77 @@ msgid ""
"If the problem persists, go to file:///usr/share/doc/tails/website/doc/upgrade/error/check.en.html"
msgstr "<b>Não foi possível determinar se uma atualização está disponível em nosso website.</b>\n\nVerifique sua conexão de rede e reinicie o Tails para tentar atualizar novamente.\n\nCaso o problema persista, consulte o arquivo:///usr/share/doc/tails/website/doc/upgrade/error/check.en.html"
-#: ../lib/Tails/IUK/Frontend.pm:235
+#: ../lib/Tails/IUK/Frontend.pm:236
msgid "no automatic upgrade is available from our website for this version"
msgstr "No nosso website, nenhuma atualização automática para essa versão está disponível"
-#: ../lib/Tails/IUK/Frontend.pm:241
+#: ../lib/Tails/IUK/Frontend.pm:242
msgid "your device was not created using Tails Installer"
msgstr "seu dispositivo não foi criado usando o Instalador do Tails"
-#: ../lib/Tails/IUK/Frontend.pm:246
+#: ../lib/Tails/IUK/Frontend.pm:247
msgid "Tails was started from a DVD or a read-only device"
msgstr "O Tails foi inciado a partir de um DVD ou de um dispositivo somente de leitura"
-#: ../lib/Tails/IUK/Frontend.pm:251
+#: ../lib/Tails/IUK/Frontend.pm:252
msgid "there is not enough free space on the Tails system partition"
msgstr "não há espaço livre suficiente na partição do sistema do Tails"
-#: ../lib/Tails/IUK/Frontend.pm:256
+#: ../lib/Tails/IUK/Frontend.pm:257
msgid "not enough memory is available on this system"
msgstr "não há memória suficiente disponível nesse sistema"
-#: ../lib/Tails/IUK/Frontend.pm:262
+#: ../lib/Tails/IUK/Frontend.pm:263
#, perl-brace-format
msgid "No explanation available for reason '%{reason}s'."
msgstr "Nenhuma explicação disponível para o motivo '%{reason}s'."
-#: ../lib/Tails/IUK/Frontend.pm:282
+#: ../lib/Tails/IUK/Frontend.pm:283
msgid "The system is up-to-date"
msgstr "O sistema está atualizado"
-#: ../lib/Tails/IUK/Frontend.pm:287
+#: ../lib/Tails/IUK/Frontend.pm:288
msgid "This version of Tails is outdated, and may have security issues."
msgstr "Esta versão do Tails está desatualizada e pode ter problemas de segurança."
-#: ../lib/Tails/IUK/Frontend.pm:319
+#: ../lib/Tails/IUK/Frontend.pm:320
#, perl-brace-format
msgid ""
"The available incremental upgrade requires %{space_needed}s of free space on"
" Tails system partition, but only %{free_space}s is available."
msgstr "A atualização incremental disponível requer %{space_needed}s de espaço livre na partição do sistema Tails, mas somente %{free_space}s está disponível."
-#: ../lib/Tails/IUK/Frontend.pm:335
+#: ../lib/Tails/IUK/Frontend.pm:336
#, perl-brace-format
msgid ""
"The available incremental upgrade requires %{memory_needed}s of free memory,"
" but only %{free_memory}s is available."
msgstr "A atualização incremental disponível requer %{memory_needed}s de espaço livre, mas somente %{free_memory}s está disponível."
-#: ../lib/Tails/IUK/Frontend.pm:357
+#: ../lib/Tails/IUK/Frontend.pm:358
msgid ""
"An incremental upgrade is available, but no full upgrade is.\n"
"This should not happen. Please report a bug."
msgstr "Uma atualização incremental está disponível, mas a atualização completa não se encontra disponível. Isso não deve acontecer. Por favor, reporte o bug."
-#: ../lib/Tails/IUK/Frontend.pm:361
+#: ../lib/Tails/IUK/Frontend.pm:362
msgid "Error while detecting available upgrades"
msgstr "Erro ao detectar as atualizações disponíveis"
-#: ../lib/Tails/IUK/Frontend.pm:371
+#: ../lib/Tails/IUK/Frontend.pm:372
#, perl-brace-format
msgid ""
"<b>You should upgrade to %{name}s %{version}s.</b>\n"
"\n"
"For more information about this new version, go to %{details_url}s\n"
"\n"
-"It is recommended to close all the open applications during the upgrade.\n"
+"We recommend you close all other applications during the upgrade.\n"
"Downloading the upgrade might take a long time, from several minutes to a few hours.\n"
-"The networking will be disabled after downloading the upgrade.\n"
"\n"
"Download size: %{size}s\n"
"\n"
"Do you want to upgrade now?"
-msgstr "<b>Você deve atualizar para %{name}s %{version}s.</b>\n\nPara mais informações sobre essa nova versão, veja %{details_url}s\n\nRecomendamos que você feche todas os programas durante a atualização.\nO download da atualização pode levar um bom tempo, de vários minutos a algumas horas.\nA rede será desabilitada após o download da atualização.\n\nTamanho do download: %{size}s\n\nVocê deseja fazer a atualizar agora?"
+msgstr "Você deve atualizar até %{name}s %{version}s \n\nPara mais informações sobre essa nova versão, consulte %{details_url}s\n\nRecomendamos que você feche todas as outras aplicações durante a atualização\nO download da atualização pode levar um tempo bastante longo, entre alguns minutos e algumas horas.\n\nTamanho do download: %{size}s\n\nVocê deseja atualizar agora?"
#: ../lib/Tails/IUK/Frontend.pm:386
msgid "Upgrade available"
@@ -191,7 +190,24 @@ msgstr "<b>Impossível encontrar um servidor para fazer download.</b>\n\nIsso n
msgid "Error while choosing a download server"
msgstr "Erro ao escolher um servidor para fazer download"
-#: ../lib/Tails/IUK/Frontend.pm:608
+#: ../lib/Tails/IUK/Frontend.pm:606
+msgid ""
+"The upgrade was successfully downloaded.\n"
+"\n"
+"The network connection will now be disabled.\n"
+"\n"
+"Please save your work and close all other applications."
+msgstr "A versão atualizada foi baixada com sucesso\n\n A conexão à rede será desabilitada agora\n\nPor favor, salve o seu trabalho e feche todas as aplicações."
+
+#: ../lib/Tails/IUK/Frontend.pm:612
+msgid "Upgrade successfully downloaded"
+msgstr "A versão atualizada foi baixada com sucesso"
+
+#: ../lib/Tails/IUK/Frontend.pm:614
+msgid "Apply upgrade"
+msgstr "Instalar a atualização"
+
+#: ../lib/Tails/IUK/Frontend.pm:621
msgid ""
"<b>Your Tails device was successfully upgraded.</b>\n"
"\n"
@@ -201,46 +217,46 @@ msgid ""
"Do you want to restart now?"
msgstr "<b>Seu dispositivo Tails foi atualizado com sucesso.</b>\n\nAlgumas funcionalidades de segurança foram desabilitadas temporariamente.\nVocê deve reiniciar o Tails em sua nova versão assim que puder.\n\nVocê deseja reiniciar agora?"
-#: ../lib/Tails/IUK/Frontend.pm:613
+#: ../lib/Tails/IUK/Frontend.pm:626
msgid "Restart Tails"
msgstr "Reiniciar o Tails"
-#: ../lib/Tails/IUK/Frontend.pm:614
+#: ../lib/Tails/IUK/Frontend.pm:627
msgid "Restart now"
msgstr "Reiniciar agora"
-#: ../lib/Tails/IUK/Frontend.pm:615
+#: ../lib/Tails/IUK/Frontend.pm:628
msgid "Restart later"
msgstr "Reiniciar mais tarde"
-#: ../lib/Tails/IUK/Frontend.pm:626
+#: ../lib/Tails/IUK/Frontend.pm:639
msgid "Error while restarting the system"
msgstr "Erro ao reiniciar o sistema"
-#: ../lib/Tails/IUK/Frontend.pm:629
+#: ../lib/Tails/IUK/Frontend.pm:642
msgid "Failed to restart the system"
msgstr "Falha em reiniciar o sistema"
-#: ../lib/Tails/IUK/Frontend.pm:644
+#: ../lib/Tails/IUK/Frontend.pm:657
msgid "Error while shutting down the network"
msgstr "Erro ao encerrar a rede"
-#: ../lib/Tails/IUK/Frontend.pm:647
+#: ../lib/Tails/IUK/Frontend.pm:660
msgid "Failed to shutdown network"
msgstr "Falha ao encerrar a rede"
-#: ../lib/Tails/IUK/Frontend.pm:657
+#: ../lib/Tails/IUK/Frontend.pm:670
msgid "Upgrading the system"
msgstr "Atualizando o sistema"
-#: ../lib/Tails/IUK/Frontend.pm:659
+#: ../lib/Tails/IUK/Frontend.pm:672
msgid ""
"<b>Your Tails device is being upgraded...</b>\n"
"\n"
"For security reasons, the networking is now disabled."
msgstr "<b> O seu dispositivo Tails está sendo atualizado...</b>\n\nPor razões de segurança, agora, a rede está desabilitada."
-#: ../lib/Tails/IUK/Frontend.pm:692
+#: ../lib/Tails/IUK/Frontend.pm:705
msgid ""
"<b>An error occured while installing the upgrade.</b>\\n\\nYour Tails device"
" needs to be repaired and might be unable to restart.\\n\\nPlease follow the"
@@ -248,6 +264,6 @@ msgid ""
"file:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
msgstr "<b>Ocorreu um erro ao instalar a atualização.</b>\\n\\nSeu dispositivo Tails precisa ser reparado e talvez não possa reiniciar.\\n\\nPor favor, siga as instruções no arquivo:///usr/share/doc/tails/website/doc/upgrade/error/install.en.html"
-#: ../lib/Tails/IUK/Frontend.pm:702
+#: ../lib/Tails/IUK/Frontend.pm:715
msgid "Error while installing the upgrade"
msgstr "Erro ao instalar a atualização"
1
0

15 Dec '18
commit 8548641f5cd5bb8589bcd76c31bfdae9718867b9
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 15 02:16:20 2018 +0000
Update translations for tails-iuk
---
pt_BR.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/pt_BR.po b/pt_BR.po
index a5c4aec96..17b034910 100644
--- a/pt_BR.po
+++ b/pt_BR.po
@@ -14,7 +14,7 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: Tails developers <tails(a)boum.org>\n"
"POT-Creation-Date: 2018-12-09 13:56+0100\n"
-"PO-Revision-Date: 2018-12-15 01:45+0000\n"
+"PO-Revision-Date: 2018-12-15 01:58+0000\n"
"Last-Translator: Communia <ameaneantie(a)riseup.net>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/torproject/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -113,7 +113,7 @@ msgid ""
"Download size: %{size}s\n"
"\n"
"Do you want to upgrade now?"
-msgstr ""
+msgstr "Você deve atualizar até %{name}s %{version}s \n\nPara mais informações sobre essa nova versão, consulte %{details_url}s\n\nRecomendamos que você feche todas as outras aplicações durante a atualização\nO download da atualização pode levar um tempo bastante longo, entre alguns minutos e algumas horas.\n\nTamanho do download: %{size}s\n\nVocê deseja atualizar agora?"
#: ../lib/Tails/IUK/Frontend.pm:386
msgid "Upgrade available"
@@ -205,7 +205,7 @@ msgstr "A versão atualizada foi baixada com sucesso"
#: ../lib/Tails/IUK/Frontend.pm:614
msgid "Apply upgrade"
-msgstr ""
+msgstr "Instalar a atualização"
#: ../lib/Tails/IUK/Frontend.pm:621
msgid ""
1
0