From: Matthias Wachs Date: Thu, 7 Jul 2011 09:53:14 +0000 (+0000) Subject: splitting transport service and ats X-Git-Tag: initial-import-from-subversion-38251~17954 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=5d7a52c9662c9de88312e2701d5c29a70d03c7e6;p=oweals%2Fgnunet.git splitting transport service and ats --- diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 5f369c73f..73239c241 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -919,6 +919,11 @@ static struct GNUNET_STATISTICS_Handle *stats; */ static GNUNET_SCHEDULER_TaskIdentifier hello_task; +/** + * Identifier of ats scheduler task. + */ +static GNUNET_SCHEDULER_TaskIdentifier ats_task; + /** * Is transport service shutting down ? */ @@ -983,8 +988,7 @@ static int update_addr_value (struct ForeignAddressList *fal, uint32_t value , i fal->quality[c].values[1] = fal->quality[c].values[2]; fal->quality[c].values[2] = value; set = GNUNET_YES; - if (ats != NULL) - ats->stat.modified_quality = GNUNET_YES; + ats_modify_problem_state (ats, ATS_QUALITY_UPDATED); } } if (set == GNUNET_NO) @@ -995,8 +999,7 @@ static int update_addr_value (struct ForeignAddressList *fal, uint32_t value , i { fal->ressources[c].c = value; set = GNUNET_YES; - if (ats != NULL) - ats->stat.modified_resources = GNUNET_YES; + ats_modify_problem_state (ats, ATS_COST_UPDATED); } } } @@ -2430,8 +2433,8 @@ plugin_env_session_end (void *cls, } GNUNET_free_non_null(pos->ressources); GNUNET_free_non_null(pos->quality); - if (ats != NULL) - ats->stat.recreate_problem = GNUNET_YES; + ats_modify_problem_state (ats, ATS_MODIFIED); + if (GNUNET_YES != pos->connected) { /* nothing else to do, connection was never up... */ @@ -2603,7 +2606,7 @@ notify_clients_connect (const struct GNUNET_PeerIdentity *peer, /* notify ats about connecting peer */ if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO)) { - ats->stat.recreate_problem = GNUNET_YES; + ats_modify_problem_state(ats, ATS_MODIFIED); ats_calculate_bandwidth_distribution (ats, stats, neighbours); } @@ -2652,7 +2655,7 @@ notify_clients_disconnect (const struct GNUNET_PeerIdentity *peer) /* notify ats about connecting peer */ if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO)) { - ats->stat.recreate_problem = GNUNET_YES; + ats_modify_problem_state(ats, ATS_MODIFIED); ats_calculate_bandwidth_distribution (ats, stats, neighbours); } @@ -4817,8 +4820,7 @@ disconnect_neighbour (struct NeighbourList *n, int check) if (GNUNET_YES == n->received_pong) notify_clients_disconnect (&n->id); - if (ats != NULL) - ats->stat.recreate_problem = GNUNET_YES; + ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED); /* clean up all plugins, cancel connections and pending transmissions */ while (NULL != (rpos = n->plugins)) @@ -5322,19 +5324,16 @@ plugin_env_receive (void *cls, const struct GNUNET_PeerIdentity *peer, //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "GNUNET_MESSAGE_TYPE_TRANSPORT_ATS: %i \n", value); /* Force ressource and quality update */ if ((value == 4) && (ats != NULL)) - { - ats->stat.modified_resources = GNUNET_YES; - ats->stat.modified_quality = GNUNET_YES; - } + ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED); /* Force cost update */ if ((value == 3) && (ats != NULL)) - ats->stat.modified_resources = GNUNET_YES; + ats_modify_problem_state(ats, ATS_COST_UPDATED); /* Force quality update */ if ((value == 2) && (ats != NULL)) - ats->stat.modified_quality = GNUNET_YES; + ats_modify_problem_state(ats, ATS_QUALITY_UPDATED); /* Force full rebuild */ if ((value == 1) && (ats != NULL)) - ats->stat.recreate_problem = GNUNET_YES; + ats_modify_problem_state(ats, ATS_MODIFIED); } #if DEBUG_PING_PONG @@ -6007,6 +6006,13 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_CONTAINER_multihashmap_destroy (validation_map); validation_map = NULL; + if (ats_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel(ats_task); + ats_task = GNUNET_SCHEDULER_NO_TASK; + } + + if (ats != NULL) ats_shutdown (ats); @@ -6060,7 +6066,7 @@ schedule_ats (void *cls, if (ats==NULL) return; - ats->ats_task = GNUNET_SCHEDULER_NO_TASK; + ats_task = GNUNET_SCHEDULER_NO_TASK; if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) return; if (shutdown_in_progress == GNUNET_YES) @@ -6069,7 +6075,7 @@ schedule_ats (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running scheduled calculation\n"); #endif ats_calculate_bandwidth_distribution (ats, stats, neighbours); - ats->ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval, + ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval, &schedule_ats, ats); } @@ -6211,7 +6217,7 @@ run (void *cls, ats = ats_init (cfg); if (ats != NULL) - ats->ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats); + ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats); #if DEBUG_TRANSPORT diff --git a/src/transport/test_transport_ats_4addr.conf b/src/transport/test_transport_ats_4addr.conf index 644224ded..d7301124a 100644 --- a/src/transport/test_transport_ats_4addr.conf +++ b/src/transport/test_transport_ats_4addr.conf @@ -10,7 +10,7 @@ PORT = 2565 PLUGINS = tcp #DEBUG = YES #PREFIX = xterm -e xterm -T transport -e gdb -x cmd --args -#PREFIX = valgrind --tool=memcheck --log-file=logs%p +#PREFIX = valgrind --tool=memcheck --log-file=multiple_peers/logs%p #WAN_BW_LIMIT_DOWN = 100 #WAN_BW_LIMIT_UP = 1000000 #LAN_BW_LIMIT_DOWN = 100 diff --git a/src/transport/test_transport_ats_multiple_peers.c b/src/transport/test_transport_ats_multiple_peers.c index e0cf58c6d..870d6cc5c 100644 --- a/src/transport/test_transport_ats_multiple_peers.c +++ b/src/transport/test_transport_ats_multiple_peers.c @@ -26,6 +26,7 @@ #include "gnunet_transport_service.h" #include "gnunet_scheduler_lib.h" #include "gauger.h" +#include "transport_ats.h" #define VERBOSE GNUNET_NO @@ -36,12 +37,6 @@ #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300) #define SEND_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1) -#define ATS_NEW 0 -#define ATS_Q_UPDATED 1 -#define ATS_C_UPDATED 2 -#define ATS_QC_UPDATED 3 -#define ATS_UNMODIFIED 4 - static int ok; static int peers_left; @@ -290,7 +285,9 @@ stats_cb (void *cls, int is_persistent) { static int printed = GNUNET_NO; - //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value); +#if VERBOSE_ATS + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value); +#endif if (0 == strcmp (name,"ATS invalid solutions")) { if (stats_task != GNUNET_SCHEDULER_NO_TASK) @@ -386,7 +383,7 @@ stats_cb (void *cls, } } - if (current.state == ATS_Q_UPDATED) + if (current.state == ATS_QUALITY_UPDATED) { if (c_modified < MEASUREMENTS) { @@ -469,11 +466,11 @@ stats_cb (void *cls, char * cont; if (value == ATS_NEW) cont = "NEW"; - if (value == ATS_C_UPDATED) + if (value == ATS_COST_UPDATED) cont = "C_UPDATED"; - if (value == ATS_Q_UPDATED) + if (value == ATS_QUALITY_UPDATED) cont = "Q_UPDATED"; - if (value == ATS_QC_UPDATED) + if (value == ATS_QUALITY_COST_UPDATED) cont = "QC_UPDATED"; if (value == ATS_UNMODIFIED) cont = "UNMODIFIED"; diff --git a/src/transport/transport_ats.c b/src/transport/transport_ats.c index fdd8126cd..e04bc9797 100644 --- a/src/transport/transport_ats.c +++ b/src/transport/transport_ats.c @@ -730,7 +730,10 @@ static void _dummy () static void _dummy2 () { + ats_modify_problem_state (NULL, 0); _dummy(); + int t = ATS_COST_UPDATED + ATS_MODIFIED + ATS_NEW; + t = 0; } /* @@ -765,7 +768,6 @@ struct ATS_Handle * ats_init (const struct GNUNET_CONFIGURATION_Handle *cfg) ats->exec_interval = ATS_EXEC_INTERVAL; ats->max_exec_duration = ATS_MAX_EXEC_DURATION; ats->max_iterations = ATS_MAX_ITERATIONS; - ats->ats_task = GNUNET_SCHEDULER_NO_TASK; ats->D = 1.0; ats->U = 1.0; @@ -1497,8 +1499,38 @@ void ats_delete_problem (struct ATS_Handle * ats) ats->stat.valid = GNUNET_SYSERR; } +void ats_modify_problem_state (struct ATS_Handle * ats, enum ATS_problem_state s) +{ + if (ats == NULL) + return; + switch (s) + { + case ATS_NEW : + ats->stat.recreate_problem = GNUNET_NO; + ats->stat.modified_quality = GNUNET_NO; + ats->stat.modified_resources = GNUNET_NO; + break; + case ATS_MODIFIED: + ats->stat.recreate_problem = GNUNET_YES; + break; + case ATS_QUALITY_UPDATED : + ats->stat.modified_quality = GNUNET_YES; + break; + case ATS_COST_UPDATED : + ats->stat.modified_resources = GNUNET_YES; + break; + case ATS_QUALITY_COST_UPDATED: + ats->stat.modified_resources = GNUNET_YES; + ats->stat.modified_quality = GNUNET_YES; + break; + default: + return; + } + +} + void ats_solve_problem (struct ATS_Handle * ats, unsigned int max_it, unsigned int max_dur, @@ -1646,9 +1678,6 @@ void ats_shutdown (struct ATS_Handle * ats) #if DEBUG_ATS GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ATS shutdown\n"); #endif - if (ats->ats_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel(ats->ats_task); - ats->ats_task = GNUNET_SCHEDULER_NO_TASK; ats_delete_problem (ats); _lp_free_env(); @@ -1864,15 +1893,15 @@ ats_calculate_bandwidth_distribution (struct ATS_Handle * ats, GNUNET_STATISTICS_set (stats, "ATS state",ATS_NEW, GNUNET_NO); else if ((ats->stat.modified_resources == GNUNET_YES) && (ats->stat.modified_quality == GNUNET_NO)) - GNUNET_STATISTICS_set (stats, "ATS state", ATS_C_UPDATED, GNUNET_NO); + GNUNET_STATISTICS_set (stats, "ATS state", ATS_COST_UPDATED, GNUNET_NO); else if ((ats->stat.modified_resources == GNUNET_NO) && (ats->stat.modified_quality == GNUNET_YES) && (ats->stat.simplex_rerun_required == GNUNET_NO)) - GNUNET_STATISTICS_set (stats, "ATS state", ATS_Q_UPDATED, GNUNET_NO); + GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_UPDATED, GNUNET_NO); else if ((ats->stat.modified_resources == GNUNET_YES) && (ats->stat.modified_quality == GNUNET_YES) && (ats->stat.simplex_rerun_required == GNUNET_NO)) - GNUNET_STATISTICS_set (stats, "ATS state", ATS_QC_UPDATED, GNUNET_NO); + GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_COST_UPDATED, GNUNET_NO); else if (ats->stat.simplex_rerun_required == GNUNET_NO) GNUNET_STATISTICS_set (stats, "ATS state", ATS_UNMODIFIED, GNUNET_NO); } diff --git a/src/transport/transport_ats.h b/src/transport/transport_ats.h index 9c45a6fb6..49f8d7375 100644 --- a/src/transport/transport_ats.h +++ b/src/transport/transport_ats.h @@ -30,11 +30,40 @@ #define VERY_BIG_DOUBLE_VALUE 100000000000LL -#define ATS_NEW 0 -#define ATS_Q_UPDATED 1 -#define ATS_C_UPDATED 2 -#define ATS_QC_UPDATED 3 -#define ATS_UNMODIFIED 4 +enum ATS_problem_state +{ + /** + * Problem is new / unmodified + */ + ATS_NEW = 0, + + /** + * Problem quality properties were modified + */ + ATS_QUALITY_UPDATED = 1, + + /** + * Problem ressource properties were modified + */ + ATS_COST_UPDATED = 2, + + /** + * Problem quality and ressource properties were modified + */ + ATS_QUALITY_COST_UPDATED = 3, + + /** + * Problem is modified and needs to be completely recalculated + * due to e.g. connecting or disconnecting peers + */ + ATS_MODIFIED = 4, + + /** + * Problem is modified and needs to be completely recalculated + * due to e.g. connecting or disconnecting peers + */ + ATS_UNMODIFIED = 8 +}; /* * ATS data structures @@ -162,11 +191,6 @@ struct ATS_Handle void * prob; #endif - /** - * task to recalculate the bandwidth assignment - */ - GNUNET_SCHEDULER_TaskIdentifier ats_task; - /** * Current state of the GLPK problem */ @@ -378,6 +402,9 @@ ats_create_problem (struct ATS_Handle * ats, int v_n_min, struct ATS_stat *stat); +void ats_modify_problem_state (struct ATS_Handle * ats, + enum ATS_problem_state s); + void ats_calculate_bandwidth_distribution (struct ATS_Handle * ats, struct GNUNET_STATISTICS_Handle *stats,