summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2005-09-18 04:15:39 +0000
committerNick Mathewson <nickm@torproject.org>2005-09-18 04:15:39 +0000
commit283032960d8c94b054997cd8db31aaca2c86eaad (patch)
treecfd3601ee2a063c423e7507ee28eb2c657120244 /src
parentd118d5069a183574c8d03a7e9e5559e47a9ddaa4 (diff)
downloadtor-283032960d8c94b054997cd8db31aaca2c86eaad.tar.gz
tor-283032960d8c94b054997cd8db31aaca2c86eaad.zip
Make give-up-on-failure actually work: it seems the servers gave me a real test case.
svn:r5091
Diffstat (limited to 'src')
-rw-r--r--src/or/directory.c30
-rw-r--r--src/or/or.h4
-rw-r--r--src/or/routerlist.c7
3 files changed, 26 insertions, 15 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index 3bf2cf857d..946557ab9f 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -973,22 +973,27 @@ connection_dir_client_reached_eof(connection_t *conn)
int n_asked_for = 0;
log_fn(LOG_INFO,"Received server info (size %d) from server '%s:%d'",
(int)body_len, conn->address, conn->port);
- if (status_code != 200) {
- log_fn(LOG_WARN,"Received http status code %d (\"%s\") from server '%s:%d' while fetching \"/tor/server/%s\". I'll try again soon.",
- status_code, reason, conn->address, conn->port,
- conn->requested_resource);
- tor_free(body); tor_free(headers); tor_free(reason);
- connection_dir_download_routerdesc_failed(conn);
- return -1;
- }
if (conn->requested_resource &&
!strcmpstart(conn->requested_resource,"fp/")) {
which = smartlist_create();
dir_split_resource_into_fingerprints(conn->requested_resource+3,
which, NULL);
- }
- if (which)
n_asked_for = smartlist_len(which);
+ }
+ if (status_code != 200) {
+ log_fn(LOG_WARN,"Received http status code %d (\"%s\") from server '%s:%d' while fetching \"/tor/server/%s\". I'll try again soon.",
+ status_code, reason, conn->address, conn->port,
+ conn->requested_resource);
+ tor_free(body); tor_free(headers); tor_free(reason);
+ if (!which) {
+ connection_dir_download_routerdesc_failed(conn);
+ } else {
+ dir_routerdesc_download_failed(which);
+ SMARTLIST_FOREACH(which, char *, cp, tor_free(cp));
+ smartlist_free(which);
+ return -1;
+ }
+ }
router_load_routers_from_string(body, 0, which);
directory_info_has_arrived(time(NULL),0);
if (which) {
@@ -1548,9 +1553,12 @@ dir_networkstatus_download_failed(smartlist_t *failed)
static void
dir_routerdesc_download_failed(smartlist_t *failed)
{
+ char digest[DIGEST_LEN];
+ routerstatus_t *rs;
SMARTLIST_FOREACH(failed, const char *, cp,
{
- routerstatus_t *rs = router_get_combined_status_by_digest(cp);
+ base16_decode(digest, DIGEST_LEN, cp, strlen(cp));
+ rs = router_get_combined_status_by_digest(digest);
if (!rs || rs->n_download_failures >= MAX_ROUTERDESC_DOWNLOAD_FAILURES)
continue;
++rs->n_download_failures;
diff --git a/src/or/or.h b/src/or/or.h
index a710df06ae..258941c3cc 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -805,8 +805,8 @@ typedef struct routerstatus_t {
* recent descriptor. */
} routerstatus_t;
-/*XXXX001 make this configurable! */
-#define MAX_ROUTERDESC_DOWNLOAD_FAILURES 16
+/*XXXX011 make this configurable? */
+#define MAX_ROUTERDESC_DOWNLOAD_FAILURES 8
/** Contents of a (v2 or later) network status object. */
typedef struct networkstatus_t {
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index e4d4f2d92f..8c5f445c0d 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -2253,8 +2253,7 @@ router_list_downloadable(void)
continue;
}
/*XXXX001 reset max_routerdesc_download_failures somewhere! */
- if (rs->n_download_failures >= MAX_ROUTERDESC_DOWNLOAD_FAILURES ||
- !memcmp(ri->signed_descriptor_digest,rs->descriptor_digest,DIGEST_LEN)||
+ if (!memcmp(ri->signed_descriptor_digest,rs->descriptor_digest,DIGEST_LEN)||
rs->published_on <= ri->published_on) {
/* Same digest, or earlier. No need to download it. */
// log_fn(LOG_NOTICE, "Up-to-date status for %s", fp);
@@ -2284,7 +2283,11 @@ router_list_downloadable(void)
const char *key;
void *val;
strmap_iter_get(iter, &key, &val);
+ rs = val;
+ if (rs->n_download_failures >= MAX_ROUTERDESC_DOWNLOAD_FAILURES)
+ continue;
smartlist_add(superseded, tor_strdup(key));
+ log_fn(LOG_NOTICE, "!!!!%d", ((routerstatus_t*)val)->n_download_failures);
}
strmap_free(status_map, NULL);