gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r26307 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r26307 - gnunet/src/transport
Date: Mon, 4 Mar 2013 15:50:04 +0100

Author: wachs
Date: 2013-03-04 15:50:04 +0100 (Mon, 04 Mar 2013)
New Revision: 26307

Modified:
   gnunet/src/transport/gnunet-service-transport_validation.c
Log:
validation fast start and throttling


Modified: gnunet/src/transport/gnunet-service-transport_validation.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_validation.c  2013-03-04 
14:41:47 UTC (rev 26306)
+++ gnunet/src/transport/gnunet-service-transport_validation.c  2013-03-04 
14:50:04 UTC (rev 26307)
@@ -263,7 +263,6 @@
    */
   int expecting_pong;
 
-
   /* FIXME: DEBUGGING */
   int last_line_set_to_no;
   int last_line_set_to_yes;
@@ -324,6 +323,16 @@
 static struct GNUNET_TIME_Relative validation_delay;
 
 /**
+ * Number of validations running
+ */
+static unsigned int validations_running;
+
+/**
+ * Validition fast start threshold
+ */
+static unsigned int validations_fast_start_threshold;
+
+/**
  * When is next validation allowed
  */
 static struct GNUNET_TIME_Absolute validation_next;
@@ -402,6 +411,14 @@
     GNUNET_SCHEDULER_cancel (ve->revalidation_task);
     ve->revalidation_task = GNUNET_SCHEDULER_NO_TASK;
   }
+  if ((GNUNET_YES == ve->expecting_pong) &&
+               (validations_running > 0))
+  {
+               validations_running --;
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "Validation finished, %u validation processes running\n",
+                     validations_running);
+  }
   GNUNET_free (ve);
   return GNUNET_OK;
 }
@@ -473,7 +490,7 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting plain PING to `%s' %s 
%s\n",
               GNUNET_i2s (pid), GST_plugins_a2s (ve->address), 
ve->address->transport_name);
 
-  next = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), 
validation_delay);
+  next = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(), 
validation_delay);
   if (next.abs_value > validation_next.abs_value)
        validation_next = next; /* We're going to send a PING so delay next 
validation */
 
@@ -547,6 +564,10 @@
                               ("# PING without HELLO messages sent"), 1,
                               GNUNET_NO);
     ve->expecting_pong = GNUNET_YES;
+    validations_running ++;
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "Validation started, %u validation processes running\n",
+                     validations_running);
   }
 }
 
@@ -589,7 +610,10 @@
     return;
   }
   blocked_for = GNUNET_TIME_absolute_get_remaining(validation_next);
-  if ((blocked_for.rel_value) > 0)
+  if (validations_running > validations_fast_start_threshold)
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,"Throttle!\n");
+  if ((validations_running > validations_fast_start_threshold) &&
+               (blocked_for.rel_value > 0))
   {
     /* Validations are blocked, have to wait for blocked_for time */
     ve->revalidation_task =
@@ -758,9 +782,24 @@
 void
 GST_validation_start (unsigned int max_fds)
 {
+       /**
+        * Initialization for validation throttling
+        *
+        * We have a maximum number max_fds of connections we can use for 
validation
+        * We monitor the number of validations in parallel and start to 
throttle it
+        * when doing to many validations in parallel:
+        * if (running validations < (max_fds / 2))
+        * - "fast start": run validation immediately
+        * - have delay of (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value) 
/ (max_fds / 2)
+        *   (300 sec / ~150 == ~2 sec.) between two validations
+        */
+
        validation_next = GNUNET_TIME_absolute_get();
-       validation_delay.rel_value = 
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value) /  max_fds;
-       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Delay between validations: %u 
ms\n ", validation_delay.rel_value);
+       validation_delay.rel_value = 
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value) /  (max_fds / 2);
+       validations_fast_start_threshold = (max_fds / 2);
+       validations_running = 0;
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Validation uses a fast start 
threshold of %u connections and a delay between of %u ms\n ",
+                       validations_fast_start_threshold, 
validation_delay.rel_value);
   validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE,
                                                         GNUNET_NO);
   pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL);
@@ -1204,6 +1243,16 @@
     ats.value = htonl ((uint32_t) ve->latency.rel_value);
     GNUNET_ATS_address_add (GST_ats, ve->address, NULL, &ats, 1);
   }
+  if (validations_running > 0)
+  {
+       validations_running --;
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "Validation finished, %u validation processes running\n",
+                     validations_running);
+  }
+  else
+       GNUNET_break (0);
+
   /* build HELLO to store in PEERINFO */
   ve->copied = GNUNET_NO;
   hello = GNUNET_HELLO_create (&ve->public_key, &add_valid_peer_address, ve);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]