ソースを参照

remove invalid pkgcache.bin and rebuild it if possible

The next invocation of APT tried to load an outdated big
(and possible io-cold) file just to end up rebuilding it
(possibly only as non-root in memory again and again), so
we remove it here and if we have a srcpkgcache we are
going to rebuild, too.
David Kalnischkies 15 年 前
コミット
388f296266
共有2 個のファイルを変更した19 個の追加1 個の削除を含む
  1. 18 1
      apt-pkg/deb/dpkgpm.cc
  2. 1 0
      debian/changelog

+ 18 - 1
apt-pkg/deb/dpkgpm.cc

@@ -14,8 +14,8 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/pkgrecords.h>
 #include <apt-pkg/strutl.h>
-#include <apti18n.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/cachefile.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -1269,6 +1269,23 @@ bool pkgDPkgPM::Go(int OutStatusFd)
    if (RunScripts("DPkg::Post-Invoke") == false)
       return false;
 
+   if (_config->FindB("Debug::pkgDPkgPM",false) == false)
+   {
+      std::string const oldpkgcache = _config->FindFile("Dir::cache::pkgcache");
+      if (oldpkgcache.empty() == false && RealFileExists(oldpkgcache) == true &&
+	  unlink(oldpkgcache.c_str()) == 0)
+      {
+	 std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
+	 if (srcpkgcache.empty() == false && RealFileExists(srcpkgcache) == true)
+	 {
+	    _error->PushToStack();
+	    pkgCacheFile CacheFile;
+	    CacheFile.BuildCaches(NULL, true);
+	    _error->RevertToStack();
+	 }
+      }
+   }
+
    Cache.writeStateFile(NULL);
    return true;
 }

+ 1 - 0
debian/changelog

@@ -30,6 +30,7 @@ apt (0.8.14.2) UNRELEASED; urgency=low
     - let VisitRProvides report if the calls were successful
   * apt-pkg/deb/dpkgpm.cc:
     - replace obsolete usleep with nanosleep
+    - remove invalid pkgcache.bin and rebuild it if possible
   * debian/apt{,-utils}.symbols:
     - update both experimental symbol-files to reflect 0.8.14 state
   * debian/rules: