X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnse%2Fgnunet-nse-profiler.c;h=b8fa293d58de6faf86dcf5095a660b044eac89a9;hb=80d2de6cdc4d253c7fbc6a4bc067d856aab9cca9;hp=7803ca9477841db025eaa028eac66e74348e82fb;hpb=f370c86facf153f3f96f4737ddb3cb67007747d8;p=oweals%2Fgnunet.git diff --git a/src/nse/gnunet-nse-profiler.c b/src/nse/gnunet-nse-profiler.c index 7803ca947..b8fa293d5 100644 --- a/src/nse/gnunet-nse-profiler.c +++ b/src/nse/gnunet-nse-profiler.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2011, 2012 Christian Grothoff (and other contributing authors) + Copyright (C) 2011, 2012 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** * @file nse/gnunet-nse-profiler.c @@ -83,39 +83,6 @@ struct NSEPeer }; -/** - * Context for the stats task? - */ -struct StatsContext -{ - - /** - * How many messages have peers received during the test. - */ - unsigned long long total_nse_received_messages; - - /** - * How many messages have peers send during the test (should be == received). - */ - unsigned long long total_nse_transmitted_messages; - - /** - * How many messages have travelled an edge in both directions. - */ - unsigned long long total_nse_cross; - - /** - * How many extra messages per edge (corrections) have been received. - */ - unsigned long long total_nse_extra; - - /** - * How many messages have been discarded. - */ - unsigned long long total_discarded; -}; - - /** * Operation map entry */ @@ -136,6 +103,11 @@ struct OpListEntry */ struct GNUNET_TESTBED_Operation *op; + /** + * Depending on whether we start or stop NSE service at the peer set this to 1 + * or -1 + */ + int delta; }; @@ -161,7 +133,7 @@ static int verbose; /** * Name of the file with the hosts to run the test over (configuration option) - */ + */ static char *hosts_file; /** @@ -207,7 +179,7 @@ static struct GNUNET_CONFIGURATION_Handle *testing_cfg; /** * The shutdown task */ -static GNUNET_SCHEDULER_TaskIdentifier shutdown_task_id; +static struct GNUNET_SCHEDULER_Task * shutdown_task_id; /** * Maximum number of connections to NSE services. @@ -298,11 +270,11 @@ close_monitor_connections () static void shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - shutdown_task_id = GNUNET_SCHEDULER_NO_TASK; + shutdown_task_id = NULL; if (GNUNET_YES == shutting_down) return; shutting_down = GNUNET_YES; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ending test.\n"); + LOG_DEBUG ("Ending test.\n"); close_monitor_connections (); if (NULL != data_file) { @@ -326,7 +298,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) static void shutdown_now () { - if (GNUNET_SCHEDULER_NO_TASK != shutdown_task_id) + if (NULL != shutdown_task_id) GNUNET_SCHEDULER_cancel (shutdown_task_id); shutdown_task_id = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); } @@ -342,7 +314,7 @@ shutdown_now () * of the size estimation values seen */ static void -handle_estimate (void *cls, +handle_estimate (void *cls, struct GNUNET_TIME_Absolute timestamp, double estimate, double std_dev) { @@ -357,11 +329,11 @@ handle_estimate (void *cls, peer, estimate, std_dev); return; } - size = GNUNET_snprintf (output_buffer, + size = GNUNET_snprintf (output_buffer, sizeof (output_buffer), "%p %llu %llu %f %f %f\n", peer, peers_running, - timestamp.abs_value, + (unsigned long long) timestamp.abs_value_us, GNUNET_NSE_log_estimate_to_n (estimate), estimate, std_dev); if (size != GNUNET_DISK_file_write (output_file, output_buffer, size)) @@ -373,7 +345,7 @@ handle_estimate (void *cls, /** * Adapter function called to establish a connection to * NSE service. - * + * * @param cls closure (the 'struct NSEPeer') * @param cfg configuration of the peer to connect to; will be available until * GNUNET_TESTBED_operation_done() is called on the operation returned @@ -393,11 +365,11 @@ nse_connect_adapter (void *cls, /** * Adapter function called to destroy a connection to * NSE service. - * + * * @param cls closure * @param op_result service handle returned from the connect adapter */ -static void +static void nse_disconnect_adapter (void *cls, void *op_result) { @@ -408,17 +380,18 @@ nse_disconnect_adapter (void *cls, /** * Callback function to process statistic values. * - * @param cls struct StatsContext - * @param peer the peer the statistics belong to + * @param cls `struct NSEPeer` * @param subsystem name of subsystem that created the statistic * @param name the name of the datum * @param value the current value - * @param is_persistent GNUNET_YES if the value is persistent, GNUNET_NO if not - * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration + * @param is_persistent #GNUNET_YES if the value is persistent, #GNUNET_NO if not + * @return #GNUNET_OK to continue, #GNUNET_SYSERR to abort iteration */ static int -stat_iterator (void *cls, const char *subsystem, const char *name, - uint64_t value, int is_persistent) +stat_iterator (void *cls, + const char *subsystem, + const char *name, + uint64_t value, int is_persistent) { char *output_buffer; struct GNUNET_TIME_Absolute now; @@ -431,12 +404,15 @@ stat_iterator (void *cls, const char *subsystem, const char *name, if (0 != flag) flag = 1; size = GNUNET_asprintf (&output_buffer, "%llu %llu %u\n", - now.abs_value/1000, value, flag); + now.abs_value_us / 1000LL / 1000LL, + value, flag); if (size != GNUNET_DISK_file_write (data_file, output_buffer, size)) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Unable to write to file!\n"); + GNUNET_free (output_buffer); return GNUNET_SYSERR; } + GNUNET_free (output_buffer); return GNUNET_OK; } @@ -455,7 +431,7 @@ stat_connect_adapter (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg) { struct NSEPeer *peer = cls; - + peer->sh = GNUNET_STATISTICS_create ("nse-profiler", cfg); return peer->sh; } @@ -526,19 +502,18 @@ connect_nse_service () unsigned int connections; if (0 == connection_limit) - return; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting to nse service of peers\n"); + return; + LOG_DEBUG ("Connecting to nse service of peers\n"); connections = 0; for (i = 0; i < num_peers_in_round[current_round]; i++) { - if ((num_peers_in_round[current_round] > connection_limit) && + if ((num_peers_in_round[current_round] > connection_limit) && (0 != (i % (num_peers_in_round[current_round] / connection_limit)))) continue; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "nse-profiler: connecting to nse service of peer %d\n", i); - current_peer = GNUNET_malloc (sizeof (struct NSEPeer)); + LOG_DEBUG ("Connecting to nse service of peer %d\n", i); + current_peer = GNUNET_new (struct NSEPeer); current_peer->daemon = daemons[i]; - current_peer->nse_op + current_peer->nse_op = GNUNET_TESTBED_service_connect (NULL, current_peer->daemon, "nse", @@ -570,7 +545,7 @@ connect_nse_service () * @param tc scheduler context (unused) */ static void -next_round (void *cls, +next_round (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); @@ -583,7 +558,7 @@ next_round (void *cls, * @param tc unused */ static void -finish_round (void *cls, +finish_round (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) @@ -618,25 +593,34 @@ make_oplist_entry () { struct OpListEntry *entry; - entry = GNUNET_malloc (sizeof (struct OpListEntry)); + entry = GNUNET_new (struct OpListEntry); GNUNET_CONTAINER_DLL_insert_tail (oplist_head, oplist_tail, entry); return entry; } /** - * Functions of this signature are called when a peer has been successfully - * started or stopped. + * Callback to be called when NSE service is started or stopped at peers * * @param cls NULL + * @param op the operation handle * @param emsg NULL on success; otherwise an error description */ -static void -peer_churn_cb (void *cls, const char *emsg) +static void +manage_service_cb (void *cls, struct GNUNET_TESTBED_Operation *op, + const char *emsg) { struct OpListEntry *entry = cls; - + GNUNET_TESTBED_operation_done (entry->op); + if (NULL != emsg) + { + LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to start/stop NSE at a peer\n"); + GNUNET_SCHEDULER_shutdown (); + return; + } + GNUNET_assert (0 != entry->delta); + peers_running += entry->delta; GNUNET_CONTAINER_DLL_remove (oplist_head, oplist_tail, entry); GNUNET_free (entry); if (num_peers_in_round[current_round] == peers_running) @@ -658,15 +642,25 @@ adjust_running_peers () for (i=peers_running;iop = GNUNET_TESTBED_peer_start (NULL, daemons[i], - &peer_churn_cb, entry); + entry->delta = 1; + entry->op = GNUNET_TESTBED_peer_manage_service (NULL, + daemons[i], + "nse", + &manage_service_cb, + entry, + 1); } /* stop peers if we have too many */ for (i=num_peers_in_round[current_round];iop = GNUNET_TESTBED_peer_stop (NULL, daemons[i], - &peer_churn_cb, entry); + entry->delta = -1; + entry->op = GNUNET_TESTBED_peer_manage_service (NULL, + daemons[i], + "nse", + &manage_service_cb, + entry, + 0); } } @@ -679,13 +673,13 @@ adjust_running_peers () * @param tc unused */ static void -next_round (void *cls, +next_round (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) return; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "disconnecting nse service of peers\n"); - current_round++; + LOG_DEBUG ("Disconnecting nse service of peers\n"); + current_round++; if (current_round == num_rounds) { /* this was the last round, terminate */ @@ -711,17 +705,11 @@ next_round (void *cls, * @param event information on what is happening */ static void -master_controller_cb (void *cls, +master_controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) { switch (event->type) { - case GNUNET_TESTBED_ET_PEER_START: - peers_running++; - break; - case GNUNET_TESTBED_ET_PEER_STOP: - peers_running--; - break; case GNUNET_TESTBED_ET_CONNECT: total_connections++; break; @@ -738,6 +726,7 @@ master_controller_cb (void *cls, * Signature of a main function for a testcase. * * @param cls NULL + * @param h the run handle * @param num_peers_ number of peers in 'peers' * @param peers handle to peers run in the testbed. NULL upon timeout (see * GNUNET_TESTBED_test_run()). @@ -746,8 +735,9 @@ master_controller_cb (void *cls, * @param links_failed the number of overlay link connection attempts that * failed */ -static void +static void test_master (void *cls, + struct GNUNET_TESTBED_RunHandle *h, unsigned int num_peers_, struct GNUNET_TESTBED_Peer **peers, unsigned int links_succeeded, @@ -785,11 +775,11 @@ run (void *cls, char *const *args, const char *cfgfile, { char *tok; uint64_t event_mask; - unsigned int num; + unsigned int num; ok = 1; testing_cfg = GNUNET_CONFIGURATION_dup (cfg); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting daemons.\n"); + LOG_DEBUG ("Starting daemons.\n"); if (NULL == num_peer_spec) { fprintf (stderr, "You need to specify the number of peers to run\n"); @@ -816,7 +806,7 @@ run (void *cls, char *const *args, const char *cfgfile, return; } if ( (NULL != data_filename) && - (NULL == (data_file = + (NULL == (data_file = GNUNET_DISK_file_open (data_filename, GNUNET_DISK_OPEN_READWRITE | GNUNET_DISK_OPEN_TRUNCATE | @@ -849,7 +839,7 @@ run (void *cls, char *const *args, const char *cfgfile, NULL, /* master_controller_cb cls */ &test_master, NULL); /* test_master cls */ - shutdown_task_id = + shutdown_task_id = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, NULL); }