diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2011-03-14 15:44:08 +0100 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2011-03-14 15:44:08 +0100 |
commit | 01a695e260429b4ed834a52fb55ba49a8cb42e6a (patch) | |
tree | b4e1d389778f0e8d4f9dba5691c40fad2e5874f5 | |
parent | 8d6c583900b81bf996afd104571580c6f3e55e1c (diff) | |
download | apt-01a695e260429b4ed834a52fb55ba49a8cb42e6a.tar.gz |
randomize mirror list to ensure more even load
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | methods/mirror.cc | 30 | ||||
-rw-r--r-- | methods/mirror.h | 1 |
3 files changed, 32 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index efa7be763..d9a20765f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,7 @@ apt (0.8.13) unstable; urgency=low user to insert the CD on each apt-get update * mirror method: - when downloading data, show the mirror being used + - randomize mirror list to ensure more even load -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 10 Mar 2011 15:56:54 +0100 diff --git a/methods/mirror.cc b/methods/mirror.cc index 5a53d3c81..08a603207 100644 --- a/methods/mirror.cc +++ b/methods/mirror.cc @@ -17,6 +17,7 @@ #include <apt-pkg/sourcelist.h> #include <fstream> +#include <algorithm> #include <iostream> #include <stdarg.h> #include <sys/stat.h> @@ -147,6 +148,34 @@ bool MirrorMethod::DownloadMirrorFile(string mirror_uri_str) return res; } +// Randomizes the lines in the mirror file, this is used so that +// we spread the load on the mirrors evenly +bool MirrorMethod::RandomizeMirrorFile(string mirror_file) +{ + vector<string> content; + string line; + + // read + ifstream in(mirror_file.c_str()); + while ( ! in.eof() ) { + getline(in, line); + content.push_back(line); + } + + // randomize + random_shuffle(content.begin(), content.end()); + + // write + ofstream out(mirror_file.c_str()); + while ( !content.empty()) { + line = content.back(); + content.pop_back(); + out << line << "\n"; + } + + return true; +} + /* convert a the Queue->Uri back to the mirror base uri and look * at all mirrors we have for this, this is needed as queue->uri * may point to different mirrors (if TryNextMirror() was run) @@ -313,6 +342,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm) { Clean(_config->FindDir("Dir::State::mirrors")); DownloadMirrorFile(Itm->Uri); + RandomizeMirrorFile(MirrorFile); } if(AllMirrors.empty()) { diff --git a/methods/mirror.h b/methods/mirror.h index 0a3ea6e92..bd807e122 100644 --- a/methods/mirror.h +++ b/methods/mirror.h @@ -34,6 +34,7 @@ class MirrorMethod : public HttpMethod protected: bool DownloadMirrorFile(string uri); + bool RandomizeMirrorFile(string file); string GetMirrorFileName(string uri); bool InitMirrors(); bool TryNextMirror(); |