[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#625845: apt: Cron job doesn't correctly handle removal by archive size.



Package: apt
Version: 0.8.14.1
Severity: normal


I recently discovered the /etc/cron.daily/apt script and wanted to use
it to download upgradeable packages and then immediately afterwards
delete them.  Point is: There's a caching daemon (apt-cacher-ng) in
between that will keep requested packages around but cannot by itsself
determine and download upgradeable packages.

So, as suggested in the cron job, I created the file
/etc/apt/apt.conf.d/02periodic with the following contents:

    APT::Periodic::MinAge "0";
    APT::Periodic::Verbose "2";
    APT::Periodic::MaxSize "1";
    APT::Periodic::Update-Package-Lists "1";
    APT::Periodic::Download-Upgradeable-Packages "1";

The MinAge=0 setting should allow the clean-by-size-routine to
indiscriminately kill newly downloaded packages, or so I thought.  Well,
it doesn't, as this whole clean-by-size subtree will be deactivated if
MinAge==0.

This is easily fixed by moving this check a bit deeper as can be seen in
the small and trivial patch I attached (apt.remove_by_size.diff).  I
don't think it'll break any of the more customary use cases (such as
"actually keeping downloaded packages around for later installation" :).

There are also a few comments marked TODO in this diff - those contain
suggestions for later improvements (or silly remarks, I'm often not
sure).

Thanks,
  Hagen
diff --git a/cron.daily/apt b/cron.daily/apt
index 75986f5..efce46f 100755
--- a/cron.daily/apt
+++ b/cron.daily/apt
@@ -170,6 +170,7 @@ check_size_constraints()
     # check size
     if [ ! $MaxSize -eq 0 ]; then
 	# maxSize is in MB
+	# TODO Well, no...  1024 -> binary prefixes (MiB, KiB,... :).
 	MaxSize=$(($MaxSize*1024))
 
 	#get current time
@@ -187,7 +188,7 @@ check_size_constraints()
 	    fi
 
 	    # check for MinAge of the file
-	    if [ $MinAge -ne 0 ]; then 
+	    # hfuchs| Moved age check deeper below - doesn't make sense here.
 		# check both ctime and mtime 
 		mtime=$(stat -c %Y $file)
 		ctime=$(stat -c %Z $file)
@@ -196,14 +197,19 @@ check_size_constraints()
 		else
 		    delta=$(($now-$ctime))
 		fi
-		if [ $delta -le $MinAge ]; then
+		# hfuchs| Moved MinAge != 0 check here.
+		if [ $delta -le $MinAge -a $MinAge -ne 0 ]; then
 		    debug_echo "skip remove by archive size:  $file, delta=$delta < $MinAgeSec"
+		    # TODO Why break here?  Just because of one file that's too fresh?
 		    break
 		else
 		    # delete oldest file
+		    # TODO btw: I read somewhere at the top of this file that
+		    # the biggest files are deleted first?  I can't see it
+		    # happening.  Don't relly care, either.  ;)
+		    # TODO Indentation is a bit of a mess down here.
 		    debug_echo "remove by archive size: $file, delta=$delta >= $MinAgeSec (sec), size=$size >= $MaxSize"
 		    rm -f $file
-		fi
 	    fi
 	done
     fi

Reply to: