]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
- moved Config.Refresh loops to one place, refreshLimits()
authorrousskov <>
Wed, 22 Apr 1998 22:22:15 +0000 (22:22 +0000)
committerrousskov <>
Wed, 22 Apr 1998 22:22:15 +0000 (22:22 +0000)
- added refreshWhen() which returns approximate time when
  refreshCheck() may return true

src/refresh.cc

index 7f5dc0b386298fcfa44ff1968402fc156b4cb295..6277b60051472053e0b21426727db3a5f86b318f 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: refresh.cc,v 1.17 1997/11/12 00:09:04 wessels Exp $
+ * $Id: refresh.cc,v 1.18 1998/04/22 16:22:15 rousskov Exp $
  *
  * DEBUG: section 22    Refresh Calculation
  * AUTHOR: Harvest Derived
 #define REFRESH_DEFAULT_PCT    (time_t)20
 #define REFRESH_DEFAULT_MAX    (time_t)259200
 
+static const refresh_t *
+refreshLimits(const char *url)
+{
+    const refresh_t *R;
+    for (R = Config.Refresh; R; R = R->next) {
+       if (!regexec(&(R->compiled_pattern), url, 0, 0, 0))
+           return R;
+    }
+    return NULL;
+}
+
 /*
  * refreshCheck():
  *     return 1 if its time to revalidate this entry, 0 otherwise
@@ -52,7 +63,7 @@
 int
 refreshCheck(const StoreEntry * entry, const request_t * request, time_t delta)
 {
-    refresh_t *R;
+    const refresh_t *R;
     time_t min = REFRESH_DEFAULT_MIN;
     int pct = REFRESH_DEFAULT_PCT;
     time_t max = REFRESH_DEFAULT_MAX;
@@ -65,14 +76,11 @@ refreshCheck(const StoreEntry * entry, const request_t * request, time_t delta)
        debug(22, 3) ("refreshCheck: YES: Required Authorization\n");
        return 1;
     }
-    for (R = Config.Refresh; R; R = R->next) {
-       if (regexec(&(R->compiled_pattern), storeUrl(entry), 0, 0, 0) != 0)
-           continue;
+    if ((R = refreshLimits(storeUrl(entry)))) {
        min = R->min;
        pct = R->pct;
        max = R->max;
        pattern = R->pattern;
-       break;
     }
     debug(22, 3) ("refreshCheck: Matched '%s %d %d%% %d'\n",
        pattern, (int) min, pct, (int) max);
@@ -106,7 +114,8 @@ refreshCheck(const StoreEntry * entry, const request_t * request, time_t delta)
            debug(22, 3) ("refreshCheck: NO: non-HTTP request\n");
            return 0;
        }
-       debug(22, 3) ("refreshCheck: YES: lastvalid <= lastmod\n");
+       debug(22, 3) ("refreshCheck: YES: lastvalid <= lastmod (%d <= %d)\n",
+           (int)entry->timestamp, (int)entry->lastmod);
        return 1;
     }
     factor = 100 * age / (entry->timestamp - entry->lastmod);
@@ -118,14 +127,65 @@ refreshCheck(const StoreEntry * entry, const request_t * request, time_t delta)
     return 1;
 }
 
+/* returns an approximate time when refreshCheck() may return true */
+time_t
+refreshWhen(const StoreEntry * entry)
+{
+    const refresh_t *R;
+    time_t refresh_time = squid_curtime;
+    time_t min = REFRESH_DEFAULT_MIN;
+    time_t max = REFRESH_DEFAULT_MAX;
+    int pct = REFRESH_DEFAULT_PCT;
+    const char *pattern = ".";
+
+    assert(entry);
+    debug(22, 3) ("refreshWhen: key '%s'\n", storeKeyText(entry->key));
+    debug(22, 3) ("refreshWhen: url '%s'\n", storeUrl(entry));
+    if (EBIT_TEST(entry->flag, ENTRY_REVALIDATE)) {
+       debug(22, 3) ("refreshWhen: NOW: Required Authorization\n");
+       return refresh_time;
+    }
+    debug(22, 3) ("refreshWhen: entry: exp: %d, tstamp: %d, lmt: %d\n",
+       entry->expires, entry->timestamp, entry->lastmod);
+    if ((R = refreshLimits(storeUrl(entry)))) {
+       min = R->min;
+       max = R->max;
+       pct = R->pct;
+       pattern = R->pattern;
+    }
+    debug(22, 3) ("refreshWhen: Matched '%s %d %d%% %d'\n",
+       pattern, (int) min, pct, (int) max);
+    /* convert to absolute numbers */
+    min += entry->timestamp;
+    max += entry->timestamp;
+    if (-1 < entry->expires) {
+       debug(22, 3) ("refreshWhen: expires set\n");
+       refresh_time = entry->expires;
+    } else
+    if (entry->timestamp <= entry->lastmod) {
+       debug(22, 3) ("refreshWhen: lastvalid <= lastmod\n");
+       refresh_time = squid_curtime;
+    } else {
+       refresh_time = pct * (entry->timestamp - entry->lastmod)/100 + entry->timestamp;
+       debug(22, 3) ("refreshWhen: using refresh pct\n");
+    }
+    /* take min/max into account, max takes priority over min */
+    if (refresh_time < min)
+       refresh_time = min;
+    if (refresh_time > max)
+       refresh_time = max;
+    debug(22, 3) ("refreshWhen: answer: %d (in %d secs)\n",
+       refresh_time, (int)(refresh_time - squid_curtime));
+    return refresh_time;
+}
+
 time_t
 getMaxAge(const char *url)
 {
-    refresh_t *R;
+    const refresh_t *R;
     debug(22, 3) ("getMaxAge: '%s'\n", url);
-    for (R = Config.Refresh; R; R = R->next) {
-       if (regexec(&(R->compiled_pattern), url, 0, 0, 0) == 0)
-           return R->max;
-    }
-    return REFRESH_DEFAULT_MAX;
+    if ((R = refreshLimits(url)))
+       return R->max;
+    else
+       return REFRESH_DEFAULT_MAX;
 }