[or-cvs] r9523: Fix several bugs in computing recommended versions. 1) refac (in tor/trunk: . doc/spec src/or)
nickm at seul.org
nickm at seul.org
Thu Feb 8 07:24:10 UTC 2007
Author: nickm
Date: 2007-02-08 02:24:06 -0500 (Thu, 08 Feb 2007)
New Revision: 9523
Modified:
tor/trunk/
tor/trunk/ChangeLog
tor/trunk/doc/spec/path-spec.txt
tor/trunk/src/or/or.h
tor/trunk/src/or/routerlist.c
tor/trunk/src/or/routerparse.c
Log:
r11700 at catbus: nickm | 2007-02-08 02:03:50 -0500
Fix several bugs in computing recommended versions. 1) refactor is-this-version-good handling and which-vesions-are-good handling to be in the same place. 2) a version is recommended if more than half of the versioning authorities like it, not >= half. 3) "NEW_IN_SERIES" should mean, "I don't know of an 0.1.1.x this recent, and there are some 0.1.2.x versions out", not "I don't know of an 0.1.1.x this recent, but I know some older ones." This should resolve bug 383.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r11700] on 8246c3cf-6607-4228-993b-4d95d33730f1
Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog 2007-02-08 07:23:54 UTC (rev 9522)
+++ tor/trunk/ChangeLog 2007-02-08 07:24:06 UTC (rev 9523)
@@ -11,6 +11,9 @@
- Report events where a resolve succeeded or where we got a socks
protocol error correctly, rather than calling both of them "INTERNAL".
+ o Minor bugfixes (other)
+ - Display correct results when reporting which versions are recommended,
+ and how recommended they are. (Resolves bug 383.)
Changes in version 0.1.2.7-alpha - 2007-02-06
o Major bugfixes (rate limiting):
Modified: tor/trunk/doc/spec/path-spec.txt
===================================================================
--- tor/trunk/doc/spec/path-spec.txt 2007-02-08 07:23:54 UTC (rev 9522)
+++ tor/trunk/doc/spec/path-spec.txt 2007-02-08 07:24:06 UTC (rev 9523)
@@ -124,8 +124,9 @@
Tor servers test reachability of their ORPort on start and whenever
their IP address changes.
- XXXX
+ [XXXX arma: write this.]
+
2.1.4. Hidden-service circuits
See section 4 below.
Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h 2007-02-08 07:23:54 UTC (rev 9522)
+++ tor/trunk/src/or/or.h 2007-02-08 07:24:06 UTC (rev 9523)
@@ -2984,7 +2984,8 @@
VS_OLD=1, /**< This version is older than any recommended version. */
VS_NEW=2, /**< This version is newer than any recommended version. */
VS_NEW_IN_SERIES=3, /**< This version is newer than any recommended version
- * in its series, and such recommended versions exist. */
+ * in its series, but later recommended versions exist.
+ */
VS_UNRECOMMENDED=4 /**< This version is not recommended (general case) */
} version_status_t;
Modified: tor/trunk/src/or/routerlist.c
===================================================================
--- tor/trunk/src/or/routerlist.c 2007-02-08 07:23:54 UTC (rev 9522)
+++ tor/trunk/src/or/routerlist.c 2007-02-08 07:24:06 UTC (rev 9523)
@@ -3029,27 +3029,48 @@
* our server is broken, invalid, obsolete, etc. */
#define SELF_OPINION_INTERVAL (90*60)
+/** Result of checking whether a version is recommended. */
+typedef struct combined_version_status_t {
+ /** How many networkstatuses claim to know about versions? */
+ int n_versioning;
+ /** What do the majority of networkstatuses believe about this version? */
+ version_status_t consensus;
+ /** How many networkstatuses constitute the majority? */
+ int n_concurring;
+} combined_version_status_t;
+
/** Return a string naming the versions of Tor recommended by
* more than half the versioning networkstatuses. */
static char *
-compute_recommended_versions(time_t now, int client)
+compute_recommended_versions(time_t now, int client,
+ const char *my_version,
+ combined_version_status_t *status_out)
{
int n_seen;
char *current;
smartlist_t *combined, *recommended;
- int n_versioning;
+ int n_versioning, n_recommending;
char *result;
- (void) now; /* right now, we consider *all* ors. */
+ /** holds the compromise status taken among all non-recommending
+ * authorities */
+ version_status_t consensus = VS_RECOMMENDED;
+ (void) now; /* right now, we consider *all* statuses, regardless of age. */
+ tor_assert(my_version);
+ tor_assert(status_out);
+
+ memset(status_out, 0, sizeof(combined_version_status_t));
+
if (!networkstatus_list)
return tor_strdup("<none>");
combined = smartlist_create();
- n_versioning = 0;
+ n_versioning = n_recommending = 0;
SMARTLIST_FOREACH(networkstatus_list, networkstatus_t *, ns,
{
const char *vers;
smartlist_t *versions;
+ version_status_t status;
if (! ns->recommends_versions)
continue;
n_versioning++;
@@ -3062,6 +3083,12 @@
sort_version_list(versions, 1);
smartlist_add_all(combined, versions);
smartlist_free(versions);
+
+ /* now, check _our_ version */
+ status = tor_version_is_obsolete(my_version, vers);
+ if (status == VS_RECOMMENDED)
+ n_recommending++;
+ consensus = version_status_join(status, consensus);
});
sort_version_list(combined, 0);
@@ -3074,13 +3101,13 @@
if (current && !strcmp(cp, current)) {
++n_seen;
} else {
- if (n_seen >= n_versioning/2 && current)
+ if (n_seen > n_versioning/2 && current)
smartlist_add(recommended, current);
n_seen = 0;
current = cp;
}
});
- if (n_seen >= n_versioning/2 && current)
+ if (n_seen > n_versioning/2 && current)
smartlist_add(recommended, current);
result = smartlist_join_strings(recommended, ", ", 0, NULL);
@@ -3089,6 +3116,15 @@
smartlist_free(combined);
smartlist_free(recommended);
+ status_out->n_versioning = n_versioning;
+ if (n_recommending > n_versioning/2) {
+ status_out->consensus = VS_RECOMMENDED;
+ status_out->n_concurring = n_recommending;
+ } else {
+ status_out->consensus = consensus;
+ status_out->n_concurring = n_versioning - n_recommending;
+ }
+
return result;
}
@@ -3154,64 +3190,50 @@
entry_guards_compute_status();
if (!have_warned_about_old_version &&
- have_tried_downloading_all_statuses(4)) {
- int n_versioning = 0;
- int n_recommended = 0;
+ have_tried_downloading_all_statuses(4)) { /*XXXX012This 4 is too magic.*/
+ combined_version_status_t st;
int is_server = server_mode(get_options());
- version_status_t consensus = VS_RECOMMENDED;
- SMARTLIST_FOREACH(networkstatus_list, networkstatus_t *, ns,
- {
- version_status_t vs;
- if (!ns->recommends_versions)
- continue;
- vs = tor_version_is_obsolete(
- VERSION, is_server ? ns->server_versions : ns->client_versions);
- if (vs == VS_RECOMMENDED)
- ++n_recommended;
- if (n_versioning++ == 0) {
- consensus = vs;
- } else if (consensus != vs) {
- consensus = version_status_join(consensus, vs);
- }
- });
- if (n_versioning && n_recommended <= n_versioning/2) {
- if (consensus == VS_NEW || consensus == VS_NEW_IN_SERIES) {
+ char *recommended;
+
+ recommended = compute_recommended_versions(now, !is_server, VERSION, &st);
+
+ if (st.n_versioning) {
+ if (st.consensus == VS_RECOMMENDED) {
+ log_info(LD_GENERAL, "%d/%d statements from version-listing "
+ "directory authorities say my version is ok.",
+ st.n_concurring, st.n_versioning);
+ } else if (st.consensus == VS_NEW || st.consensus == VS_NEW_IN_SERIES) {
if (!have_warned_about_new_version) {
- char *rec = compute_recommended_versions(now, !is_server);
log_notice(LD_GENERAL, "This version of Tor (%s) is newer than any "
- "recommended version%s, according to %d/%d network "
- "statuses. Versions recommended by more than %d "
+ "recommended version%s, according to %d/%d version-listing "
+ "network statuses. Versions recommended by more than %d "
"authorit%s are: %s",
VERSION,
- consensus == VS_NEW_IN_SERIES ? " in its series" : "",
- n_versioning-n_recommended, n_versioning, n_versioning/2,
- n_versioning/2 > 1 ? "ies" : "y", rec);
+ st.consensus == VS_NEW_IN_SERIES ? " in its series" : "",
+ st.n_concurring, st.n_versioning, st.n_versioning/2,
+ st.n_versioning/2 > 1 ? "ies" : "y", recommended);
have_warned_about_new_version = 1;
control_event_general_status(LOG_WARN, "DANGEROUS_VERSION "
"CURRENT=%s REASON=%s RECOMMENDED=\"%s\"",
- VERSION, "NEW", rec);
- tor_free(rec);
+ VERSION, "NEW", recommended);
}
} else {
- char *rec = compute_recommended_versions(now, !is_server);
log_warn(LD_GENERAL, "Please upgrade! "
- "This version of Tor (%s) is %s, according to "
- "%d/%d network statuses. Versions recommended by "
+ "This version of Tor (%s) is %s, according to %d/%d version-"
+ "listing network statuses. Versions recommended by "
"at least %d authorit%s are: %s",
- VERSION, consensus == VS_OLD ? "obsolete" : "not recommended",
- n_versioning-n_recommended, n_versioning, n_versioning/2,
- n_versioning/2 > 1 ? "ies" : "y", rec);
+ VERSION,
+ st.consensus == VS_OLD ? "obsolete" : "not recommended",
+ st.n_concurring, st.n_versioning, st.n_versioning/2,
+ st.n_versioning/2 > 1 ? "ies" : "y", recommended);
have_warned_about_old_version = 1;
control_event_general_status(LOG_WARN, "DANGEROUS_VERSION "
"CURRENT=%s REASON=%s RECOMMENDED=\"%s\"",
- VERSION, consensus == VS_OLD ? "OLD" : "UNRECOMMENDED", rec);
- tor_free(rec);
+ VERSION, st.consensus == VS_OLD ? "OLD" : "UNRECOMMENDED",
+ recommended);
}
- } else {
- log_info(LD_GENERAL, "%d/%d statements from "
- "directory authorities say my version is ok.",
- n_recommended, n_versioning);
}
+ tor_free(recommended);
}
routerstatus_list_has_changed = 0;
Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c 2007-02-08 07:23:54 UTC (rev 9522)
+++ tor/trunk/src/or/routerparse.c 2007-02-08 07:24:06 UTC (rev 9523)
@@ -308,7 +308,7 @@
});
/* We didn't find the listed version. Is it new or old? */
- if (found_any_in_series && !found_newer_in_series) {
+ if (found_any_in_series && !found_newer_in_series && found_newer) {
ret = VS_NEW_IN_SERIES;
} else if (found_newer && !found_older) {
ret = VS_OLD;
More information about the tor-commits
mailing list