diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-01-17 13:03:16 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-01-17 13:03:16 +0000 |
commit | 34d8a9d0b428eb683f0503106bcc31f3fc1af8a7 (patch) | |
tree | c96e4b4ddbb712794d34b9177652d09215885c9d /src | |
parent | a5d7b80e7e64f3127fd703b52928aa337f4337f5 (diff) | |
download | gnunet-34d8a9d0b428eb683f0503106bcc31f3fc1af8a7.tar.gz gnunet-34d8a9d0b428eb683f0503106bcc31f3fc1af8a7.zip |
improved timeout handling for address listing
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/gnunet-transport.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/src/transport/gnunet-transport.c b/src/transport/gnunet-transport.c index ecb26ca89..94e4656e3 100644 --- a/src/transport/gnunet-transport.c +++ b/src/transport/gnunet-transport.c | |||
@@ -39,9 +39,9 @@ | |||
39 | * How long do we wait for the NAT test to report success? | 39 | * How long do we wait for the NAT test to report success? |
40 | * Should match NAT_SERVER_TIMEOUT in 'nat_test.c'. | 40 | * Should match NAT_SERVER_TIMEOUT in 'nat_test.c'. |
41 | */ | 41 | */ |
42 | #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) | 42 | #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60) |
43 | #define RESOLUTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) | 43 | #define RESOLUTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) |
44 | #define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) | 44 | #define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) |
45 | 45 | ||
46 | /** | 46 | /** |
47 | * Benchmarking block size in KB | 47 | * Benchmarking block size in KB |
@@ -273,12 +273,25 @@ shutdown_task (void *cls, | |||
273 | } | 273 | } |
274 | } | 274 | } |
275 | 275 | ||
276 | struct ResolutionContext *rc_head; | ||
277 | struct ResolutionContext *rc_tail; | ||
278 | |||
279 | struct ResolutionContext | ||
280 | { | ||
281 | struct ResolutionContext *next; | ||
282 | struct ResolutionContext *prev; | ||
283 | struct GNUNET_HELLO_Address *addrcp; | ||
284 | struct GNUNET_TRANSPORT_AddressToStringContext *asc; | ||
285 | int printed; | ||
286 | }; | ||
276 | 287 | ||
277 | 288 | ||
278 | static void | 289 | static void |
279 | operation_timeout (void *cls, | 290 | operation_timeout (void *cls, |
280 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 291 | const struct GNUNET_SCHEDULER_TaskContext *tc) |
281 | { | 292 | { |
293 | struct ResolutionContext *cur; | ||
294 | struct ResolutionContext *next; | ||
282 | op_timeout = GNUNET_SCHEDULER_NO_TASK; | 295 | op_timeout = GNUNET_SCHEDULER_NO_TASK; |
283 | if ((try_connect) || (benchmark_send) || | 296 | if ((try_connect) || (benchmark_send) || |
284 | (benchmark_receive)) | 297 | (benchmark_receive)) |
@@ -292,7 +305,20 @@ operation_timeout (void *cls, | |||
292 | } | 305 | } |
293 | if (iterate_connections) | 306 | if (iterate_connections) |
294 | { | 307 | { |
295 | FPRINTF (stdout, _("Failed to list connections, timeout occured\n")); | 308 | next = rc_head; |
309 | while (NULL != (cur = next)) | ||
310 | { | ||
311 | next = cur->next; | ||
312 | FPRINTF (stdout, _("Failed to resolve address for peer `%s'\n"), | ||
313 | GNUNET_i2s (&cur->addrcp->peer)); | ||
314 | |||
315 | GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, cur); | ||
316 | GNUNET_TRANSPORT_address_to_string_cancel (cur->asc); | ||
317 | GNUNET_free (cur->addrcp); | ||
318 | GNUNET_free (cur); | ||
319 | |||
320 | } | ||
321 | FPRINTF (stdout, _("Failed to list connections, timeout occured\n")); | ||
296 | if (GNUNET_SCHEDULER_NO_TASK != end) | 322 | if (GNUNET_SCHEDULER_NO_TASK != end) |
297 | GNUNET_SCHEDULER_cancel (end); | 323 | GNUNET_SCHEDULER_cancel (end); |
298 | end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); | 324 | end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); |
@@ -641,13 +667,6 @@ notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer, | |||
641 | } | 667 | } |
642 | } | 668 | } |
643 | 669 | ||
644 | struct ResolutionContext | ||
645 | { | ||
646 | struct GNUNET_HELLO_Address *addrcp; | ||
647 | |||
648 | int printed; | ||
649 | }; | ||
650 | |||
651 | 670 | ||
652 | static void | 671 | static void |
653 | process_string (void *cls, const char *address) | 672 | process_string (void *cls, const char *address) |
@@ -668,6 +687,7 @@ process_string (void *cls, const char *address) | |||
668 | if (GNUNET_NO == rc->printed) | 687 | if (GNUNET_NO == rc->printed) |
669 | FPRINTF (stdout, _("Peer `%s': %s <unable to resolve address>\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name); | 688 | FPRINTF (stdout, _("Peer `%s': %s <unable to resolve address>\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name); |
670 | GNUNET_free (rc->addrcp); | 689 | GNUNET_free (rc->addrcp); |
690 | GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc); | ||
671 | GNUNET_free (rc); | 691 | GNUNET_free (rc); |
672 | if ((0 == address_resolutions) && (iterate_connections)) | 692 | if ((0 == address_resolutions) && (iterate_connections)) |
673 | { | 693 | { |
@@ -685,6 +705,7 @@ process_string (void *cls, const char *address) | |||
685 | end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); | 705 | end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); |
686 | } | 706 | } |
687 | } | 707 | } |
708 | |||
688 | } | 709 | } |
689 | 710 | ||
690 | /** | 711 | /** |
@@ -720,15 +741,17 @@ process_address (void *cls, const struct GNUNET_PeerIdentity *peer, | |||
720 | &operation_timeout, NULL); | 741 | &operation_timeout, NULL); |
721 | 742 | ||
722 | rc = GNUNET_malloc(sizeof (struct ResolutionContext)); | 743 | rc = GNUNET_malloc(sizeof (struct ResolutionContext)); |
723 | rc->addrcp = GNUNET_HELLO_address_copy(address); | ||
724 | rc->printed = GNUNET_NO; | ||
725 | |||
726 | GNUNET_assert (NULL != rc); | 744 | GNUNET_assert (NULL != rc); |
745 | GNUNET_CONTAINER_DLL_insert (rc_head, rc_tail, rc); | ||
727 | address_resolutions ++; | 746 | address_resolutions ++; |
747 | |||
748 | rc->addrcp = GNUNET_HELLO_address_copy(address); | ||
749 | rc->printed = GNUNET_NO; | ||
728 | /* Resolve address to string */ | 750 | /* Resolve address to string */ |
729 | GNUNET_TRANSPORT_address_to_string (cfg, address, numeric, | 751 | rc->asc = GNUNET_TRANSPORT_address_to_string (cfg, address, numeric, |
730 | RESOLUTION_TIMEOUT, &process_string, | 752 | RESOLUTION_TIMEOUT, &process_string, |
731 | rc); | 753 | rc); |
754 | |||
732 | } | 755 | } |
733 | 756 | ||
734 | void try_connect_cb (void *cls, | 757 | void try_connect_cb (void *cls, |