]> git.saurik.com Git - apt.git/commitdiff
merged from lp:~mvo/apt/mvo
authorMichael Vogt <mvo@debian.org>
Tue, 15 Mar 2011 08:19:23 +0000 (09:19 +0100)
committerMichael Vogt <mvo@debian.org>
Tue, 15 Mar 2011 08:19:23 +0000 (09:19 +0100)
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/acquire-method.cc
apt-pkg/acquire-worker.cc
debian/changelog
methods/mirror.cc
methods/mirror.h

index 497edbaacc40e8a43362536662ed28c0709f0b26..2ecb8ed6ea409d52e42dab9568215a46dabbd060 100644 (file)
@@ -220,8 +220,8 @@ string pkgAcqSubIndex::Custom600Headers()
 
    struct stat Buf;
    if (stat(Final.c_str(),&Buf) != 0)
-      return "\nIndex-File: true";
-   return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+      return "\nIndex-File: true\nFail-Ignore: true\n";
+   return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
 }
                                                                        /*}}}*/
 void pkgAcqSubIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)      /*{{{*/
@@ -835,10 +835,16 @@ string pkgAcqIndex::Custom600Headers()
    if (_config->FindB("Acquire::GzipIndexes",false))
       Final += ".gz";
    
+   string msg = "\nIndex-File: true";
+   // FIXME: this really should use "IndexTarget::IsOptional()" but that
+   //        seems to be difficult without breaking ABI
+   if (ShortDesc().find("Translation") != 0)
+      msg += "\nFail-Ignore: true";
    struct stat Buf;
    if (stat(Final.c_str(),&Buf) != 0)
-      return "\nIndex-File: true";
-   return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+      msg += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+
+   return msg;
 }
                                                                        /*}}}*/
 void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/
@@ -1538,6 +1544,21 @@ pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner,                /*{{{*/
    SigFile = DestFile;
 }
                                                                        /*}}}*/
+// pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers        /*{{{*/
+// ---------------------------------------------------------------------
+// FIXME: this can go away once the InRelease file is used widely
+string pkgAcqMetaClearSig::Custom600Headers()
+{
+   string Final = _config->FindDir("Dir::State::lists");
+   Final += URItoFileName(RealURI);
+
+   struct stat Buf;
+   if (stat(Final.c_str(),&Buf) != 0)
+      return "\nIndex-File: true\nFail-Ignore: true\n";
+
+   return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+}
+                                                                       /*}}}*/
 void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/
 {
    if (AuthPass == false)
index 2ae7bf27c4665687f9d3eecfdeabd7ee3b88c3d8..f763577ee8ee11eacd0d60bfaff172c9f533e9a2 100644 (file)
@@ -854,6 +854,7 @@ class pkgAcqMetaClearSig : public pkgAcqMetaIndex
 
 public:
    void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
+   virtual string Custom600Headers();
 
    /** \brief Create a new pkgAcqMetaClearSig. */
    pkgAcqMetaClearSig(pkgAcquire *Owner,
index 17d52cf518b6c4f81c42706e8d30873dd7854946..fb45d9ee71395bee8c140914a73c464c22e81d35 100644 (file)
@@ -149,6 +149,8 @@ void pkgAcqMethod::URIStart(FetchResult &Res)
    if (Res.ResumePoint != 0)
       End += snprintf(End,sizeof(S)-4 - (End - S),"Resume-Point: %lu\n",
                      Res.ResumePoint);
+   if (UsedMirror.empty() == false)
+      End += snprintf(End,sizeof(S)-4 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
       
    strcat(End,"\n");
    if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
@@ -418,9 +420,11 @@ void pkgAcqMethod::Log(const char *Format,...)
 
    // sprintf the description
    char S[1024];
-   unsigned int Len = snprintf(S,sizeof(S)-4,"101 Log\nURI: %s\n"
-                              "Message: ",CurrentURI.c_str());
-
+   unsigned int Len = snprintf(S,sizeof(S)-4,"101 Log\n"
+                               "URI: %s\n"
+                               "UsedMirror: %s\n"
+                              "Message: ", UsedMirror.c_str(),
+                               CurrentURI.c_str());
    vsnprintf(S+Len,sizeof(S)-4-Len,Format,args);
    strcat(S,"\n\n");
    
@@ -442,8 +446,11 @@ void pkgAcqMethod::Status(const char *Format,...)
 
    // sprintf the description
    char S[1024];
-   unsigned int Len = snprintf(S,sizeof(S)-4,"102 Status\nURI: %s\n"
-                              "Message: ",CurrentURI.c_str());
+   unsigned int Len = snprintf(S,sizeof(S)-4,"102 Status\n"
+                               "URI: %s\n"
+                               "UsedMirror: %s\n"
+                              "Message: ",UsedMirror.c_str(),
+                               CurrentURI.c_str());
 
    vsnprintf(S+Len,sizeof(S)-4-Len,Format,args);
    strcat(S,"\n\n");
index 4f0b52af9739e213d5ef55d578bcbf5250c8f74e..ddd8e31018c5bcc028d4fe0c2183fc558876704d 100644 (file)
@@ -199,6 +199,17 @@ bool pkgAcquire::Worker::RunMessages()
       pkgAcquire::Queue::QItem *Itm = 0;
       if (URI.empty() == false)
         Itm = OwnerQ->FindItem(URI,this);
+
+      // update used mirror
+      string UsedMirror = LookupTag(Message,"UsedMirror", "");
+      if (!UsedMirror.empty() && 
+          Itm && 
+          Itm->Description.find(" ") != string::npos) 
+      {
+         Itm->Description.replace(0, Itm->Description.find(" "), UsedMirror);
+         // FIXME: will we need this as well?
+         //Itm->ShortDesc = UsedMirror;
+      }
       
       // Determine the message number and dispatch
       switch (Number)
index 9483fbe5496218894a84e7ac8f4331f880375d14..96efdf65005fc917422c4f8521bd489e74a65a40 100644 (file)
@@ -11,8 +11,13 @@ apt (0.8.13) UNRELEASED; urgency=low
       user to insert the CD on each apt-get update
   * po/sl.po:
     - updated, thanks to Andrej Znidarsic
+  * mirror method:
+    - when downloading data, show the mirror being used
+    - randomize mirror list after download in a host specific way
+      to ensure that the load is evenly spreaded accross the mirrors
+    - fix some missing "Fail-Ignore"
 
- -- Michael Vogt <mvo@debian.org>  Mon, 14 Mar 2011 13:17:08 +0100
+ -- Michael Vogt <mvo@debian.org>  Tue, 15 Mar 2011 09:11:30 +0100
 
 apt (0.8.12) unstable; urgency=low
 
index d092cc657c4363fe21f31accf665ee937afb6025..e499b054b15edb0e36a62bf08417a6867e6aeba4 100644 (file)
 #include <apt-pkg/hashes.h>
 #include <apt-pkg/sourcelist.h>
 
+
+#include <algorithm>
 #include <fstream>
 #include <iostream>
+
 #include <stdarg.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/utsname.h>
 #include <dirent.h>
 
 using namespace std;
@@ -147,6 +151,44 @@ 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);
+   }
+   
+   // we want the file to be random for each different machine, but also
+   // "stable" on the same machine. this is to avoid running into out-of-sync
+   // issues (i.e. Release/Release.gpg different on each mirror)
+   struct utsname buf;
+   int seed=1, i;
+   if(uname(&buf) == 0) {
+      for(i=0,seed=1; buf.nodename[i] != 0; i++) {
+         seed = seed * 31 + buf.nodename[i];
+      }
+   }
+   srand( seed );
+   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)
@@ -186,6 +228,10 @@ bool MirrorMethod::TryNextMirror()
       Queue->Uri.replace(0, mirror->length(), *nextmirror);
       if (Debug)
         clog << "TryNextMirror: " << Queue->Uri << endl;
+
+      // inform parent
+      UsedMirror = *nextmirror;
+      Log("Switching mirror");
       return true;
    }
 
@@ -309,6 +355,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
    {
       Clean(_config->FindDir("Dir::State::mirrors"));
       DownloadMirrorFile(Itm->Uri);
+      RandomizeMirrorFile(MirrorFile);
    }
 
    if(AllMirrors.empty()) {
index 0a3ea6e92ae16f0e3df8f428ee2bd506e9503b5e..bd807e1227c0f84b4bf92bf24753337541f2d88b 100644 (file)
@@ -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();