diff options
Diffstat (limited to 'methods/mirror.cc')
-rw-r--r-- | methods/mirror.cc | 30 |
1 files changed, 30 insertions, 0 deletions
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()) { |