]> git.saurik.com Git - apt.git/commitdiff
methods/mirrors.cc: make cycle through the mirrors work properly
authorMichael Vogt <michael.vogt@ubuntu.com>
Wed, 2 Jun 2010 21:13:42 +0000 (23:13 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Wed, 2 Jun 2010 21:13:42 +0000 (23:13 +0200)
methods/mirror.cc
methods/mirror.h

index 4d767c9f3eff80ce3a84378b11d9897208fcb220..56752247828ef6307b1154666a0ce45003337fbb 100644 (file)
@@ -142,13 +142,44 @@ bool MirrorMethod::DownloadMirrorFile(string mirror_uri_str)
    return res;
 }
 
-bool MirrorMethod::SelectNextMirror()
+/* 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)
+ */
+void MirrorMethod::CurrentQueueUriToMirror()
+{
+   // already in mirror:// style so nothing to do
+   if(Queue->Uri.find("mirror://") == 0)
+      return;
+
+   // find current mirror and select next one
+   for (int i=0; i < AllMirrors.size(); i++) 
+   {
+      if (Queue->Uri.find(AllMirrors[i]) == 0)
+      {
+        Queue->Uri.replace(0, AllMirrors[i].size(), BaseUri);
+        return;
+      }
+   }
+   _error->Error("Internal error: Failed to convert %s back to %s",
+                Queue->Uri, BaseUri);
+}
+
+bool MirrorMethod::TryNextMirror()
 {
    if(Debug)
       cerr << "using mirror: " << Mirror << endl;
 
-   Mirror = AllMirrors[0];
-   UsedMirror = Mirror;
+   // find current mirror and select next one
+   for (int i=0; i < AllMirrors.size()-1; i++) 
+   {
+      if (Queue->Uri.find(AllMirrors[i]) == 0)
+      {
+        Queue->Uri.replace(0, AllMirrors[i].size(), AllMirrors[i+1]);
+        return true;
+      }
+   }
+
    return false;
 }
 
@@ -176,7 +207,8 @@ bool MirrorMethod::InitMirrors()
       if (s.size() > 0)
         AllMirrors.push_back(s);
    }
-   SelectNextMirror();
+   Mirror = AllMirrors[0];
+   UsedMirror = Mirror;
    return true;
 }
 
@@ -292,34 +324,27 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
 void MirrorMethod::Fail(string Err,bool Transient)
 {
    // try the next mirror on fail
-   string old_mirror = Mirror;
-   if (SelectNextMirror()) 
-   {
-      Queue->Uri.replace(0, old_mirror.size(), Mirror);
+   if (TryNextMirror()) 
       return;
-   }
 
    // all mirrors failed, so bail out
    string s;
    strprintf(s, _("[Mirror: %s]"), Mirror.c_str());
    SetIP(s);
 
-   if(Queue->Uri.find("http://") != string::npos)
-      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   CurrentQueueUriToMirror();
    pkgAcqMethod::Fail(Err, Transient);
 }
 
 void MirrorMethod::URIStart(FetchResult &Res)
 {
-   if(Queue->Uri.find("http://") != string::npos)
-      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   CurrentQueueUriToMirror();
    pkgAcqMethod::URIStart(Res);
 }
 
 void MirrorMethod::URIDone(FetchResult &Res,FetchResult *Alt)
 {
-   if(Queue->Uri.find("http://") != string::npos)
-      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   CurrentQueueUriToMirror();
    pkgAcqMethod::URIDone(Res, Alt);
 }
 
index 1b506dc871c64705c5be8bcf5a825a2f0fcf9195..0a3ea6e92ae16f0e3df8f428ee2bd506e9503b5e 100644 (file)
@@ -36,7 +36,8 @@ class MirrorMethod : public HttpMethod
    bool DownloadMirrorFile(string uri);
    string GetMirrorFileName(string uri);
    bool InitMirrors();
-   bool SelectNextMirror();
+   bool TryNextMirror();
+   void CurrentQueueUriToMirror();
    bool Clean(string dir);
    
    // we need to overwrite those to transform the url back