Commit 28303296 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Make give-up-on-failure actually work: it seems the servers gave me a real test case.


svn:r5091
parent d118d506
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -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 (conn->requested_resource &&
        !strcmpstart(conn->requested_resource,"fp/")) {
      which = smartlist_create();
      dir_split_resource_into_fingerprints(conn->requested_resource+3,
                                           which, NULL);
      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;
      }
    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);
    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;
+2 −2
Original line number Diff line number Diff line
@@ -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 {
+5 −2
Original line number Diff line number Diff line
@@ -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);