From 4f2d5565087a05dce8eb8d2366d74f4c0726c501 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Wed, 3 Dec 2003 10:39:27 +0000 Subject: choose randomly from running dirservers, not always the first one svn:r881 --- src/or/routers.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/or/routers.c b/src/or/routers.c index 6d159016c..1c83120c1 100644 --- a/src/or/routers.c +++ b/src/or/routers.c @@ -50,31 +50,48 @@ void router_retry_connections(void) { } routerinfo_t *router_pick_directory_server(void) { - /* pick the first running router with a positive dir_port */ - int i; + /* pick a random running router with a positive dir_port */ + int i,j; routerinfo_t *router, *dirserver=NULL; - + int num_dirservers=0; + if(!directory) return NULL; for(i=0;in_routers;i++) { router = directory->routers[i]; if(router->dir_port > 0 && router->is_running) - return router; + num_dirservers++; + } + + if(!num_dirservers) { + log_fn(LOG_INFO,"No dirservers are reachable. Trying them all again."); + /* no running dir servers found? go through and mark them all as up, + * and we'll cycle through the list again. */ + for(i=0;in_routers;i++) { + router = directory->routers[i]; + if(router->dir_port > 0) { + router->is_running = 1; + dirserver = router; + } + } + return dirserver; } - log_fn(LOG_INFO,"No dirservers are reachable. Trying them all again."); - /* no running dir servers found? go through and mark them all as up, - * and we'll cycle through the list again. */ - for(i=0;in_routers;i++) { + j = crypto_pseudo_rand_int(num_dirservers); + for (i=0;in_routers;i++) { router = directory->routers[i]; - if(router->dir_port > 0) { - router->is_running = 1; - dirserver = router; + if (router->dir_port > 0 && router->is_running) { + if (j) + --j; + else { + log_fn(LOG_DEBUG, "Chose server '%s'", router->nickname); + return router; + } } } - - return dirserver; + assert(0); + return NULL; } routerinfo_t *router_pick_randomly_from_running(void) { -- cgit v1.2.3