gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r26003 - gnunet/src/transport
Date: Mon, 4 Feb 2013 16:40:56 +0100

Author: wachs
Date: 2013-02-04 16:40:56 +0100 (Mon, 04 Feb 2013)
New Revision: 26003

Modified:
   gnunet/src/transport/gnunet-service-transport.c
   gnunet/src/transport/gnunet-service-transport_neighbours.c
   gnunet/src/transport/gnunet-service-transport_neighbours.h
   gnunet/src/transport/gnunet-service-transport_validation.c
   gnunet/src/transport/gnunet-service-transport_validation.h
   gnunet/src/transport/transport.h
Log:
throttling validations


Modified: gnunet/src/transport/gnunet-service-transport.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport.c     2013-02-04 15:34:55 UTC 
(rev 26002)
+++ gnunet/src/transport/gnunet-service-transport.c     2013-02-04 15:40:56 UTC 
(rev 26003)
@@ -601,6 +601,9 @@
                    const char *emsg)
 {
   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded tmp;
+  long long unsigned int max_fd_cfg;
+  int max_fd_rlimit;
+  int max_fd;
 
   GST_keygen = NULL;
   if (NULL == pk)
@@ -641,6 +644,33 @@
     return;
   }
 
+  max_fd_rlimit = 0;
+  max_fd_cfg = 0;
+  max_fd = 0;
+#if HAVE_GETRLIMIT
+  struct rlimit r_file;
+  if (0 == getrlimit (RLIMIT_NOFILE, &r_file))
+  {
+               max_fd_rlimit = r_file.rlim_cur;
+               GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                                                               "Maximum number 
of open files was: %u/%u\n", r_file.rlim_cur,
+                                                               
r_file.rlim_max);
+  }
+  max_fd_rlimit = (9 * max_fd_rlimit) / 10; /* Keep 10% for rest of transport 
*/
+#endif
+  GNUNET_CONFIGURATION_get_value_number (GST_cfg, "transport", "MAX_FD", 
&max_fd_cfg);
+
+  if (max_fd_cfg > max_fd_rlimit)
+       max_fd = max_fd_cfg;
+  else
+       max_fd = max_fd_rlimit;
+  if (max_fd < DEFAULT_MAX_FDS)
+       max_fd = DEFAULT_MAX_FDS;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Limiting number of sockets to %u: validation %u, neighbors: 
%u\n",
+              max_fd, (max_fd / 3) , (max_fd / 3) * 2);
+
   /* start subsystems */
   GST_hello_start (&process_hello_update, NULL);
   GNUNET_assert (NULL != GST_hello_get());
@@ -654,9 +684,10 @@
   GST_neighbours_start (NULL,
                         &neighbours_connect_notification,
                         &neighbours_disconnect_notification,
-                        &neighbours_address_notification);
+                        &neighbours_address_notification,
+                        (max_fd / 3) * 2);
   GST_clients_start (GST_server);
-  GST_validation_start ();
+  GST_validation_start ((max_fd / 3));
   if (NULL != GST_server)
     GNUNET_SERVER_resume (GST_server);
 }

Modified: gnunet/src/transport/gnunet-service-transport_neighbours.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_neighbours.c  2013-02-04 
15:34:55 UTC (rev 26002)
+++ gnunet/src/transport/gnunet-service-transport_neighbours.c  2013-02-04 
15:40:56 UTC (rev 26003)
@@ -2345,6 +2345,8 @@
   if (NULL == (papi = GST_plugins_find (address->transport_name)))
   {
     /* we don't have the plugin for this address */
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "2348 : `%s' \n", address->transport_name);
     GNUNET_ATS_address_destroyed (GST_ats, address, NULL);
     return;
   }
@@ -3390,12 +3392,14 @@
  * @param disconnect_cb function to call if we disconnect from a peer
  * @param peer_address_cb function to call if we change an active address
  *                   of a neighbour
