Procházet zdrojové kódy

stop wasting cpu time on authdirservers

we were making a new directory only when the old one was dirty, but
every time we made one, we'd dirty it by testing it right then.


svn:r2199
Roger Dingledine před 20 roky
rodič
revize
7506cce649
2 změnil soubory, kde provedl 7 přidání a 6 odebrání
  1. 2 1
      src/or/connection.c
  2. 5 5
      src/or/dirserv.c

+ 2 - 1
src/or/connection.c

@@ -142,7 +142,8 @@ void connection_free(connection_t *conn) {
   tor_free(conn->address);
 
   if(connection_speaks_cells(conn)) {
-    directory_set_dirty(); /* XXX should only do this for an open OR conn */
+    if(conn->state == OR_CONN_STATE_OPEN)
+      directory_set_dirty();
     if (conn->tls)
       tor_tls_free(conn->tls);
   }

+ 5 - 5
src/or/dirserv.c

@@ -267,7 +267,7 @@ dirserv_free_descriptors()
 }
 
 /** Parse the server descriptor at *desc and maybe insert it into the
- * list of service descriptors, and (if the descriptor is well-formed)
+ * list of server descriptors, and (if the descriptor is well-formed)
  * advance *desc immediately past the descriptor's end.
  *
  * Return 1 if descriptor is well-formed and accepted;
@@ -356,9 +356,9 @@ dirserv_add_descriptor(const char **desc)
   }
   if (found >= 0) {
     /* if so, decide whether to update it. */
-    if (ent->published > ri->published_on) {
-      /* We already have a newer descriptor */
-      log_fn(LOG_INFO,"We already have a newer desc for nickname %s. Not adding.",ri->nickname);
+    if (ent->published >= ri->published_on) {
+      /* We already have a newer or equal-time descriptor */
+      log_fn(LOG_INFO,"We already have a new enough desc for nickname %s. Not adding.",ri->nickname);
       /* This isn't really an error; return success. */
       routerinfo_free(ri);
       *desc = end;
@@ -662,7 +662,6 @@ size_t dirserv_get_directory(const char **directory)
     the_directory_len = strlen(the_directory);
     log_fn(LOG_INFO,"New directory (size %d):\n%s",the_directory_len,
            the_directory);
-    the_directory_is_dirty = 0;
     /* Now read the directory we just made in order to update our own
      * router lists.  This does more signature checking than is strictly
      * necessary, but safe is better than sorry. */
@@ -680,6 +679,7 @@ size_t dirserv_get_directory(const char **directory)
         log_fn(LOG_WARN, "Couldn't write cached directory to disk. Ignoring.");
       }
     }
+    the_directory_is_dirty = 0;
   } else {
     log(LOG_INFO,"Directory still clean, reusing.");
   }