From 015238ce88ad391ad693f9395ec247e0a53f8d40 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Wed, 16 May 2012 16:49:44 +0000 Subject: [PATCH] - suggestion throtteling as described in 2362 --- src/ats/gnunet-service-ats_addresses.c | 27 ++++++++++++++++++++++++++ src/ats/gnunet-service-ats_addresses.h | 10 ++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 865460452..096a98314 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -37,6 +37,8 @@ #define VERBOSE GNUNET_NO +#define ATS_BLOCKING_DELTA GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 100) + enum ATS_Mode { /* @@ -169,6 +171,8 @@ create_address (const struct GNUNET_PeerIdentity *peer, aa->plugin = GNUNET_strdup (plugin_name); aa->session_id = session_id; aa->mlp_information = NULL; + aa->blocked_until = GNUNET_TIME_absolute_get_zero(); + aa->block_interval = GNUNET_TIME_relative_get_zero(); aa->next = NULL; aa->prev = NULL; return aa; @@ -546,6 +550,26 @@ find_address_it (void *cls, const GNUNET_HashCode * key, void *value) struct ATS_Address **ap = cls; struct ATS_Address *aa = (struct ATS_Address *) value; struct ATS_Address *ab = *ap; + struct GNUNET_TIME_Absolute now; + + now = GNUNET_TIME_absolute_get(); + + if (aa->blocked_until.abs_value == GNUNET_TIME_absolute_max (now, aa->blocked_until).abs_value) + { + /* This address is blocked for suggestion */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Address %p blocked for suggestion for %llu ms \n", + aa, + GNUNET_TIME_absolute_get_difference(now, aa->blocked_until).rel_value); + return GNUNET_OK; + } + + + aa->block_interval = GNUNET_TIME_relative_add (aa->block_interval, ATS_BLOCKING_DELTA); + aa->blocked_until = GNUNET_TIME_absolute_add (now, aa->block_interval); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Address %p ready for suggestion, block interval now %llu \n", aa, aa->block_interval); if (NULL == ab) { @@ -678,6 +702,9 @@ void request_address_simple (const struct GNUNET_PeerIdentity *peer) return; } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK, + "Suggesting address %p for peer `%s'\n", aa, GNUNET_i2s (peer)); + if (aa->active == GNUNET_NO) { aa->active = GNUNET_YES; diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 0ef977b5d..fbe1fc994 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -74,6 +74,16 @@ struct ATS_Address struct GNUNET_BANDWIDTH_Value32NBO assigned_bw_out; + /** + * Blocking interval + */ + struct GNUNET_TIME_Relative block_interval; + + /** + * Time when address can be suggested again + */ + struct GNUNET_TIME_Absolute blocked_until; + /** * Is this the active address for this peer? */ -- 2.25.1