diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2013-08-29 05:07:23 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2013-08-29 05:07:23 +0000 |
commit | 820c4b7a674c46374d9c6e246be81db9bdef8cf5 (patch) | |
tree | f136c72b298e3c561f73c288a7caa07d268f4843 /src/testbed/testbed_api_operations.c | |
parent | f119c5a88b06a05349f311c27f27be9a2760bf3f (diff) | |
download | gnunet-820c4b7a674c46374d9c6e246be81db9bdef8cf5.tar.gz gnunet-820c4b7a674c46374d9c6e246be81db9bdef8cf5.zip |
- average with failure operation time as overhead
Diffstat (limited to 'src/testbed/testbed_api_operations.c')
-rw-r--r-- | src/testbed/testbed_api_operations.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/testbed/testbed_api_operations.c b/src/testbed/testbed_api_operations.c index c09ec366a..2ca5a4cf2 100644 --- a/src/testbed/testbed_api_operations.c +++ b/src/testbed/testbed_api_operations.c | |||
@@ -137,6 +137,11 @@ struct FeedbackCtx | |||
137 | */ | 137 | */ |
138 | unsigned int max_active_bound; | 138 | unsigned int max_active_bound; |
139 | 139 | ||
140 | /** | ||
141 | * Number of operations that have failed | ||
142 | */ | ||
143 | unsigned int nfailed; | ||
144 | |||
140 | }; | 145 | }; |
141 | 146 | ||
142 | 147 | ||
@@ -816,6 +821,7 @@ adaptive_queue_set_max_active (struct OperationQueue *queue, unsigned int n) | |||
816 | cleanup_tslots (queue); | 821 | cleanup_tslots (queue); |
817 | n = GNUNET_MIN (n ,fctx->max_active_bound); | 822 | n = GNUNET_MIN (n ,fctx->max_active_bound); |
818 | fctx->tslots_freeptr = GNUNET_malloc (n * sizeof (struct TimeSlot)); | 823 | fctx->tslots_freeptr = GNUNET_malloc (n * sizeof (struct TimeSlot)); |
824 | fctx->nfailed = 0; | ||
819 | for (cnt = 0; cnt < n; cnt++) | 825 | for (cnt = 0; cnt < n; cnt++) |
820 | { | 826 | { |
821 | tslot = &fctx->tslots_freeptr[cnt]; | 827 | tslot = &fctx->tslots_freeptr[cnt]; |
@@ -831,10 +837,9 @@ adaptive_queue_set_max_active (struct OperationQueue *queue, unsigned int n) | |||
831 | * the feedback context. | 837 | * the feedback context. |
832 | * | 838 | * |
833 | * @param queue the queue | 839 | * @param queue the queue |
834 | * @param fail GNUNET_YES if the last operation failed; GNUNET_NO if not; | ||
835 | */ | 840 | */ |
836 | static void | 841 | static void |
837 | adapt_parallelism (struct OperationQueue *queue, int fail) | 842 | adapt_parallelism (struct OperationQueue *queue) |
838 | { | 843 | { |
839 | struct GNUNET_TIME_Relative avg; | 844 | struct GNUNET_TIME_Relative avg; |
840 | struct FeedbackCtx *fctx; | 845 | struct FeedbackCtx *fctx; |
@@ -853,6 +858,16 @@ adapt_parallelism (struct OperationQueue *queue, int fail) | |||
853 | nvals += tslot->nvals; | 858 | nvals += tslot->nvals; |
854 | } | 859 | } |
855 | GNUNET_assert (nvals >= queue->max_active); | 860 | GNUNET_assert (nvals >= queue->max_active); |
861 | GNUNET_assert (fctx->nfailed <= nvals); | ||
862 | nvals -= fctx->nfailed; | ||
863 | if (0 == nvals) | ||
864 | { | ||
865 | if (1 == queue->max_active) | ||
866 | adaptive_queue_set_max_active (queue, 1); | ||
867 | else | ||
868 | adaptive_queue_set_max_active (queue, queue->max_active / 2); | ||
869 | return; | ||
870 | } | ||
856 | avg = GNUNET_TIME_relative_divide (avg, nvals); | 871 | avg = GNUNET_TIME_relative_divide (avg, nvals); |
857 | if (GNUNET_SYSERR == | 872 | if (GNUNET_SYSERR == |
858 | GNUNET_TESTBED_SD_deviation_factor_ (fctx->sd, | 873 | GNUNET_TESTBED_SD_deviation_factor_ (fctx->sd, |
@@ -863,17 +878,16 @@ adapt_parallelism (struct OperationQueue *queue, int fail) | |||
863 | adaptive_queue_set_max_active (queue, queue->max_active); /* no change */ | 878 | adaptive_queue_set_max_active (queue, queue->max_active); /* no change */ |
864 | return; | 879 | return; |
865 | } | 880 | } |
866 | if ((0 == GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, queue->max_active))) | ||
867 | GNUNET_TESTBED_SD_add_data_ (fctx->sd, (unsigned int) avg.rel_value_us); | ||
868 | if (sd < 0) | 881 | if (sd < 0) |
869 | sd = 0; | 882 | sd = 0; |
870 | GNUNET_assert (0 <= sd); | 883 | GNUNET_assert (0 <= sd); |
871 | if ((0 == sd) && (! fail)) | 884 | GNUNET_TESTBED_SD_add_data_ (fctx->sd, (unsigned int) avg.rel_value_us); |
885 | if (0 == sd) | ||
872 | { | 886 | { |
873 | adaptive_queue_set_max_active (queue, queue->max_active * 2); | 887 | adaptive_queue_set_max_active (queue, queue->max_active * 2); |
874 | return; | 888 | return; |
875 | } | 889 | } |
876 | if ((1 == sd) && (! fail)) | 890 | if (1 == sd) |
877 | { | 891 | { |
878 | adaptive_queue_set_max_active (queue, queue->max_active + 1); | 892 | adaptive_queue_set_max_active (queue, queue->max_active + 1); |
879 | return; | 893 | return; |
@@ -883,7 +897,7 @@ adapt_parallelism (struct OperationQueue *queue, int fail) | |||
883 | adaptive_queue_set_max_active (queue, 1); | 897 | adaptive_queue_set_max_active (queue, 1); |
884 | return; | 898 | return; |
885 | } | 899 | } |
886 | if (((sd < 2) && (fail)) || (2 == sd)) | 900 | if (2 == sd) |
887 | { | 901 | { |
888 | adaptive_queue_set_max_active (queue, queue->max_active - 1); | 902 | adaptive_queue_set_max_active (queue, queue->max_active - 1); |
889 | return; | 903 | return; |
@@ -912,16 +926,18 @@ update_tslots (struct GNUNET_TESTBED_Operation *op) | |||
912 | { | 926 | { |
913 | queue = tslot->queue; | 927 | queue = tslot->queue; |
914 | fctx = queue->fctx; | 928 | fctx = queue->fctx; |
915 | tslot->tsum = GNUNET_TIME_relative_add (tslot->tsum, t); | ||
916 | GNUNET_CONTAINER_DLL_remove (op->tslots_head, op->tslots_tail, tslot); | 929 | GNUNET_CONTAINER_DLL_remove (op->tslots_head, op->tslots_tail, tslot); |
917 | tslot->op = NULL; | 930 | tslot->op = NULL; |
918 | GNUNET_CONTAINER_DLL_insert_tail (fctx->alloc_head, fctx->alloc_tail, | 931 | GNUNET_CONTAINER_DLL_insert_tail (fctx->alloc_head, fctx->alloc_tail, |
919 | tslot); | 932 | tslot); |
933 | if (op->failed) | ||
934 | fctx->nfailed++; | ||
935 | tslot->tsum = GNUNET_TIME_relative_add (tslot->tsum, t); | ||
920 | if (0 != tslot->nvals++) | 936 | if (0 != tslot->nvals++) |
921 | continue; | 937 | continue; |
922 | fctx->tslots_filled++; | 938 | fctx->tslots_filled++; |
923 | if (queue->max_active == fctx->tslots_filled) | 939 | if (queue->max_active == fctx->tslots_filled) |
924 | adapt_parallelism (queue, op->failed); | 940 | adapt_parallelism (queue); |
925 | } | 941 | } |
926 | } | 942 | } |
927 | 943 | ||