[or-cvs] Every 60 seconds, check whether the listeners are still ali...

Nick Mathewson nickm at seul.org
Sun Oct 24 01:22:42 UTC 2004


Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv13035/src/or

Modified Files:
	connection.c main.c or.h 
Log Message:
Every 60 seconds, check whether the listeners are still alive, and relaunch the dead ones.

Index: connection.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection.c,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -d -r1.267 -r1.268
--- connection.c	24 Oct 2004 00:55:18 -0000	1.267
+++ connection.c	24 Oct 2004 01:22:40 -0000	1.268
@@ -553,12 +553,47 @@
 }
 
 static int retry_listeners(int type, struct config_line_t *cfg,
-                           int port_option, const char *default_addr)
+                           int port_option, const char *default_addr,
+                           int force)
 {
+  if (!force) {
+    int want, have, n_conn, i;
+    struct config_line_t *c;
+    connection_t *conn;
+    connection_t **carray;
+    /* How many should there be? */
+    if (cfg && port_option) {
+      want = 0;
+      for (c = cfg; c; c = c->next)
+        ++want;
+    } else if (port_option) {
+      want = 1;
+    } else {
+      want = 0;
+    }
+
+    /* How many are there actually? */    
+    have = 0;
+    get_connection_array(&carray,&n_conn);
+    for(i=0;i<n_conn;i++) {
+      conn = carray[i];
+      if (conn->type == type && !conn->marked_for_close)
+        ++have;
+    }
+
+    /* If we have the right number of listeners, do nothing. */
+    if (have == want)
+      return 0;
+
+    /* Otherwise, warn the user and relaunch. */
+    log_fn(LOG_WARN,"We have %d %s(s) open, but we want %d; relaunching.",
+           have, conn_type_to_string[type], want);
+  }
+  
   listener_close_if_present(type);
   if (port_option) {
     if (!cfg) {
-      if (connection_create_listener(default_addr, (uint16_t) port_option,
+           if (connection_create_listener(default_addr, (uint16_t) port_option,
                                      type)<0)
         return -1;
     } else {
@@ -572,18 +607,21 @@
   return 0;
 }
 
-/** (Re)launch listeners for each port you should have open.
+/** (Re)launch listeners for each port you should have open.  If
+ * <b>force</b> is true, close and relaunch all listeners. If <b>force</b>
+ * is false, then only relaunch listeners when we have the wrong number of
+ * connections for a given type.
  */
-int retry_all_listeners(void) {
+int retry_all_listeners(int force) {
 
   if (retry_listeners(CONN_TYPE_OR_LISTENER, options.ORBindAddress,
-                      options.ORPort, "0.0.0.0")<0)
+                      options.ORPort, "0.0.0.0", force)<0)
     return -1;
   if (retry_listeners(CONN_TYPE_DIR_LISTENER, options.DirBindAddress,
-                      options.DirPort, "0.0.0.0")<0)
+                      options.DirPort, "0.0.0.0", force)<0)
     return -1;
   if (retry_listeners(CONN_TYPE_AP_LISTENER, options.SocksBindAddress,
-                      options.SocksPort, "127.0.0.1")<0)
+                      options.SocksPort, "127.0.0.1", force)<0)
     return -1;
 
   return 0;

Index: main.c
===================================================================
RCS file: /home/or/cvsroot/src/or/main.c,v
retrieving revision 1.338
retrieving revision 1.339
diff -u -d -r1.338 -r1.339
--- main.c	23 Oct 2004 17:06:25 -0000	1.338
+++ main.c	24 Oct 2004 01:22:40 -0000	1.339
@@ -502,6 +502,7 @@
   static long time_to_fetch_directory = 0;
   static time_t last_uploaded_services = 0;
   static time_t last_rotated_certificate = 0;
+  static time_t time_to_check_listeners = 0;
   int i;
 
   /** 0. See if we've been asked to shut down and our timeout has
@@ -596,6 +597,12 @@
    */
   connection_expire_held_open();
 
+  /** 3d. And every 60 secionds, we relaunch listeners if any died. */
+  if (time_to_check_listeners < now) {
+    retry_all_listeners(0); /* 0 means "only if some died." */
+    time_to_check_listeners = now+60;
+  }
+
   /** 4. Every second, we try a new circuit if there are no valid
    *    circuits. Every NewCircuitPeriod seconds, we expire circuits
    *    that became dirty more than NewCircuitPeriod seconds ago,
@@ -744,7 +751,7 @@
     log_fn(LOG_ERR,"Error reloading rendezvous service keys");
     return -1;
   }
-  if(retry_all_listeners() < 0) {
+  if(retry_all_listeners(1) < 0) {
     log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
     return -1;
   }
@@ -808,7 +815,7 @@
   }
 
   /* start up the necessary listeners based on which ports are non-zero. */
-  if(retry_all_listeners() < 0) {
+  if(retry_all_listeners(1) < 0) {
     log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
     return -1;
   }

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.442
retrieving revision 1.443
diff -u -d -r1.442 -r1.443
--- or.h	20 Oct 2004 23:30:38 -0000	1.442
+++ or.h	24 Oct 2004 01:22:40 -0000	1.443
@@ -1093,7 +1093,7 @@
 void connection_expire_held_open(void);
 
 int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
-int retry_all_listeners(void);
+int retry_all_listeners(int force);
 
 void connection_bucket_init(void);
 void connection_bucket_refill(struct timeval *now);



More information about the tor-commits mailing list