Commit 75d85c82 authored by Nick Mathewson's avatar Nick Mathewson 🦞
Browse files

On directory servers, old_routers was wasting hundreds of bytes per superseded...

On directory servers, old_routers was wasting hundreds of bytes per superseded router descriptor.  Roll the signed descriptor info and identifying info into a cache_info struct, and use only that for old_routers.


svn:r5349
parent 757def59
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -179,20 +179,20 @@ circuit_rep_hist_note_result(circuit_t *circ)
  if (server_mode(get_options())) {
    routerinfo_t *me = router_get_my_routerinfo();
    tor_assert(me);
    prev_digest = me->identity_digest;
    prev_digest = me->cache_info.identity_digest;
  }
  do {
    router = router_get_by_digest(hop->extend_info->identity_digest);
    if (router) {
      if (prev_digest) {
        if (hop->state == CPATH_STATE_OPEN)
          rep_hist_note_extend_succeeded(prev_digest, router->identity_digest);
          rep_hist_note_extend_succeeded(prev_digest, router->cache_info.identity_digest);
        else {
          rep_hist_note_extend_failed(prev_digest, router->identity_digest);
          rep_hist_note_extend_failed(prev_digest, router->cache_info.identity_digest);
          break;
        }
      }
      prev_digest = router->identity_digest;
      prev_digest = router->cache_info.identity_digest;
    } else {
      prev_digest = NULL;
    }
@@ -1567,7 +1567,7 @@ extend_info_from_router(routerinfo_t *r)
  tor_assert(r);
  info = tor_malloc_zero(sizeof(extend_info_t));
  strlcpy(info->nickname, r->nickname, sizeof(info->nickname));
  memcpy(info->identity_digest, r->identity_digest, DIGEST_LEN);
  memcpy(info->identity_digest, r->cache_info.identity_digest, DIGEST_LEN);
  info->onion_key = crypto_pk_dup_key(r->onion_pkey);
  info->addr = r->addr;
  info->port = r->or_port;
@@ -1656,7 +1656,7 @@ pick_helper_nodes(void)
    /* XXXX Downgrade this to info before release. NM */
    notice(LD_CIRC, "Chose '%s' as helper node.", entry->nickname);
    strlcpy(helper->nickname, entry->nickname, sizeof(helper->nickname));
    memcpy(helper->identity, entry->identity_digest, DIGEST_LEN);
    memcpy(helper->identity, entry->cache_info.identity_digest, DIGEST_LEN);
    smartlist_add(helper_nodes, helper);
    changed = 1;
  }
+1 −1
Original line number Diff line number Diff line
@@ -1066,7 +1066,7 @@ connection_ap_handshake_process_socks(connection_t *conn)
          /* use the hex digest, not nickname, in case there are two
             routers with this nickname */
          conn->chosen_exit_name =
            tor_strdup(hex_str(r->identity_digest, DIGEST_LEN));
            tor_strdup(hex_str(r->cache_info.identity_digest, DIGEST_LEN));
        }
      }

+2 −2
Original line number Diff line number Diff line
@@ -326,7 +326,7 @@ connection_or_connect(uint32_t addr, uint16_t port, const char *id_digest)
  tor_assert(id_digest);

  if (server_mode(options) && (me=router_get_my_routerinfo()) &&
      !memcmp(me->identity_digest, id_digest,DIGEST_LEN)) {
      router_digest_is_me(id_digest)) {
    info(LD_PROTOCOL,"Client asked me to connect to myself. Refusing.");
    return NULL;
  }
