chiark / gitweb /
git-cache-proxy: Do not update timestamp due to housekeeping gc
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 11 Feb 2020 19:31:07 +0000 (19:31 +0000)
committerIan Jackson <ian.jackson@eu.citrix.com>
Tue, 11 Feb 2020 19:31:07 +0000 (19:31 +0000)
Otherwise gc will always reset the timestamp and nothing will be
cleaned up.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
scripts/git-cache-proxy

index 762cacb38830cc6c58b04591b9be7dd95662189e..62fb95f5d6da2b5c3ff4484519a26990cf4ce0b4 100755 (executable)
@@ -198,12 +198,13 @@ for (;;) {
 
 #---------- utility functions ----------
 
-sub lockfile ($$$) {
-    my ($fh, $fn, $flockmode) = @_;
+sub lockfile ($$$$) {
+    my ($fh, $fn, $flockmode, $update_ts) = @_;
     my $what = $fn.(($flockmode & ~LOCK_NB) == LOCK_SH ? " (shared)" : "");
     for (;;) {
        close $fh;
-       open $fh, '+>', $fn or fail "open/create $fn for lock: $!";
+       open $fh, ($update_ts ? '+>' : '+>>'), $fn
+           or fail "open/create $fn for lock: $!";
        logm 'debug', "lock $what: acquiring";
        if (!flock $fh, $flockmode) {
            if ($flockmode & LOCK_NB && $! == EWOULDBLOCK) {
@@ -315,7 +316,7 @@ sub update_gcstamp ($) {
 }
 
 sub clonefetch () {
-    lockfile \*LOCK, $lock, LOCK_EX;
+    lockfile \*LOCK, $lock, LOCK_EX, 1;
 
     my $exists = lstat $gitd;
     $exists or $!==ENOENT or fail "lstat $gitd: $!";
@@ -408,7 +409,7 @@ sub clonefetch () {
     }
 
     servinfo "sharing";
-    lockfile \*LOCK, $lock, LOCK_SH; # NB releases and relocks
+    lockfile \*LOCK, $lock, LOCK_SH, 1; # NB releases and relocks
 
     if (stat $gitd) {
        return 1;
@@ -507,7 +508,7 @@ sub housekeeping () {
                }
            };
        }
-       if (!lockfile \*LOCK, $lock, LOCK_EX|$mode_locknb) {
+       if (!lockfile \*LOCK, $lock, LOCK_EX|$mode_locknb, 0) {
             die $! unless $mode_locknb;
            logm 'info', "housekeeping: subdirs $subdir: lock busy, skipping";
            next;
@@ -523,7 +524,7 @@ sub housekeeping () {
 sub housekeepingcheck ($$) {
     my ($dofork, $force) = @_;
     if (!$force) {
-       if (!lockfile \*HLOCK, "Housekeeping.lock", LOCK_EX|LOCK_NB) {
+       if (!lockfile \*HLOCK, "Housekeeping.lock", LOCK_EX|LOCK_NB, 1) {
            logm 'debug', "housekeeping lock taken, not running";
            close HLOCK;
            return 0;