[or-cvs] when we haven"t fetched a directory yet, or the last time we

Roger Dingledine arma at seul.org
Fri Jan 7 15:58:00 UTC 2005


Update of /home2/or/cvsroot/tor/src/or
In directory moria.mit.edu:/home2/arma/work/onion/cvs/tor/src/or

Modified Files:
	circuituse.c directory.c main.c or.h 
Log Message:
when we haven't fetched a directory yet, or the last time we
tried they were all unreachable, assume we are not connected to
the network.

when an application request comes in during this state, be
optimistic and assume we just reconnected. fetch a new directory
and if it works, begin making circuits.


Index: circuituse.c
===================================================================
RCS file: /home2/or/cvsroot/tor/src/or/circuituse.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- circuituse.c	13 Dec 2004 00:44:38 -0000	1.38
+++ circuituse.c	7 Jan 2005 15:57:57 -0000	1.39
@@ -717,6 +717,18 @@
     return 1; /* we're happy */
   }
 
+  if (!has_fetched_directory) {
+    if (!connection_get_by_type(CONN_TYPE_DIR)) {
+      log_fn(LOG_NOTICE,"Application request when we're believed to be offline. Optimistically trying again.");
+      directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 1);
+    }
+    /* the stream will be dealt with when has_fetched_directory becomes
+     * 1, or when all directory attempts fail and directory_all_unreachable()
+     * kills it.
+     */
+    return 0;
+  }
+
   /* Do we need to check exit policy? */
   if (!is_resolve && !connection_edge_is_rendezvous_stream(conn)) {
     addr = client_dns_lookup_entry(conn->socks_request->address);

Index: directory.c
===================================================================
RCS file: /home2/or/cvsroot/tor/src/or/directory.c,v
retrieving revision 1.189
retrieving revision 1.190
diff -u -d -r1.189 -r1.190
--- directory.c	6 Jan 2005 21:03:27 -0000	1.189
+++ directory.c	7 Jan 2005 15:57:57 -0000	1.190
@@ -184,7 +184,8 @@
   else if (ds)
     directory_initiate_command_trusted_dir(ds, purpose, resource, NULL, 0);
   else {
-    log_fn(LOG_WARN,"No running dirservers known. Not trying. (purpose %d)", purpose);
+    log_fn(LOG_NOTICE,"No running dirservers known. Not trying. (purpose %d)", purpose);
+    directory_all_unreachable(time(NULL)); /* remember we tried them all and failed. */
   }
 }
 

Index: main.c
===================================================================
RCS file: /home2/or/cvsroot/tor/src/or/main.c,v
retrieving revision 1.415
retrieving revision 1.416
diff -u -d -r1.415 -r1.416
--- main.c	6 Jan 2005 19:20:54 -0000	1.415
+++ main.c	7 Jan 2005 15:57:57 -0000	1.416
@@ -402,6 +402,25 @@
   }
 }
 
+/** We've just tried every dirserver we know about, and none of
+ * them were reachable. Assume the network is down. Change state
+ * so next time an application connection arrives we'll delay it
+ * and try another directory fetch. Kill off all the circuit_wait
+ * streams that are waiting now, since they will all timeout anyway.
+ */
+void directory_all_unreachable(time_t now) {
+  connection_t *conn;
+
+  has_fetched_directory=0;
+
+  while ((conn = connection_get_by_type_state(CONN_TYPE_AP,
+                                              AP_CONN_STATE_CIRCUIT_WAIT))) {
+    conn->has_sent_end = 1; /* it's not connected anywhere, so no need to end */
+    log_fn(LOG_NOTICE,"Network down? Failing connection to '%s'.", conn->address);
+    connection_mark_for_close(conn);
+  }
+}
+
 /** This function is called whenever we successfully pull down a directory */
 void directory_has_arrived(time_t now) {
   or_options_t *options = get_options();

Index: or.h
===================================================================
RCS file: /home2/or/cvsroot/tor/src/or/or.h,v
retrieving revision 1.520
retrieving revision 1.521
diff -u -d -r1.520 -r1.521
--- or.h	6 Jan 2005 21:03:27 -0000	1.520
+++ or.h	7 Jan 2005 15:57:57 -0000	1.521
@@ -1382,7 +1382,9 @@
 void connection_stop_writing(connection_t *conn);
 void connection_start_writing(connection_t *conn);
 
+void directory_all_unreachable(time_t now);
 void directory_has_arrived(time_t now);
+
 int authdir_mode(or_options_t *options);
 int clique_mode(or_options_t *options);
 int server_mode(or_options_t *options);



More information about the tor-commits mailing list