Browse Source

* merged http download limit for apt (#146877)

debian/1.8.y
Michael Vogt 16 years ago
parent
commit
7c6e2dc761
  1. 6
      apt-pkg/acquire.cc
  2. 5
      debian/changelog
  3. 1
      doc/examples/configure-index
  4. 41
      methods/http.cc
  5. 5
      methods/http.h

6
apt-pkg/acquire.cc

@ -266,7 +266,11 @@ pkgAcquire::MethodConfig *pkgAcquire::GetConfig(string Access)
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;
}
/*}}}*/

5
debian/changelog

@ -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)
@ -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)
* support a download rate limit for http (closes: #146877)
--
--
apt (0.6.42.3) unstable; urgency=low

1
doc/examples/configure-index

@ -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
Dl-Limit "7"; // 7Kb/sec maximum download rate
};
ftp

41
methods/http.cc

@ -58,6 +58,12 @@ unsigned long PipelineDepth = 10;
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 /*{{{*/
// ---------------------------------------------------------------------
/* */
@ -65,6 +71,8 @@ CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0)
{
Buf = new unsigned char[Size];
Reset();
CircleBuf::BwReadLimit = _config->FindI("Acquire::http::Dl-Limit",0)*1024;
}
/*}}}*/
// CircleBuf::Reset - Reset to the default state /*{{{*/
@ -90,16 +98,45 @@ void CircleBuf::Reset()
is non-blocking.. */
bool CircleBuf::Read(int Fd)
{
unsigned long BwReadMax;
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;
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)

5
methods/http.h

@ -31,6 +31,11 @@ class CircleBuf
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);

Loading…
Cancel
Save