X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Fgnunet-testbed-profiler.c;h=3bddfac09e99318c5da4739641e89c565e594d66;hb=f4d040c0f0dd2fef3d73b1f4532c76219f760f75;hp=b01e992b95366e5a065f0c56bf2e27b214f1f899;hpb=f54cf6c01e2dac998c64249d72eb92dbf5d056db;p=oweals%2Fgnunet.git diff --git a/src/testbed/gnunet-testbed-profiler.c b/src/testbed/gnunet-testbed-profiler.c index b01e992b9..3bddfac09 100644 --- a/src/testbed/gnunet-testbed-profiler.c +++ b/src/testbed/gnunet-testbed-profiler.c @@ -26,6 +26,7 @@ #include "platform.h" #include "gnunet_common.h" +#include "gnunet_util_lib.h" #include "gnunet_testbed_service.h" #include "testbed_api_hosts.h" @@ -207,14 +208,19 @@ static unsigned int num_links; static unsigned int num_cont_fails; /** - * Number of times we try overlay connect operations + * Continuous failures during overlay connect operations */ -static unsigned int retry_links; +static unsigned int cont_fails; /** - * Continuous failures during overlay connect operations + * Links which are successfully established */ -static unsigned int cont_fails; +static unsigned int established_links; + +/** + * Links which are not successfully established + */ +static unsigned int failed_links; /** * Global testing status @@ -226,6 +232,11 @@ static int result; */ enum State state; +/** + * The topology we want to acheive + */ +enum GNUNET_TESTBED_TopologyOption topology; + /** * Shutdown nicely @@ -247,14 +258,14 @@ do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (NULL != reg_handle) GNUNET_TESTBED_cancel_registration (reg_handle); if (NULL != topology_op) - GNUNET_TESTBED_operation_cancel (topology_op); + GNUNET_TESTBED_operation_done (topology_op); for (nhost = 0; nhost < num_hosts; nhost++) if (NULL != hosts[nhost]) GNUNET_TESTBED_host_destroy (hosts[nhost]); GNUNET_free_non_null (hosts); while (NULL != (dll_op = dll_op_head)) { - GNUNET_TESTBED_operation_cancel (dll_op->op); + GNUNET_TESTBED_operation_done (dll_op->op); GNUNET_CONTAINER_DLL_remove (dll_op_head, dll_op_tail, dll_op); GNUNET_free (dll_op); } @@ -323,7 +334,7 @@ peer_churn_cb (void *cls, const char *emsg) num_peers, ((double) prof_time.rel_value) / 1000.00); fflush (stdout); result = GNUNET_OK; - if (0 == num_links) + if ((0 == num_links) && (topology == GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI)) { shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); return; @@ -331,11 +342,27 @@ peer_churn_cb (void *cls, const char *emsg) state = STATE_PEERS_LINKING; /* Do overlay connect */ prof_start_time = GNUNET_TIME_absolute_get (); - topology_op = - GNUNET_TESTBED_overlay_configure_topology (NULL, num_peers, peers, - GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI, - num_links, - GNUNET_TESTBED_TOPOLOGY_OPTION_END); + switch (topology) + { + case GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI: + topology_op = + GNUNET_TESTBED_overlay_configure_topology (NULL, num_peers, peers, + topology, + num_links, + GNUNET_TESTBED_TOPOLOGY_DISABLE_AUTO_RETRY, + GNUNET_TESTBED_TOPOLOGY_OPTION_END); + break; + case GNUNET_TESTBED_TOPOLOGY_CLIQUE: + topology_op = + GNUNET_TESTBED_overlay_configure_topology (NULL, num_peers, peers, + topology, + GNUNET_TESTBED_TOPOLOGY_DISABLE_AUTO_RETRY, + GNUNET_TESTBED_TOPOLOGY_OPTION_END); + num_links = num_peers * (num_peers - 1); + break; + default: + GNUNET_assert (0); + } } } @@ -403,9 +430,36 @@ print_overlay_links_summary () { prof_time = GNUNET_TIME_absolute_get_duration (prof_start_time); printf ("\n%u links established in %.2f seconds\n", - num_links, ((double) prof_time.rel_value) / 1000.00); - printf ("Overlay link operations have been retried %u times upon timeouts\n", - retry_links); + established_links, ((double) prof_time.rel_value) / 1000.00); + printf ("%u links failed due to timeouts\n", failed_links); +} + + +/** + * Function to start peers + */ +static void +start_peers () +{ + struct DLLOperation *dll_op; + unsigned int peer_cnt; + + state = STATE_PEERS_CREATING; + prof_start_time = GNUNET_TIME_absolute_get (); + peers = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Peer *) + * num_peers); + for (peer_cnt = 0; peer_cnt < num_peers; peer_cnt++) + { + dll_op = GNUNET_malloc (sizeof (struct DLLOperation)); + dll_op->cls = &peers[peer_cnt]; + dll_op->op = GNUNET_TESTBED_peer_create (mc, + hosts + [peer_cnt % num_hosts], + cfg, + &peer_create_cb, + dll_op); + GNUNET_CONTAINER_DLL_insert_tail (dll_op_head, dll_op_tail, dll_op); + } } @@ -430,7 +484,6 @@ controller_event_cb (void *cls, case GNUNET_TESTBED_ET_OPERATION_FINISHED: { static unsigned int slaves_started; - unsigned int peer_cnt; dll_op = event->details.operation_finished.op_cls; GNUNET_CONTAINER_DLL_remove (dll_op_head, dll_op_tail, dll_op); @@ -451,22 +504,7 @@ controller_event_cb (void *cls, { printf ("%u controllers started successfully\n", num_hosts); fflush (stdout); - state = STATE_PEERS_CREATING; - prof_start_time = GNUNET_TIME_absolute_get (); - peers = GNUNET_malloc (sizeof (struct GNUNET_TESTBED_Peer *) - * num_peers); - for (peer_cnt = 0; peer_cnt < num_peers; peer_cnt++) - { - dll_op = GNUNET_malloc (sizeof (struct DLLOperation)); - dll_op->cls = &peers[peer_cnt]; - dll_op->op = GNUNET_TESTBED_peer_create (mc, - hosts - [peer_cnt % num_hosts], - cfg, - &peer_create_cb, - dll_op); - GNUNET_CONTAINER_DLL_insert_tail (dll_op_head, dll_op_tail, dll_op); - } + start_peers (); } } break; @@ -487,47 +525,45 @@ controller_event_cb (void *cls, } break; case STATE_PEERS_LINKING: - switch (event->type) + switch (event->type) { case GNUNET_TESTBED_ET_OPERATION_FINISHED: /* Control reaches here when a peer linking operation fails */ if (NULL != event->details.operation_finished.emsg) { - LOG (GNUNET_ERROR_TYPE_WARNING, - _("An operation has failed while linking\n")); printf ("F"); fflush (stdout); - retry_links++; + failed_links++; if (++cont_fails > num_cont_fails) { printf ("\nAborting due to very high failure rate"); print_overlay_links_summary (); GNUNET_SCHEDULER_cancel (abort_task); abort_task = GNUNET_SCHEDULER_add_now (&do_abort, NULL); + return; } } break; case GNUNET_TESTBED_ET_CONNECT: { - static unsigned int established_links; - if (0 != cont_fails) cont_fails--; if (0 == established_links) printf ("Establishing links. Please wait\n"); printf ("."); fflush (stdout); - if (++established_links == num_links) - { - print_overlay_links_summary (); - result = GNUNET_OK; - shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); - } + established_links++; } break; default: GNUNET_assert (0); } + if ((established_links + failed_links) == num_links) + { + print_overlay_links_summary (); + result = GNUNET_OK; + shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + } break; default: GNUNET_assert (0); @@ -618,7 +654,8 @@ register_hosts (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) static void status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, int status) { - GNUNET_SCHEDULER_cancel (abort_task); + if (GNUNET_SCHEDULER_NO_TASK != abort_task) + GNUNET_SCHEDULER_cancel (abort_task); if (GNUNET_OK != status) { mc_proc = NULL; @@ -640,7 +677,10 @@ status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, int stat abort_task = GNUNET_SCHEDULER_add_now (&do_abort, NULL); return; } - register_hosts_task = GNUNET_SCHEDULER_add_now (®ister_hosts, NULL); + if (num_hosts > 1) + register_hosts_task = GNUNET_SCHEDULER_add_now (®ister_hosts, NULL); + else + start_peers (); abort_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &do_abort, NULL); } @@ -678,7 +718,7 @@ run (void *cls, char *const *args, const char *cfgfile, } for (nhost = 0; nhost < num_hosts; nhost++) { - if (GNUNET_YES != GNUNET_TESTBED_is_host_habitable (hosts[nhost])) + if (GNUNET_YES != GNUNET_TESTBED_is_host_habitable (hosts[nhost], config)) { fprintf (stderr, _("Host %s cannot start testbed\n"), GNUNET_TESTBED_host_get_hostname_ (hosts[nhost])); @@ -706,6 +746,41 @@ run (void *cls, char *const *args, const char *cfgfile, } +/** + * Set an option of type 'char *' from the command line. + * A pointer to this function should be passed as part of the + * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options + * of this type. It should be followed by a pointer to a value of + * type 'char *'. + * + * @param ctx command line processing context + * @param scls additional closure (will point to the 'char *', + * which will be allocated) + * @param option name of the option + * @param value actual value of the option (a string) + * @return GNUNET_OK to continue procesing; GNUNET_SYSERR to signal error + */ +int +set_topology (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, + void *scls, const char *option, const char *value) +{ + enum GNUNET_TESTBED_TopologyOption *val = scls; + + if (0 == strncasecmp ("CLIQUE", value, strlen ("CLIQUE"))) + { + *val = GNUNET_TESTBED_TOPOLOGY_CLIQUE; + return GNUNET_OK; + } + if (0 == strncasecmp ("RANDOM", value, strlen ("RANDOM"))) + { + *val = GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI; + return GNUNET_OK; + } + FPRINTF (stderr, "%s", _("Only `CLIQUE' and `RANDOM' are permitted.\n")); + return GNUNET_SYSERR; +} + + /** * Main function. * @@ -724,10 +799,16 @@ main (int argc, char *const *argv) { 'e', "num-errors", "COUNT", gettext_noop ("tolerate COUNT number of continious timeout failures"), GNUNET_YES, &GNUNET_GETOPT_set_uint, &num_cont_fails }, + { 't', "topology", "TOPOLOGY", + gettext_noop ("Try to acheive TOPOLOGY. This options takes either CLIQUE " + "or RANDOM. For CLIQUE the parameter -n is ignored. The " + "default is to acheive a random graph topology."), + GNUNET_YES, &set_topology, &topology }, GNUNET_GETOPT_OPTION_END }; int ret; + topology = GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI; if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) return 2; @@ -736,6 +817,7 @@ main (int argc, char *const *argv) GNUNET_PROGRAM_run (argc, argv, "gnunet-testbed-profiler [OPTIONS] hosts-file", _("Profiler for testbed"), options, &run, NULL); + GNUNET_free ((void*) argv); if (GNUNET_OK != ret) return ret; if (GNUNET_OK != result)