]> git.saurik.com Git - apt.git/commitdiff
* merged http download limit for apt (#146877)
authorMichael Vogt <michael.vogt@ubuntu.com>
Tue, 22 Nov 2005 22:11:06 +0000 (22:11 +0000)
committerMichael Vogt <michael.vogt@ubuntu.com>
Tue, 22 Nov 2005 22:11:06 +0000 (22:11 +0000)
apt-pkg/acquire.cc
debian/changelog
doc/examples/configure-index
methods/http.cc
methods/http.h

index 62209e65b2140907cc3af428b7482037a62b44e3..57cf60bfe1f46bbf2851b46768bc372c394ebc53 100644 (file)
@@ -266,7 +266,11 @@ pkgAcquire::MethodConfig *pkgAcquire::GetConfig(string Access)
    Worker Work(Conf);
    if (Work.Start() == false)
       return 0;
    Worker Work(Conf);
    if (Work.Start() == false)
       return 0;
-   
+
+   /* if a method uses DownloadLimit, we switch to SingleInstance mode */
+   if(_config->FindI("Acquire::"+Access+"::DlLimit",0) > 0)
+      Conf->SingleInstance = true;
+    
    return Conf;
 }
                                                                        /*}}}*/
    return Conf;
 }
                                                                        /*}}}*/
index 2022448a026069afafe00adf10721b7ce1bc115a..34f8cec0369bd07986580c24d126c0dfe611e9d6 100644 (file)
@@ -1,4 +1,4 @@
-apt (0.6.42.4) unstable; urgency=low
+apt (0.6.43) unstable; urgency=low
 
   * Merge bubulle@debian.org--2005/apt--main--0 up to patch-132:  
     * zh_CN.po: Completed to 510 strings(Closes: #338267)
 
   * Merge bubulle@debian.org--2005/apt--main--0 up to patch-132:  
     * zh_CN.po: Completed to 510 strings(Closes: #338267)
@@ -9,8 +9,9 @@ apt (0.6.42.4) unstable; urgency=low
   * fix bug in pkgCache::VerIterator::end() (thanks to Daniel Burrows)
     (closes: #339533)
   * pkgAcqFile is more flexible now (closes: #57091)
   * fix bug in pkgCache::VerIterator::end() (thanks to Daniel Burrows)
     (closes: #339533)
   * pkgAcqFile is more flexible now (closes: #57091)
+  * support a download rate limit for http (closes: #146877)
   
   
- -- 
+ --
 
 apt (0.6.42.3) unstable; urgency=low
 
 
 apt (0.6.42.3) unstable; urgency=low
 
index a93b743492fade6c31f585d58fb73b4f554e8131..9e851d7533f7ede88e1c2049d9ddb83a56fa2f84 100644 (file)
@@ -117,6 +117,7 @@ Acquire
     No-Cache "false";
     Max-Age "86400";     // 1 Day age on index files
     No-Store "false";    // Prevent the cache from storing archives    
     No-Cache "false";
     Max-Age "86400";     // 1 Day age on index files
     No-Store "false";    // Prevent the cache from storing archives    
+    Dl-Limit "7";        // 7Kb/sec maximum download rate
   };
 
   ftp
   };
 
   ftp
index ba86aa6b654904a4579e397be946d509cb4c7e3a..a5c9601e7c208471cc8952d156dedb923c8a15fe 100644 (file)
@@ -58,6 +58,12 @@ unsigned long PipelineDepth = 10;
 unsigned long TimeOut = 120;
 bool Debug = false;
 
 unsigned long TimeOut = 120;
 bool Debug = false;
 
+
+unsigned long CircleBuf::BwReadLimit=0;
+unsigned long CircleBuf::BwTickReadData=0;
+struct timeval CircleBuf::BwReadTick={0,0};
+const unsigned int CircleBuf::BW_HZ=10;
+  
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -65,6 +71,8 @@ CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0)
 {
    Buf = new unsigned char[Size];
    Reset();
 {
    Buf = new unsigned char[Size];
    Reset();
+
+   CircleBuf::BwReadLimit = _config->FindI("Acquire::http::Dl-Limit",0)*1024;
 }
                                                                        /*}}}*/
 // CircleBuf::Reset - Reset to the default state                       /*{{{*/
 }
                                                                        /*}}}*/
 // CircleBuf::Reset - Reset to the default state                       /*{{{*/
@@ -90,16 +98,45 @@ void CircleBuf::Reset()
    is non-blocking.. */
 bool CircleBuf::Read(int Fd)
 {
    is non-blocking.. */
 bool CircleBuf::Read(int Fd)
 {
+   unsigned long BwReadMax;
+
    while (1)
    {
       // Woops, buffer is full
       if (InP - OutP == Size)
         return true;
    while (1)
    {
       // Woops, buffer is full
       if (InP - OutP == Size)
         return true;
-      
+
+      // what's left to read in this tick
+      BwReadMax = CircleBuf::BwReadLimit/BW_HZ;
+
+      if(CircleBuf::BwReadLimit) {
+        struct timeval now;
+        gettimeofday(&now,0);
+
+        unsigned long d = (now.tv_sec-CircleBuf::BwReadTick.tv_sec)*1000000 +
+           now.tv_usec-CircleBuf::BwReadTick.tv_usec;
+        if(d > 1000000/BW_HZ) {
+           CircleBuf::BwReadTick = now;
+           CircleBuf::BwTickReadData = 0;
+        } 
+        
+        if(CircleBuf::BwTickReadData >= BwReadMax) {
+           usleep(1000000/BW_HZ);
+           return true;
+        }
+      }
+
       // Write the buffer segment
       int Res;
       // Write the buffer segment
       int Res;
-      Res = read(Fd,Buf + (InP%Size),LeftRead());
+      if(CircleBuf::BwReadLimit) {
+        Res = read(Fd,Buf + (InP%Size), 
+                   BwReadMax > LeftRead() ? LeftRead() : BwReadMax);
+      } else
+        Res = read(Fd,Buf + (InP%Size),LeftRead());
       
       
+      if(Res > 0 && BwReadLimit > 0) 
+        CircleBuf::BwTickReadData += Res;
+    
       if (Res == 0)
         return false;
       if (Res < 0)
       if (Res == 0)
         return false;
       if (Res < 0)
index c5a4d0e86a1f9967ed2f573eb9bb508b95646dd4..541e2952cb5fdf540f31129e99ad7e499fc074ef 100644 (file)
@@ -31,6 +31,11 @@ class CircleBuf
    unsigned long MaxGet;
    struct timeval Start;
    
    unsigned long MaxGet;
    struct timeval Start;
    
+   static unsigned long BwReadLimit;
+   static unsigned long BwTickReadData;
+   static struct timeval BwReadTick;
+   static const unsigned int BW_HZ;
+
    unsigned long LeftRead()
    {
       unsigned long Sz = Size - (InP - OutP);
    unsigned long LeftRead()
    {
       unsigned long Sz = Size - (InP - OutP);