diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-02-04 15:40:56 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-02-04 15:40:56 +0000 |
commit | 9f5dbc004450cbd34644380fb2f7d3972504f0bd (patch) | |
tree | 5a3eb9318f0b5123cadcb5b411a4d69140748dd2 /src/transport | |
parent | 9b591a03f71042c8b00f9ba55c303d738a0c2363 (diff) | |
download | gnunet-9f5dbc004450cbd34644380fb2f7d3972504f0bd.tar.gz gnunet-9f5dbc004450cbd34644380fb2f7d3972504f0bd.zip |
throttling validations
Diffstat (limited to 'src/transport')
-rw-r--r-- | src/transport/gnunet-service-transport.c | 35 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_neighbours.c | 8 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_neighbours.h | 6 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_validation.c | 39 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_validation.h | 4 | ||||
-rw-r--r-- | src/transport/transport.h | 6 |
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 | */ |
3394 | void | 3397 | void |
3395 | GST_neighbours_start (void *cls, | 3398 | GST_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 | */ |
48 | void | 49 | void |
49 | GST_neighbours_start (void *cls, | 50 | GST_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 | */ | ||
313 | static struct GNUNET_TIME_Relative validation_delay; | ||
314 | |||
315 | /** | ||
316 | * When is next validation allowed | ||
317 | */ | ||
318 | static 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 | */ |
313 | struct ValidationEntryMatchContext | 323 | struct 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 | */ |
711 | void | 745 | void |
712 | GST_validation_start () | 746 | GST_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 | */ |
38 | void | 40 | void |
39 | GST_validation_start (void); | 41 | GST_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) |