aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-02-04 15:40:56 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-02-04 15:40:56 +0000
commit9f5dbc004450cbd34644380fb2f7d3972504f0bd (patch)
tree5a3eb9318f0b5123cadcb5b411a4d69140748dd2 /src
parent9b591a03f71042c8b00f9ba55c303d738a0c2363 (diff)
downloadgnunet-9f5dbc004450cbd34644380fb2f7d3972504f0bd.tar.gz
gnunet-9f5dbc004450cbd34644380fb2f7d3972504f0bd.zip
throttling validations
Diffstat (limited to 'src')
-rw-r--r--src/transport/gnunet-service-transport.c35
-rw-r--r--src/transport/gnunet-service-transport_neighbours.c8
-rw-r--r--src/transport/gnunet-service-transport_neighbours.h6
-rw-r--r--src/transport/gnunet-service-transport_validation.c39
-rw-r--r--src/transport/gnunet-service-transport_validation.h4
-rw-r--r--src/transport/transport.h6
6 files changed, 90 insertions, 8 deletions
diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c
index bb091fafc..9f60d03d7 100644
--- a/src/transport/gnunet-service-transport.c
+++ b/src/transport/gnunet-service-transport.c
@@ -601,6 +601,9 @@ key_generation_cb (void *cls,
601 const char *emsg) 601 const char *emsg)
602{ 602{
603 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded tmp; 603 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded tmp;
604 long long unsigned int max_fd_cfg;
605 int max_fd_rlimit;
606 int max_fd;
604 607
605 GST_keygen = NULL; 608 GST_keygen = NULL;
606 if (NULL == pk) 609 if (NULL == pk)
@@ -641,6 +644,33 @@ key_generation_cb (void *cls,
641 return; 644 return;
642 } 645 }
643 646
647 max_fd_rlimit = 0;
648 max_fd_cfg = 0;
649 max_fd = 0;
650#if HAVE_GETRLIMIT
651 struct rlimit r_file;
652 if (0 == getrlimit (RLIMIT_NOFILE, &r_file))
653 {
654 max_fd_rlimit = r_file.rlim_cur;
655 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
656 "Maximum number of open files was: %u/%u\n", r_file.rlim_cur,
657 r_file.rlim_max);
658 }
659 max_fd_rlimit = (9 * max_fd_rlimit) / 10; /* Keep 10% for rest of transport */
660#endif
661 GNUNET_CONFIGURATION_get_value_number (GST_cfg, "transport", "MAX_FD", &max_fd_cfg);
662
663 if (max_fd_cfg > max_fd_rlimit)
664 max_fd = max_fd_cfg;
665 else
666 max_fd = max_fd_rlimit;
667 if (max_fd < DEFAULT_MAX_FDS)
668 max_fd = DEFAULT_MAX_FDS;
669
670 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
671 "Limiting number of sockets to %u: validation %u, neighbors: %u\n",
672 max_fd, (max_fd / 3) , (max_fd / 3) * 2);
673
644 /* start subsystems */ 674 /* start subsystems */
645 GST_hello_start (&process_hello_update, NULL); 675 GST_hello_start (&process_hello_update, NULL);
646 GNUNET_assert (NULL != GST_hello_get()); 676 GNUNET_assert (NULL != GST_hello_get());
@@ -654,9 +684,10 @@ key_generation_cb (void *cls,
654 GST_neighbours_start (NULL, 684 GST_neighbours_start (NULL,
655 &neighbours_connect_notification, 685 &neighbours_connect_notification,
656 &neighbours_disconnect_notification, 686 &neighbours_disconnect_notification,
657 &neighbours_address_notification); 687 &neighbours_address_notification,
688 (max_fd / 3) * 2);
658 GST_clients_start (GST_server); 689 GST_clients_start (GST_server);
659 GST_validation_start (); 690 GST_validation_start ((max_fd / 3));
660 if (NULL != GST_server) 691 if (NULL != GST_server)
661 GNUNET_SERVER_resume (GST_server); 692 GNUNET_SERVER_resume (GST_server);
662} 693}
diff --git a/src/transport/gnunet-service-transport_neighbours.c b/src/transport/gnunet-service-transport_neighbours.c
index 04c455dfd..cad325d98 100644
--- a/src/transport/gnunet-service-transport_neighbours.c
+++ b/src/transport/gnunet-service-transport_neighbours.c
@@ -2345,6 +2345,8 @@ GST_neighbours_switch_to_address (const struct GNUNET_PeerIdentity *peer,
2345 if (NULL == (papi = GST_plugins_find (address->transport_name))) 2345 if (NULL == (papi = GST_plugins_find (address->transport_name)))
2346 { 2346 {
2347 /* we don't have the plugin for this address */ 2347 /* we don't have the plugin for this address */
2348 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2349 "2348 : `%s' \n", address->transport_name);
2348 GNUNET_ATS_address_destroyed (GST_ats, address, NULL); 2350 GNUNET_ATS_address_destroyed (GST_ats, address, NULL);
2349 return; 2351 return;
2350 } 2352 }
@@ -3390,12 +3392,14 @@ GST_neighbour_get_current_address (const struct GNUNET_PeerIdentity *peer)
3390 * @param disconnect_cb function to call if we disconnect from a peer 3392 * @param disconnect_cb function to call if we disconnect from a peer
3391 * @param peer_address_cb function to call if we change an active address 3393 * @param peer_address_cb function to call if we change an active address
3392 * of a neighbour 3394 * of a neighbour
3395 * @param max_fds maximum number of fds to use
3393 */ 3396 */
3394void 3397void
3395GST_neighbours_start (void *cls, 3398GST_neighbours_start (void *cls,
3396 NotifyConnect connect_cb, 3399 NotifyConnect connect_cb,
3397 GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb, 3400 GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb,
3398 GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb) 3401 GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb,
3402 unsigned int max_fds)
3399{ 3403{
3400 callback_cls = cls; 3404 callback_cls = cls;
3401 connect_notify_cb = connect_cb; 3405 connect_notify_cb = connect_cb;
diff --git a/src/transport/gnunet-service-transport_neighbours.h b/src/transport/gnunet-service-transport_neighbours.h
index 6a743359f..f6e3387bf 100644
--- a/src/transport/gnunet-service-transport_neighbours.h
+++ b/src/transport/gnunet-service-transport_neighbours.h
@@ -44,12 +44,14 @@
44 * @param connect_cb function to call if we connect to a peer 44 * @param connect_cb function to call if we connect to a peer
45 * @param disconnect_cb function to call if we disconnect from a peer 45 * @param disconnect_cb function to call if we disconnect from a peer
46 * @param peer_address_cb function to call if a neighbour's active address changes 46 * @param peer_address_cb function to call if a neighbour's active address changes
47 * @param max_fds maximum number of fds to use
47 */ 48 */
48void 49void
49GST_neighbours_start (void *cls, 50GST_neighbours_start (void *cls,
50 NotifyConnect connect_cb, 51 NotifyConnect connect_cb,
51 GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb, 52 GNUNET_TRANSPORT_NotifyDisconnect disconnect_cb,
52 GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb); 53 GNUNET_TRANSPORT_PeerIterateCallback peer_address_cb,
54 unsigned int max_fds);
53 55
54 56
55/** 57/**
diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c
index f76f888a6..3598a3494 100644
--- a/src/transport/gnunet-service-transport_validation.c
+++ b/src/transport/gnunet-service-transport_validation.c
@@ -308,6 +308,16 @@ static struct GNUNET_PEERINFO_NotifyContext *pnc;
308 308
309 309
310/** 310/**
311 * Minimum delay between to validations
312 */
313static struct GNUNET_TIME_Relative validation_delay;
314
315/**
316 * When is next validation allowed
317 */
318static struct GNUNET_TIME_Absolute validation_next;
319
320/**
311 * Context for the validation entry match function. 321 * Context for the validation entry match function.
312 */ 322 */
313struct ValidationEntryMatchContext 323struct ValidationEntryMatchContext
@@ -433,6 +443,7 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
433 struct ValidationEntry *ve = cls; 443 struct ValidationEntry *ve = cls;
434 struct TransportPingMessage ping; 444 struct TransportPingMessage ping;
435 struct GNUNET_TRANSPORT_PluginFunctions *papi; 445 struct GNUNET_TRANSPORT_PluginFunctions *papi;
446 struct GNUNET_TIME_Absolute next;
436 const struct GNUNET_MessageHeader *hello; 447 const struct GNUNET_MessageHeader *hello;
437 ssize_t ret; 448 ssize_t ret;
438 size_t tsize; 449 size_t tsize;
@@ -440,9 +451,21 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
440 uint16_t hsize; 451 uint16_t hsize;
441 452
442 ve->bc = NULL; 453 ve->bc = NULL;
454
455 if (GNUNET_NO == result)
456 {
457 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Blacklist denies to send PING to `%s' %s %s\n",
458 GNUNET_i2s (pid), GST_plugins_a2s (ve->address), ve->address->transport_name);
459 return;
460 }
461
443 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting plain PING to `%s' %s %s\n", 462 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting plain PING to `%s' %s %s\n",
444 GNUNET_i2s (pid), GST_plugins_a2s (ve->address), ve->address->transport_name); 463 GNUNET_i2s (pid), GST_plugins_a2s (ve->address), ve->address->transport_name);
445 464
465 next = GNUNET_TIME_absolute_add(GNUNET_TIME_absolute_get(), validation_delay);
466 if (next.abs_value > validation_next.abs_value)
467 validation_next = next; /* We're going to send a PING so delay next validation */
468
446 slen = strlen (ve->address->transport_name) + 1; 469 slen = strlen (ve->address->transport_name) + 1;
447 hello = GST_hello_get (); 470 hello = GST_hello_get ();
448 hsize = ntohs (hello->size); 471 hsize = ntohs (hello->size);
@@ -529,6 +552,7 @@ revalidate_address (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
529 struct ValidationEntry *ve = cls; 552 struct ValidationEntry *ve = cls;
530 struct GNUNET_TIME_Relative canonical_delay; 553 struct GNUNET_TIME_Relative canonical_delay;
531 struct GNUNET_TIME_Relative delay; 554 struct GNUNET_TIME_Relative delay;
555 struct GNUNET_TIME_Relative blocked_for;
532 struct GST_BlacklistCheck *bc; 556 struct GST_BlacklistCheck *bc;
533 uint32_t rdelay; 557 uint32_t rdelay;
534 558
@@ -553,6 +577,14 @@ revalidate_address (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
553 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve); 577 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve);
554 return; 578 return;
555 } 579 }
580 blocked_for = GNUNET_TIME_absolute_get_remaining(validation_next);
581 if ((blocked_for.rel_value) > 0)
582 {
583 /* Validations are blocked, have to wait for blocked_for ms */
584 ve->revalidation_task =
585 GNUNET_SCHEDULER_add_delayed (blocked_for, &revalidate_address, ve);
586 return;
587 }
556 ve->revalidation_block = GNUNET_TIME_relative_to_absolute (canonical_delay); 588 ve->revalidation_block = GNUNET_TIME_relative_to_absolute (canonical_delay);
557 589
558 /* schedule next PINGing with some extra random delay to avoid synchronous re-validations */ 590 /* schedule next PINGing with some extra random delay to avoid synchronous re-validations */
@@ -707,10 +739,15 @@ process_peerinfo_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
707 739
708/** 740/**
709 * Start the validation subsystem. 741 * Start the validation subsystem.
742 *
743 * @param max_fds maximum number of fds to use
710 */ 744 */
711void 745void
712GST_validation_start () 746GST_validation_start (unsigned int max_fds)
713{ 747{
748 validation_next = GNUNET_TIME_absolute_get();
749 validation_delay.rel_value = (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value) / max_fds;
750 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Delay between validations: %u ms\n ", validation_delay.rel_value);
714 validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE, 751 validation_map = GNUNET_CONTAINER_multihashmap_create (VALIDATION_MAP_SIZE,
715 GNUNET_NO); 752 GNUNET_NO);
716 pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL); 753 pnc = GNUNET_PEERINFO_notify (GST_cfg, &process_peerinfo_hello, NULL);
diff --git a/src/transport/gnunet-service-transport_validation.h b/src/transport/gnunet-service-transport_validation.h
index dd5bcd6bf..6f1206f65 100644
--- a/src/transport/gnunet-service-transport_validation.h
+++ b/src/transport/gnunet-service-transport_validation.h
@@ -34,9 +34,11 @@
34 34
35/** 35/**
36 * Start the validation subsystem. 36 * Start the validation subsystem.
37 *
38 * @param max_fds maximum number of fds to use
37 */ 39 */
38void 40void
39GST_validation_start (void); 41GST_validation_start (unsigned int max_fds);
40 42
41 43
42/** 44/**
diff --git a/src/transport/transport.h b/src/transport/transport.h
index 338783585..2e7bd8372 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -47,6 +47,12 @@
47#define MIN_QUOTA_REFRESH_TIME 2000 47#define MIN_QUOTA_REFRESH_TIME 2000
48 48
49/** 49/**
50 * What's the maximum number of sockets transport uses for validation and
51 * neighbors
52 */
53#define DEFAULT_MAX_FDS 256
54
55/**
50 * Maximum frequency for re-evaluating latencies for all transport addresses. 56 * Maximum frequency for re-evaluating latencies for all transport addresses.
51 */ 57 */
52#define LATENCY_EVALUATION_MAX_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1) 58#define LATENCY_EVALUATION_MAX_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 1)