[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r26003 - gnunet/src/transport,
gnunet <=