[or-cvs] Use a digestmap_t to speed up router_get_by_digest, which w...
Nick Mathewson
nickm at seul.org
Tue Oct 18 20:13:11 UTC 2005
Update of /home/or/cvsroot/tor/src/or
In directory moria:/tmp/cvs-serv3180/src/or
Modified Files:
routerlist.c
Log Message:
Use a digestmap_t to speed up router_get_by_digest, which was previously a bottleneck (~~27% CPU)
Index: routerlist.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/routerlist.c,v
retrieving revision 1.342
retrieving revision 1.343
diff -u -d -r1.342 -r1.343
--- routerlist.c 18 Oct 2005 17:43:54 -0000 1.342
+++ routerlist.c 18 Oct 2005 20:13:09 -0000 1.343
@@ -36,6 +36,7 @@
static void update_networkstatus_client_downloads(time_t now);
static int routerdesc_digest_is_recognized(const char *identity,
const char *digest);
+static void routerlist_assert_ok(routerlist_t *rl);
/****************************************************************************/
@@ -254,9 +255,8 @@
struct stat st;
int j;
- if (!routerlist) {
+ if (!routerlist)
router_get_routerlist();
- }
router_journal_len = router_store_len = 0;
@@ -995,16 +995,11 @@
if (!routerlist) return NULL;
- SMARTLIST_FOREACH(routerlist->routers, routerinfo_t*, router,
- {
- if (0 == memcmp(router->identity_digest, digest, DIGEST_LEN))
- return router;
- });
+ // routerlist_assert_ok(routerlist);
- return NULL;
+ return digestmap_get(routerlist->identity_map, digest);
}
-
/** Return the router in our routerlist whose 20-byte descriptor
* is <b>digest</b>. Return NULL if no such router is known. */
routerinfo_t *
@@ -1030,6 +1025,7 @@
if (!routerlist) {
routerlist = tor_malloc_zero(sizeof(routerlist_t));
routerlist->routers = smartlist_create();
+ routerlist->identity_map = digestmap_new();
}
return routerlist;
}
@@ -1098,6 +1094,7 @@
routerlist_free(routerlist_t *rl)
{
tor_assert(rl);
+ digestmap_free(rl->identity_map, NULL);
SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
routerinfo_free(r));
smartlist_free(rl->routers);
@@ -1109,7 +1106,9 @@
static void
routerlist_insert(routerlist_t *rl, routerinfo_t *ri)
{
+ digestmap_set(rl->identity_map, ri->identity_digest, ri);
smartlist_add(rl->routers, ri);
+ // routerlist_assert_ok(rl);
}
/** Remove an item <b>ri</b> into the routerlist <b>rl</b>, updating indices
@@ -1120,6 +1119,7 @@
void
routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int idx)
{
+ routerinfo_t *ri_tmp;
if (idx < 0 || smartlist_get(rl->routers, idx) != ri) {
idx = -1;
SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
@@ -1131,6 +1131,9 @@
return;
}
smartlist_del(rl->routers, idx);
+ ri_tmp = digestmap_remove(rl->identity_map, ri->identity_digest);
+ tor_assert(ri_tmp == ri);
+ // routerlist_assert_ok(rl);
}
/** Free all memory held by the rouerlist module */
@@ -1277,10 +1280,8 @@
tor_assert(msg);
- if (!routerlist) {
- routerlist = tor_malloc_zero(sizeof(routerlist_t));
- routerlist->routers = smartlist_create();
- }
+ if (!routerlist)
+ router_get_routerlist();
crypto_pk_get_digest(router->identity_pkey, id_digest);
@@ -1686,7 +1687,9 @@
networkstatus_list_update_recent(now);
if (get_options()->DirPort && !skewed)
- dirserv_set_cached_networkstatus_v2(s, fp, ns->published_on);
+ dirserv_set_cached_networkstatus_v2(s,
+ ns->identity_digest,
+ ns->published_on);
return 0;
}
@@ -1717,9 +1720,7 @@
}
tor_free(fname);
if (get_options()->DirPort) {
- char fp[HEX_DIGEST_LEN+1];
- base16_encode(fp, sizeof(fp), ns->identity_digest, DIGEST_LEN);
- dirserv_set_cached_networkstatus_v2(NULL, fp, 0);
+ dirserv_set_cached_networkstatus_v2(NULL, ns->identity_digest, 0);
}
networkstatus_free(ns);
}
@@ -2969,3 +2970,27 @@
return 1;
}
+static void
+routerlist_assert_ok(routerlist_t *rl)
+{
+ digestmap_iter_t *iter;
+ if (!routerlist)
+ return;
+ SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
+ {
+ routerinfo_t *r2 = digestmap_get(rl->identity_map,
+ r->identity_digest);
+ tor_assert(r == r2);
+ });
+ iter = digestmap_iter_init(rl->identity_map);
+ while (!digestmap_iter_done(iter)) {
+ const char *d;
+ void *_r;
+ routerinfo_t *r;
+ digestmap_iter_get(iter, &d, &_r);
+ r = _r;
+ tor_assert(!memcmp(r->identity_digest, d, DIGEST_LEN));
+ iter = digestmap_iter_next(rl->identity_map, iter);
+ }
+}
+
More information about the tor-commits
mailing list