+ * @param max_fds maximum number of fds to use
  */
 void
 GST_neighbours_start (void *cls,
-    NotifyConnect connect_cb,
+                                                                       
NotifyConnect connect_cb,
                       GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb,
-                      GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb)
+                      GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb,
+                      unsigned int max_fds)
 {
   callback_cls = cls;
   connect_notify_cb = connect_cb;

Modified: gnunet/src/transport/gnunet-service-transport_neighbours.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_neighbours.h  2013-02-04 
15:34:55 UTC (rev 26002)
+++ gnunet/src/transport/gnunet-service-transport_neighbours.h  2013-02-04 
15:40:56 UTC (rev 26003)
@@ -44,12 +44,14 @@
  * @param connect_cb function to call if we connect to a peer
  * @param disconnect_cb function to call if we disconnect from a peer
  * @param peer_address_cb function to call if a neighbour's active address 
changes
+ * @param max_fds maximum number of fds to use
  */
 void
 GST_neighbours_start (void *cls,
-                      NotifyConnect connect_cb,
+                                                                       
NotifyConnect connect_cb,
                       GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb,
-                      GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb);
+                      GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb,
+                      unsigned int max_fds);
 
 
 /**

Modified: gnunet/src/transport/gnunet-service-transport_validation.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_validation.c  2013-02-04 
15:34:55 UTC (rev 26002)
+++ gnunet/src/transport/gnunet-service-transport_validation.c  2013-02-04 
15:40:56 UTC (rev 26003)
@@ -308,6 +308,16 @@
 
 
 /**
+ * Minimum delay between to validations
+ */
+static struct GNUNET_TIME_Relative validation_delay;
+
+/**
+ * When is next validation allowed
+ */
+static struct GNUNET_TIME_Absolute validation_next;
+
+/**
  * Context for the validation entry match function.
  */
 struct ValidationEntryMatchContext
@@ -433,6 +443,7 @@
   struct ValidationEntry *ve = cls;
   struct TransportPingMessage ping;
   struct GNUNET_TRANSPORT_PluginFunctions *papi;
+  struct GNUNET_TIME_Absolute next;
   const struct GNUNET_MessageHeader *hello;
   ssize_t ret;
   size_t tsize;
@@ -440,9 +451,21 @@
   uint16_t hsize;
 
   ve->bc = NULL;
+
+  if (GNUNET_NO == result)
+  {
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Blacklist denies to send PING 
to `%s' %s %s\n",
+                     GNUNET_i2s (pid), GST_plugins_a2s (ve->address), 
ve->address->transport_name);
+               return;
+  }
+
   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);
+  if (next.abs_value > validation_next.abs_value)
+       validation_next = next; /* We're going to send a PING so delay next 
validation */
+
   slen = strlen (ve->address->transport_name) + 1;
   hello = GST_hello_get ();
   hsize = ntohs (hello->size);
@@ -529,6 +552,7 @@
   struct ValidationEntry *ve = cls;
   struct GNUNET_TIME_Relative canonical_delay;
   struct GNUNET_TIME_Relative delay;
+  struct GNUNET_TIME_Relative blocked_for;
   struct GST_BlacklistCheck *bc;
   uint32_t rdelay;
 
@@ -553,6 +577,14 @@
         GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve);
     return;
   }
+  blocked_for = GNUNET_TIME_absolute_get_remaining(validation_next);
+  if ((blocked_for.rel_value) > 0)
+  {
+               /* Validations are blocked, have to wait for blocked_for ms */
+      ve->revalidation_task =
+          GNUNET_SCHEDULER_add_delayed (blocked_for, &revalidate_address, ve);
+      return;
+  }
   ve->revalidation_block = GNUNET_TIME_relative_to_absolute (canonical_delay);
 
   /* schedule next PINGing with some extra random delay to avoid synchronous 
re-validations */
@@ -707,10 +739,15 @@
 
 /**
  * Start the validation subsystem.
+ *
+ * @param max_fds maximum number of fds to use
  */
 void
-GST_validation_start ()
+GST_validation_start (unsigned int max_fds)
 {
+       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_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE,
                                                         GNUNET_NO);
   pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL);

Modified: gnunet/src/transport/gnunet-service-transport_validation.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_validation.h  2013-02-04 
15:34:55 UTC (rev 26002)
+++ gnunet/src/transport/gnunet-service-transport_validation.h  2013-02-04 
15:40:56 UTC (rev 26003)
@@ -34,9 +34,11 @@
 
 /**
  * Start the validation subsystem.
+ *
+ * @param max_fds maximum number of fds to use
  */
 void
-GST_validation_start (void);
+GST_validation_start (unsigned int max_fds);
 
 
 /**

Modified: gnunet/src/transport/transport.h
===================================================================
--- gnunet/src/transport/transport.h    2013-02-04 15:34:55 UTC (rev 26002)
+++ gnunet/src/transport/transport.h    2013-02-04 15:40:56 UTC (rev 26003)
@@ -47,6 +47,12 @@
 #define MIN_QUOTA_REFRESH_TIME 2000
 
 /**
+ * What's the maximum number of sockets transport uses for validation and
+ * neighbors
+ */
+#define DEFAULT_MAX_FDS 256
+
+/**
  * Maximum frequency for re-evaluating latencies for all transport addresses.
  */
 #define LATENCY_EVALUATION_MAX_DELAY GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_HOURS, 1)




reply via email to

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