From 01a695e260429b4ed834a52fb55ba49a8cb42e6a Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 14 Mar 2011 15:44:08 +0100 Subject: randomize mirror list to ensure more even load --- methods/mirror.cc | 30 ++++++++++++++++++++++++++++++ methods/mirror.h | 1 + 2 files changed, 31 insertions(+) (limited to 'methods') 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 #include +#include #include #include #include @@ -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 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(); -- cgit v1.2.3