diff options
author | Julius Bünger <buenger@mytum.de> | 2015-01-22 23:08:42 +0000 |
---|---|---|
committer | Julius Bünger <buenger@mytum.de> | 2015-01-22 23:08:42 +0000 |
commit | bffe57690709d934d5b7b0013607d561628e3a25 (patch) | |
tree | f75f6fed5ab82eabead1ad1c6d68294c03bdb252 /src | |
parent | cb0c0d02486a041fb0f04f1b1f6f85c5f8d329f6 (diff) | |
download | gnunet-bffe57690709d934d5b7b0013607d561628e3a25.tar.gz gnunet-bffe57690709d934d5b7b0013607d561628e3a25.zip |
moved the client request rate estimation in fkt of its own
Diffstat (limited to 'src')
-rw-r--r-- | src/rps/gnunet-service-rps.c | 70 |
1 files changed, 44 insertions, 26 deletions
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) | |||
683 | RPS_sampler_update_list (peer); | 683 | RPS_sampler_update_list (peer); |
684 | } | 684 | } |
685 | 685 | ||
686 | |||
686 | /** | 687 | /** |
687 | * Check whether #insert_in_sampler was already scheduled | 688 | * Check whether #insert_in_sampler was already scheduled |
688 | */ | 689 | */ |
@@ -725,6 +726,45 @@ resize_wrapper () | |||
725 | } | 726 | } |
726 | 727 | ||
727 | 728 | ||
729 | /** | ||
730 | * Estimate request rate | ||
731 | * | ||
732 | * Called every time we receive a request from the client. | ||
733 | */ | ||
734 | void | ||
735 | est_request_rate() | ||
736 | { | ||
737 | struct GNUNET_TIME_Relative max_round_duration; | ||
738 | |||
739 | if (request_deltas_size > req_counter) | ||
740 | req_counter++; | ||
741 | if ( 1 < req_counter) | ||
742 | { | ||
743 | /* Shift last request deltas to the right */ | ||
744 | memcpy (&request_deltas[1], | ||
745 | request_deltas, | ||
746 | (req_counter - 1) * sizeof (struct GNUNET_TIME_Relative)); | ||
747 | |||
748 | /* Add current delta to beginning */ | ||
749 | request_deltas[0] = GNUNET_TIME_absolute_get_difference (last_request, | ||
750 | GNUNET_TIME_absolute_get ()); | ||
751 | request_rate = T_relative_avg (request_deltas, req_counter); | ||
752 | |||
753 | /* Compute the duration a round will maximally take */ | ||
754 | max_round_duration = GNUNET_TIME_relative_add (round_interval, | ||
755 | GNUNET_TIME_relative_divide (round_interval, 2)); | ||
756 | |||
757 | /* Set the estimated size the sampler has to have to | ||
758 | * satisfy the current client request rate */ | ||
759 | sampler_size_client_need = max_round_duration.rel_value_us / request_rate.rel_value_us; | ||
760 | |||
761 | /* Resize the sampler */ | ||
762 | resize_wrapper (); | ||
763 | } | ||
764 | last_request = GNUNET_TIME_absolute_get (); | ||
765 | } | ||
766 | |||
767 | |||
728 | /*********************************************************************** | 768 | /*********************************************************************** |
729 | * /Util functions | 769 | * /Util functions |
730 | ***********************************************************************/ | 770 | ***********************************************************************/ |
@@ -812,37 +852,15 @@ handle_client_request (void *cls, | |||
812 | { | 852 | { |
813 | struct GNUNET_RPS_CS_RequestMessage *msg; | 853 | struct GNUNET_RPS_CS_RequestMessage *msg; |
814 | uint32_t num_peers; | 854 | uint32_t num_peers; |
815 | struct GNUNET_TIME_Relative max_round_duration; | 855 | uint32_t i; |
816 | |||
817 | |||
818 | /* Estimate request rate */ | ||
819 | if (request_deltas_size > req_counter) | ||
820 | req_counter++; | ||
821 | if ( 1 < req_counter) | ||
822 | { | ||
823 | /* Shift last request deltas to the right */ | ||
824 | memcpy (&request_deltas[1], | ||
825 | request_deltas, | ||
826 | (req_counter - 1) * sizeof (struct GNUNET_TIME_Relative)); | ||
827 | /* Add current delta to beginning */ | ||
828 | request_deltas[0] = GNUNET_TIME_absolute_get_difference (last_request, | ||
829 | GNUNET_TIME_absolute_get ()); | ||
830 | request_rate = T_relative_avg (request_deltas, req_counter); | ||
831 | |||
832 | max_round_duration = GNUNET_TIME_relative_add (round_interval, | ||
833 | GNUNET_TIME_relative_divide (round_interval, 2)); | ||
834 | sampler_size_client_need = max_round_duration.rel_value_us / request_rate.rel_value_us; | ||
835 | |||
836 | resize_wrapper (); | ||
837 | } | ||
838 | last_request = GNUNET_TIME_absolute_get (); | ||
839 | |||
840 | 856 | ||
841 | // TODO check message size | ||
842 | msg = (struct GNUNET_RPS_CS_RequestMessage *) message; | 857 | msg = (struct GNUNET_RPS_CS_RequestMessage *) message; |
843 | 858 | ||
844 | num_peers = ntohl (msg->num_peers); | 859 | num_peers = ntohl (msg->num_peers); |
845 | 860 | ||
861 | for (i = 0 ; i < num_peers ; i++) | ||
862 | est_request_rate(); | ||
863 | |||
846 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Client requested %" PRIX32 " random peer(s).\n", num_peers); | 864 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Client requested %" PRIX32 " random peer(s).\n", num_peers); |
847 | 865 | ||
848 | RPS_sampler_get_n_rand_peers (client_respond, client, num_peers, GNUNET_YES); | 866 | RPS_sampler_get_n_rand_peers (client_respond, client, num_peers, GNUNET_YES); |