dhtlog updates
[oweals/gnunet.git] / src / util / bandwidth.c
index 45f702f41a910e9261c757f822ed3c2c00e40005..e47df4382a48562fdb4df896ab6850b2aaaf64c8 100644 (file)
@@ -27,7 +27,7 @@
 #include "gnunet_bandwidth_lib.h"
 #include "gnunet_server_lib.h"
 
-#define DEBUG_BANDWIDTH GNUNET_YES
+#define DEBUG_BANDWIDTH GNUNET_NO
 
 /**
  * Create a new bandwidth value.
@@ -84,10 +84,10 @@ GNUNET_BANDWIDTH_value_get_available_until (struct GNUNET_BANDWIDTH_Value32NBO b
 #if DEBUG_BANDWIDTH
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Bandwidth has %llu bytes available until deadline in %llums\n",
-             (unsigned long long) (b * deadline.value / 1000LL),
+             (unsigned long long) ((b * deadline.value + 500LL) / 1000LL),
              deadline.value);
 #endif
-  return b * deadline.value / 1000LL;
+  return (b * deadline.value + 500LL) / 1000LL;
 }
 
 
@@ -169,46 +169,22 @@ static void
 update_tracker (struct GNUNET_BANDWIDTH_Tracker *av)
 {
   struct GNUNET_TIME_Absolute now;
-  uint64_t avail_per_ms;
   uint64_t delta_time;
   uint64_t delta_avail;
   uint64_t left_bytes;
-  uint64_t left_time_ms;
+  uint64_t max_carry;
 
   now = GNUNET_TIME_absolute_get ();
   delta_time = now.value - av->last_update__.value;
-  delta_avail = (delta_time * ((unsigned long long) av->available_bytes_per_s__)) / 1000LL;
-  if (av->consumption_since_last_update__ >= delta_avail)
+  delta_avail = (delta_time * ((unsigned long long) av->available_bytes_per_s__) + 500LL) / 1000LL;
+  av->consumption_since_last_update__ -= delta_avail;
+  av->last_update__ = now;
+  if (av->consumption_since_last_update__ < 0)
     {
-      av->consumption_since_last_update__ -= delta_avail;
-      av->last_update__ = now;
-    }
-  else
-    {
-      left_bytes = delta_avail - av->consumption_since_last_update__;
-      avail_per_ms = ((unsigned long long) av->available_bytes_per_s__) / 1000LL;
-      if (avail_per_ms > 0)
-       {
-         left_time_ms = left_bytes / avail_per_ms;       
-         if (left_time_ms > ((unsigned long long) av->max_carry_s__) * 1000LL)
-           {
-             /* need to limit accumulation of unused bandwidth */
-             left_time_ms = ((unsigned long long) av->max_carry_s__) * 1000LL;
-             if (left_time_ms * avail_per_ms < GNUNET_SERVER_MAX_MESSAGE_SIZE)
-               {
-                 /* need to still allow GNUNET_SERVER_MAX_MESSAGE_SIZE accumulation */
-                 if (left_bytes > GNUNET_SERVER_MAX_MESSAGE_SIZE)
-                   left_bytes = GNUNET_SERVER_MAX_MESSAGE_SIZE;
-                 left_time_ms = left_bytes / avail_per_ms;
-               }
-           }
-       }
-      else
-        {
-           left_time_ms = 0;
-       }
-      av->consumption_since_last_update__ = 0;
-      av->last_update__.value = now.value - left_time_ms;
+      left_bytes = - av->consumption_since_last_update__;
+      max_carry = av->available_bytes_per_s__ * av->max_carry_s__;
+      if (max_carry > left_bytes)
+       av->consumption_since_last_update__ = -max_carry;
     }
 #if DEBUG_BANDWIDTH
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -235,7 +211,7 @@ int
 GNUNET_BANDWIDTH_tracker_consume (struct GNUNET_BANDWIDTH_Tracker *av,
                                  ssize_t size)
 {
-  uint64_t nc;
+  int64_t nc;
 
 #if DEBUG_BANDWIDTH
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -266,8 +242,7 @@ GNUNET_BANDWIDTH_tracker_consume (struct GNUNET_BANDWIDTH_Tracker *av,
     }
   else
     {
-      av->last_update__.value -= (size * av->available_bytes_per_s__) / 1000LL;
-      update_tracker (av);
+      av->consumption_since_last_update__ += size;
     }
   return GNUNET_NO;
 }
@@ -287,10 +262,7 @@ GNUNET_BANDWIDTH_tracker_get_delay (struct GNUNET_BANDWIDTH_Tracker *av,
                                    size_t size)
 {
   struct GNUNET_TIME_Relative ret;
-  struct GNUNET_TIME_Absolute now;
-  uint64_t delta_avail;
-  uint64_t delta_time;
-  uint64_t bytes_needed;
+  int64_t bytes_needed;
 
   if (av->available_bytes_per_s__ == 0)
     {
@@ -302,10 +274,8 @@ GNUNET_BANDWIDTH_tracker_get_delay (struct GNUNET_BANDWIDTH_Tracker *av,
       return GNUNET_TIME_UNIT_FOREVER_REL;
     }
   update_tracker (av);
-  now = GNUNET_TIME_absolute_get ();
-  delta_time = now.value - av->last_update__.value;
-  delta_avail = (delta_time * ((unsigned long long) av->available_bytes_per_s__)) / 1000LL;
-  if (delta_avail >= size)
+  bytes_needed = size + av->consumption_since_last_update__;
+  if (bytes_needed <= 0)
     {
 #if DEBUG_BANDWIDTH
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -315,7 +285,6 @@ GNUNET_BANDWIDTH_tracker_get_delay (struct GNUNET_BANDWIDTH_Tracker *av,
 #endif
       return GNUNET_TIME_UNIT_ZERO;
     }
-  bytes_needed = size - delta_avail;
   ret.value = 1000LL * bytes_needed / (unsigned long long) av->available_bytes_per_s__;
 #if DEBUG_BANDWIDTH
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -340,7 +309,7 @@ GNUNET_BANDWIDTH_tracker_get_available (struct GNUNET_BANDWIDTH_Tracker *av)
 {
   struct GNUNET_BANDWIDTH_Value32NBO bps;
   uint64_t avail;
-  uint64_t used;
+  int64_t used;
 
   update_tracker (av);
   bps = GNUNET_BANDWIDTH_value_init (av->available_bytes_per_s__);