Browse Source

forward-port the onion queue thing

svn:r3639
Roger Dingledine 19 years ago
parent
commit
38f53cff41
1 changed files with 15 additions and 2 deletions
  1. 15 2
      src/or/onion.c

+ 15 - 2
src/or/onion.c

@@ -15,13 +15,17 @@ const char onion_c_id[] = "$Id$";
 
 struct onion_queue_t {
   circuit_t *circ;
+  time_t when_added;
   struct onion_queue_t *next;
 };
 
-/** global (within this file) variables used by the next few functions */
+/** 5 seconds on the onion queue til we just send back a destroy */
+#define ONIONQUEUE_WAIT_CUTOFF 5
+
+/** Global (within this file) variables used by the next few functions */
 static struct onion_queue_t *ol_list=NULL;
 static struct onion_queue_t *ol_tail=NULL;
-/** length of ol_list */
+/** Length of ol_list */
 static int ol_length=0;
 
 /** Add <b>circ</b> to the end of ol_list and return 0, except
@@ -29,9 +33,11 @@ static int ol_length=0;
  */
 int onion_pending_add(circuit_t *circ) {
   struct onion_queue_t *tmp;
+  time_t now = time(NULL);
 
   tmp = tor_malloc_zero(sizeof(struct onion_queue_t));
   tmp->circ = circ;
+  tmp->when_added = now;
 
   if (!ol_tail) {
     tor_assert(!ol_list);
@@ -54,6 +60,13 @@ int onion_pending_add(circuit_t *circ) {
   ol_length++;
   ol_tail->next = tmp;
   ol_tail = tmp;
+  while ((int)(now - ol_list->when_added) >= ONIONQUEUE_WAIT_CUTOFF) {
+    /* cull elderly requests. */
+    circ = ol_list->circ;
+    onion_pending_remove(ol_list->circ);
+    log_fn(LOG_INFO,"Circuit create request is too old; cancelling due to overload.");
+    circuit_mark_for_close(circ);
+  }
   return 0;
 }