From: rousskov <> Date: Wed, 22 Apr 1998 22:22:15 +0000 (+0000) Subject: - moved Config.Refresh loops to one place, refreshLimits() X-Git-Tag: SQUID_3_0_PRE1~3461 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6018f0def8e4cec074a32356b6380cf1124e7287;p=thirdparty%2Fsquid.git - moved Config.Refresh loops to one place, refreshLimits() - added refreshWhen() which returns approximate time when refreshCheck() may return true --- diff --git a/src/refresh.cc b/src/refresh.cc index 7f5dc0b386..6277b60051 100644 --- a/src/refresh.cc +++ b/src/refresh.cc @@ -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 @@ -45,6 +45,17 @@ #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; }