@@ -500,7 +500,7 @@ connection_or_check_valid_handshake(connection_t *conn, char *digest_rcvd)
  router = router_get_by_nickname(nickname, 0);
  if (router && /* we know this nickname */
      router->is_named && /* make sure it's the right guy */
      memcmp(digest_rcvd, router->identity_digest, DIGEST_LEN) != 0) {
      memcmp(digest_rcvd, router->cache_info.identity_digest,DIGEST_LEN) !=0) {
    log_fn(severity, LD_OR,
           "Identity key not as expected for router claiming to be '%s' (%s:%d)",
           nickname, conn->address, conn->port);
+5 −5
Original line number Diff line number Diff line
@@ -1255,12 +1255,12 @@ handle_getinfo_helper(const char *question, char **answer)
    *answer = list_getinfo_options();
  } else if (!strcmpstart(question, "desc/id/")) {
    routerinfo_t *ri = router_get_by_hexdigest(question+strlen("desc/id/"));
    if (ri && ri->signed_descriptor)
      *answer = tor_strdup(ri->signed_descriptor);
    if (ri && ri->cache_info.signed_descriptor)
      *answer = tor_strdup(ri->cache_info.signed_descriptor);
  } else if (!strcmpstart(question, "desc/name/")) {
    routerinfo_t *ri = router_get_by_nickname(question+strlen("desc/name/"),1);
    if (ri && ri->signed_descriptor)
      *answer = tor_strdup(ri->signed_descriptor);
    if (ri && ri->cache_info.signed_descriptor)
      *answer = tor_strdup(ri->cache_info.signed_descriptor);
  } else if (!strcmpstart(question, "unregistered-servers-")) {
    *answer = dirserver_getinfo_unregistered(question +
                                             strlen("unregistered-servers-"));
@@ -2557,7 +2557,7 @@ control_event_descriptors_changed(smartlist_t *routers)
  identities = smartlist_create();
  SMARTLIST_FOREACH(routers, routerinfo_t *, r,
  {
    base16_encode(buf,sizeof(buf),r->identity_digest,DIGEST_LEN);
    base16_encode(buf,sizeof(buf),r->cache_info.identity_digest,DIGEST_LEN);
    smartlist_add(identities, tor_strdup(buf));
  });
  if (EVENT_IS_INTERESTING0(EVENT_NEW_DESC)) {
+7 −7
Original line number Diff line number Diff line
@@ -250,7 +250,7 @@ directory_initiate_command_router(routerinfo_t *router, uint8_t purpose,
                                  const char *payload, size_t payload_len)
{
  directory_initiate_command(router->address, router->addr, router->dir_port,
                             router->platform, router->identity_digest,
                         router->platform, router->cache_info.identity_digest,
                         purpose, private_connection, resource,
                         payload, payload_len);
}
@@ -1043,7 +1043,7 @@ connection_dir_client_reached_eof(connection_t *conn)
      /* this might have been a dirport reachability test. see if it is. */
      routerinfo_t *me = router_get_my_routerinfo();
      if (me &&
          !memcmp(me->identity_digest, conn->identity_digest, DIGEST_LEN) &&
          router_digest_is_me(conn->identity_digest) &&
          me->addr == conn->addr &&
          me->dir_port == conn->port)
        router_dirport_found_reachable();
@@ -1340,14 +1340,14 @@ directory_handle_command_get(connection_t *conn, char *headers,
    else {
      size_t len = 0;
      format_rfc1123_time(date, time(NULL));
      SMARTLIST_FOREACH(descs, routerinfo_t *, ri,
      SMARTLIST_FOREACH(descs, signed_descriptor_t *, ri,
                        len += ri->signed_descriptor_len);
      if (deflated) {
        size_t compressed_len;
        char *compressed;
        char *inp = tor_malloc(len+smartlist_len(descs)+1);
        char *cp = inp;
        SMARTLIST_FOREACH(descs, routerinfo_t *, ri,
        SMARTLIST_FOREACH(descs, signed_descriptor_t *, ri,
           {
             memcpy(cp, ri->signed_descriptor,
                    ri->signed_descriptor_len);
@@ -1375,7 +1375,7 @@ directory_handle_command_get(connection_t *conn, char *headers,
                     date,
                     (int)len);
        connection_write_to_buf(tmp, strlen(tmp), conn);
        SMARTLIST_FOREACH(descs, routerinfo_t *, ri,
        SMARTLIST_FOREACH(descs, signed_descriptor_t *, ri,
                          connection_write_to_buf(ri->signed_descriptor,
                                                  ri->signed_descriptor_len,
                                                  conn));
Loading