From bffe57690709d934d5b7b0013607d561628e3a25 Mon Sep 17 00:00:00 2001 From: Julius Bünger Date: Thu, 22 Jan 2015 23:08:42 +0000 Subject: moved the client request rate estimation in fkt of its own --- src/rps/gnunet-service-rps.c | 70 ++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/rps/gnunet-service-rps.c b/src/rps/gnunet-service-rps.c index 58c986247..278276aff 100644 --- a/src/rps/gnunet-service-rps.c +++ b/src/rps/gnunet-service-rps.c @@ -683,6 +683,7 @@ insert_in_sampler (void *cls, const struct GNUNET_PeerIdentity *peer) RPS_sampler_update_list (peer); } + /** * Check whether #insert_in_sampler was already scheduled */ @@ -725,6 +726,45 @@ resize_wrapper () } +/** + * Estimate request rate + * + * Called every time we receive a request from the client. + */ + void +est_request_rate() +{ + struct GNUNET_TIME_Relative max_round_duration; + + if (request_deltas_size > req_counter) + req_counter++; + if ( 1 < req_counter) + { + /* Shift last request deltas to the right */ + memcpy (&request_deltas[1], + request_deltas, + (req_counter - 1) * sizeof (struct GNUNET_TIME_Relative)); + + /* Add current delta to beginning */ + request_deltas[0] = GNUNET_TIME_absolute_get_difference (last_request, + GNUNET_TIME_absolute_get ()); + request_rate = T_relative_avg (request_deltas, req_counter); + + /* Compute the duration a round will maximally take */ + max_round_duration = GNUNET_TIME_relative_add (round_interval, + GNUNET_TIME_relative_divide (round_interval, 2)); + + /* Set the estimated size the sampler has to have to + * satisfy the current client request rate */ + sampler_size_client_need = max_round_duration.rel_value_us / request_rate.rel_value_us; + + /* Resize the sampler */ + resize_wrapper (); + } + last_request = GNUNET_TIME_absolute_get (); +} + + /*********************************************************************** * /Util functions ***********************************************************************/ @@ -812,37 +852,15 @@ handle_client_request (void *cls, { struct GNUNET_RPS_CS_RequestMessage *msg; uint32_t num_peers; - struct GNUNET_TIME_Relative max_round_duration; - - - /* Estimate request rate */ - if (request_deltas_size > req_counter) - req_counter++; - if ( 1 < req_counter) - { - /* Shift last request deltas to the right */ - memcpy (&request_deltas[1], - request_deltas, - (req_counter - 1) * sizeof (struct GNUNET_TIME_Relative)); - /* Add current delta to beginning */ - request_deltas[0] = GNUNET_TIME_absolute_get_difference (last_request, - GNUNET_TIME_absolute_get ()); - request_rate = T_relative_avg (request_deltas, req_counter); - - max_round_duration = GNUNET_TIME_relative_add (round_interval, - GNUNET_TIME_relative_divide (round_interval, 2)); - sampler_size_client_need = max_round_duration.rel_value_us / request_rate.rel_value_us; - - resize_wrapper (); - } - last_request = GNUNET_TIME_absolute_get (); - + uint32_t i; - // TODO check message size msg = (struct GNUNET_RPS_CS_RequestMessage *) message; num_peers = ntohl (msg->num_peers); + for (i = 0 ; i < num_peers ; i++) + est_request_rate(); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Client requested %" PRIX32 " random peer(s).\n", num_peers); RPS_sampler_get_n_rand_peers (client_respond, client, num_peers, GNUNET_YES); -- cgit v1.2.3