[or-cvs] Make give-up-on-failure actually work: it seems the servers...

Nick Mathewson nickm at seul.org
Sun Sep 18 04:15:42 UTC 2005


Update of /home/or/cvsroot/tor/src/or
In directory moria:/tmp/cvs-serv10874/src/or

Modified Files:
	directory.c or.h routerlist.c 
Log Message:
Make give-up-on-failure actually work: it seems the servers gave me a real test case.

Index: directory.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/directory.c,v
retrieving revision 1.284
retrieving revision 1.285
diff -u -d -r1.284 -r1.285
--- directory.c	18 Sep 2005 02:51:12 -0000	1.284
+++ directory.c	18 Sep 2005 04:15:39 -0000	1.285
@@ -973,22 +973,27 @@
     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 @@
 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;

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/or.h,v
retrieving revision 1.691
retrieving revision 1.692
diff -u -d -r1.691 -r1.692
--- or.h	18 Sep 2005 02:51:12 -0000	1.691
+++ or.h	18 Sep 2005 04:15:39 -0000	1.692
@@ -805,8 +805,8 @@
                                 * 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 {

Index: routerlist.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/routerlist.c,v
retrieving revision 1.302
retrieving revision 1.303
diff -u -d -r1.302 -r1.303
--- routerlist.c	18 Sep 2005 02:51:12 -0000	1.302
+++ routerlist.c	18 Sep 2005 04:15:39 -0000	1.303
@@ -2253,8 +2253,7 @@
         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 @@
     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);



More information about the tor-commits mailing list