aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/testbed_api_operations.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-08-29 05:07:23 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-08-29 05:07:23 +0000
commit820c4b7a674c46374d9c6e246be81db9bdef8cf5 (patch)
treef136c72b298e3c561f73c288a7caa07d268f4843 /src/testbed/testbed_api_operations.c
parentf119c5a88b06a05349f311c27f27be9a2760bf3f (diff)
downloadgnunet-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.c36
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 */
836static void 841static void
837adapt_parallelism (struct OperationQueue *queue, int fail) 842adapt_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