Send "Fail-Reason: MaximumSizeExceeded" from the method
authorMichael Vogt <mvo@ubuntu.com>
Tue, 7 Oct 2014 20:36:09 +0000 (22:36 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Tue, 7 Oct 2014 20:36:09 +0000 (22:36 +0200)
Communicate the fail reason from the methods to the parent
and Rename() failed files.

apt-pkg/acquire-item.cc
methods/ftp.cc
methods/ftp.h
methods/http.cc
methods/https.cc
test/integration/test-apt-update-expected-size

index 1dcbde2..f630129 100644 (file)
@@ -148,8 +148,12 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
    else
       Status = StatIdle;
 
-   // report mirror failure back to LP if we actually use a mirror
+   // check fail reason
    string FailReason = LookupTag(Message, "FailReason");
+   if(FailReason == "MaximumSizeExceeded")
+      Rename(DestFile, DestFile+".FAILED");
+
+   // report mirror failure back to LP if we actually use a mirror
    if(FailReason.size() != 0)
       ReportMirrorFailure(FailReason);
    else
index bc84dda..5b739ea 100644 (file)
@@ -849,7 +849,8 @@ bool FTPConn::Finalize()
 /* This opens a data connection, sends REST and RETR and then
    transfers the file over. */
 bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
-                 Hashes &Hash,bool &Missing, unsigned long long MaximumSize)
+                 Hashes &Hash,bool &Missing, unsigned long long MaximumSize,
+                  pkgAcqMethod *Owner)
 {
    Missing = false;
    if (CreateDataFd() == false)
@@ -925,8 +926,11 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
       }
 
       if (MaximumSize > 0 && To.Tell() > MaximumSize)
+      {
+         Owner->SetFailReason("MaximumSizeExceeded");
          return _error->Error("Writing more data than expected (%llu > %llu)",
                               To.Tell(), MaximumSize);
+      }
    }
 
    // All done
@@ -1067,7 +1071,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       FailFd = Fd.Fd();
       
       bool Missing;
-      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize) == false)
+      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize,this) == false)
       {
         Fd.Close();
 
index a31ebc9..2efd28e 100644 (file)
@@ -62,7 +62,8 @@ class FTPConn
    bool Size(const char *Path,unsigned long long &Size);
    bool ModTime(const char *Path, time_t &Time);
    bool Get(const char *Path,FileFd &To,unsigned long long Resume,
-           Hashes &MD5,bool &Missing, unsigned long long MaximumSize);
+           Hashes &MD5,bool &Missing, unsigned long long MaximumSize,
+            pkgAcqMethod *Owner);
    
    FTPConn(URI Srv);
    ~FTPConn();
index f8faa0c..c00b439 100644 (file)
@@ -657,6 +657,7 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File)
 
    if (MaximumSize > 0 && File && File->Tell() > MaximumSize)
    {
+      Owner->SetFailReason("MaximumSizeExceeded");
       return _error->Error("Writing more data than expected (%llu > %llu)",
                            File->Tell(), MaximumSize);
    }
index 787e4a5..16d564b 100644 (file)
@@ -83,9 +83,11 @@ HttpsMethod::write_data(void *buffer, size_t size, size_t nmemb, void *userp)
       return false;
 
    if(me->Queue->MaximumSize > 0 && me->File->Tell() > me->Queue->MaximumSize)
+   {
+      me->SetFailReason("MaximumSizeExceeded");
       return _error->Error("Writing more data than expected (%llu > %llu)",
                            me->TotalWritten, me->Queue->MaximumSize);
-
+   }
    return size*nmemb;
 }
 
index f8ec24d..58920f5 100755 (executable)
@@ -19,7 +19,7 @@ testsuccess aptget update
 mv aptarchive/dists/unstable/InRelease aptarchive/dists/unstable/InRelease.good
 dd if=/dev/zero of=aptarchive/dists/unstable/InRelease bs=1M count=2 2>/dev/null
 touch -d '+1hour' aptarchive/dists/unstable/InRelease
-aptget update  -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 > output.log
+aptget update -o Apt::Get::List-Cleanup=0  -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0 > output.log
 msgtest 'Check that the max write warning is triggered'
 if grep -q "Writing more data than expected" output.log; then
     msgpass
@@ -27,8 +27,11 @@ else
     cat output.log
     msgfail
 fi
+# ensure the failed InRelease file got renamed
+testsuccess ls rootdir/var/lib/apt/lists/partial/*InRelease.FAILED
 mv aptarchive/dists/unstable/InRelease.good aptarchive/dists/unstable/InRelease
 
+
 # append junk at the end of the Packages.gz/Packages
 SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)"
 echo "1234567890" >> aptarchive/dists/unstable/main/binary-i386/Packages.gz