]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Convert dns_timeout and dns_retransmit_interval configuration options to use millisec...
authorChristos Tsantilas <chtsanti@users.sourceforge.net>
Tue, 15 Mar 2011 17:31:34 +0000 (19:31 +0200)
committerChristos Tsantilas <chtsanti@users.sourceforge.net>
Tue, 15 Mar 2011 17:31:34 +0000 (19:31 +0200)
One second resolution is too coarse for small timeouts in delay-sensitive
environments, especially when a retransmit, bypass, or another corrective
action is available and is likely to produce a positive outcome. In DNS world
specifically, most timeouts are measured in milliseconds.

This is a Measurement Factory project

src/cache_cf.cc
src/cf.data.depend
src/cf.data.pre
src/dns_internal.cc
src/structs.h
src/typedefs.h

index aaf4dbd57547a86f42ffb2a280adfe3b58073208..6c5c1d3f00016764df0d9c952ca953520489adef 100644 (file)
@@ -118,6 +118,7 @@ static void free_ecap_service_type(Adaptation::Ecap::Config *);
 
 CBDATA_TYPE(peer);
 
+static const char *const T_MILLISECOND_STR = "millisecond";
 static const char *const T_SECOND_STR = "second";
 static const char *const T_MINUTE_STR = "minute";
 static const char *const T_HOUR_STR = "hour";
@@ -143,8 +144,8 @@ static void free_access_log(customlog ** definitions);
 static void update_maxobjsize(void);
 static void configDoConfigure(void);
 static void parse_refreshpattern(refresh_t **);
-static int parseTimeUnits(const char *unit);
-static void parseTimeLine(time_t * tptr, const char *units);
+static uint64_t parseTimeUnits(const char *unit);
+static void parseTimeLine(time_msec_t * tptr, const char *units);
 static void parse_ushort(u_short * var);
 static void parse_string(char **);
 static void default_all(void);
@@ -957,12 +958,12 @@ parse_obsolete(const char *name)
 /* Parse a time specification from the config file.  Store the
  * result in 'tptr', after converting it to 'units' */
 static void
-parseTimeLine(time_t * tptr, const char *units)
+parseTimeLine(time_msec_t * tptr, const char *units)
 {
     char *token;
     double d;
-    time_t m;
-    time_t u;
+    time_msec_t m;
+    time_msec_t u;
 
     if ((u = parseTimeUnits(units)) == 0)
         self_destruct();
@@ -983,38 +984,41 @@ parseTimeLine(time_t * tptr, const char *units)
     else if ((m = parseTimeUnits(token)) == 0)
         self_destruct();
 
-    *tptr = static_cast<time_t> (m * d / u);
+    *tptr = static_cast<time_msec_t>(m * d);
 }
 
-static int
+static uint64_t
 parseTimeUnits(const char *unit)
 {
-    if (!strncasecmp(unit, T_SECOND_STR, strlen(T_SECOND_STR)))
+    if (!strncasecmp(unit, T_MILLISECOND_STR, strlen(T_MILLISECOND_STR)))
         return 1;
 
+    if (!strncasecmp(unit, T_SECOND_STR, strlen(T_SECOND_STR)))
+        return 1000;
+
     if (!strncasecmp(unit, T_MINUTE_STR, strlen(T_MINUTE_STR)))
-        return 60;
+        return 60 * 1000;
 
     if (!strncasecmp(unit, T_HOUR_STR, strlen(T_HOUR_STR)))
-        return 3600;
+        return 3600 * 1000;
 
     if (!strncasecmp(unit, T_DAY_STR, strlen(T_DAY_STR)))
-        return 86400;
+        return 86400 * 1000;
 
     if (!strncasecmp(unit, T_WEEK_STR, strlen(T_WEEK_STR)))
-        return 86400 * 7;
+        return 86400 * 7 * 1000;
 
     if (!strncasecmp(unit, T_FORTNIGHT_STR, strlen(T_FORTNIGHT_STR)))
-        return 86400 * 14;
+        return 86400 * 14 * 1000;
 
     if (!strncasecmp(unit, T_MONTH_STR, strlen(T_MONTH_STR)))
-        return 86400 * 30;
+        return static_cast<uint64_t>(86400) * 30 * 1000;
 
     if (!strncasecmp(unit, T_YEAR_STR, strlen(T_YEAR_STR)))
-        return static_cast<int>(86400 * 365.2522);
+        return static_cast<uint64_t>(86400 * 1000 * 365.2522);
 
     if (!strncasecmp(unit, T_DECADE_STR, strlen(T_DECADE_STR)))
-        return static_cast<int>(86400 * 365.2522 * 10);
+        return static_cast<uint64_t>(86400 * 1000 * 365.2522 * 10);
 
     debugs(3, 1, "parseTimeUnits: unknown time unit '" << unit << "'");
 
@@ -3003,7 +3007,9 @@ dump_time_t(StoreEntry * entry, const char *name, time_t var)
 void
 parse_time_t(time_t * var)
 {
-    parseTimeLine(var, T_SECOND_STR);
+    time_msec_t tval;
+    parseTimeLine(&tval, T_SECOND_STR);
+    *var = static_cast<time_t>(tval/1000);
 }
 
 static void
@@ -3012,6 +3018,27 @@ free_time_t(time_t * var)
     *var = 0;
 }
 
+static void
+dump_time_msec(StoreEntry * entry, const char *name, time_msec_t var)
+{
+    if (var % 1000)
+        storeAppendPrintf(entry, "%s %"PRId64" milliseconds\n", name, var);
+    else
+        storeAppendPrintf(entry, "%s %d seconds\n", name, (int)(var/1000) );
+}
+
+void
+parse_time_msec(time_msec_t * var)
+{
+    parseTimeLine(var, T_SECOND_STR);
+}
+
+static void
+free_time_msec(time_msec_t * var)
+{
+    *var = 0;
+}
+
 #if UNUSED_CODE
 static void
 dump_size_t(StoreEntry * entry, const char *name, size_t var)
index b1496baf5888a22472d81f0de2fe589d0ec74bcb..fc5f3ff1b27633f375dae964ed4fa8dbb36bcfee 100644 (file)
@@ -57,6 +57,7 @@ size_t
 IpAddress_list
 string
 string
+time_msec
 time_t
 tristate
 uri_whitespace
index 7831da1d3622884ae9b470a06c01e13b93c923f4..d947897b48aa2a6491666d6eef2a90f5bf8524a5 100644 (file)
@@ -6879,7 +6879,7 @@ DOC_START
 DOC_END
 
 NAME: dns_retransmit_interval
-TYPE: time_t
+TYPE: time_msec
 DEFAULT: 5 seconds
 LOC: Config.Timeout.idns_retransmit
 IFDEF: !USE_DNSSERVERS
@@ -6889,7 +6889,7 @@ DOC_START
 DOC_END
 
 NAME: dns_timeout
-TYPE: time_t
+TYPE: time_msec
 DEFAULT: 2 minutes
 LOC: Config.Timeout.idns_query
 IFDEF: !USE_DNSSERVERS
index e8ee3ac7de44d6ef1438d451468f1d781fed2165..77d9bb0fbaab5dfd056f7378af0737926792ef41 100644 (file)
@@ -724,7 +724,9 @@ idnsTickleQueue(void)
     if (NULL == lru_list.tail)
         return;
 
-    eventAdd("idnsCheckQueue", idnsCheckQueue, NULL, 1.0, 1);
+    const double when = min(Config.Timeout.idns_query, Config.Timeout.idns_retransmit)/1000.0;
+
+    eventAdd("idnsCheckQueue", idnsCheckQueue, NULL, when, 1);
 
     event_queued = 1;
 }
@@ -764,7 +766,11 @@ idnsDoSendQueryVC(nsvc *vc)
 
     vc->busy = 1;
 
-    commSetTimeout(vc->fd, Config.Timeout.idns_query, NULL, NULL);
+    // Comm needs seconds but idnsCheckQueue() will check the exact timeout
+    const int timeout = (Config.Timeout.idns_query % 1000 ? 
+        Config.Timeout.idns_query + 1000 : Config.Timeout.idns_query) / 1000;
+        
+    commSetTimeout(vc->fd, timeout, NULL, NULL);
 
     AsyncCall::Pointer call = commCbCall(78, 5, "idnsSentQueryVC",
                                          CommIoCbPtrFun(&idnsSentQueryVC, vc));
@@ -1341,11 +1347,11 @@ idnsCheckQueue(void *unused)
         q = static_cast<idns_query*>(n->data);
 
         /* Anything to process in the queue? */
-        if (tvSubDsec(q->queue_t, current_time) < Config.Timeout.idns_retransmit )
+        if ((time_msec_t)tvSubMsec(q->queue_t, current_time) < Config.Timeout.idns_retransmit )
             break;
 
         /* Query timer expired? */
-        if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * 1 << ((q->nsends - 1) / nns)) {
+        if ((time_msec_t)tvSubMsec(q->sent_t, current_time) < (Config.Timeout.idns_retransmit * 1 << ((q->nsends - 1) / nns))) {
             dlinkDelete(&q->lru, &lru_list);
             q->queue_t = current_time;
             dlinkAdd(q, &q->lru, &lru_list);
@@ -1358,7 +1364,7 @@ idnsCheckQueue(void *unused)
 
         dlinkDelete(&q->lru, &lru_list);
 
-        if (tvSubDsec(q->start_t, current_time) < Config.Timeout.idns_query) {
+        if ((time_msec_t)tvSubMsec(q->start_t, current_time) < Config.Timeout.idns_query) {
             idnsSendQuery(q);
         } else {
             debugs(78, 2, "idnsCheckQueue: ID " << q->xact_id <<
index 9b6e3aef9657059420eea8dc88e22a1368e4f6f4..c99508fa863519fe4d219d3fd3dd7204a34c115d 100644 (file)
@@ -192,8 +192,8 @@ struct SquidConfig {
 
 #if !USE_DNSSERVERS
 
-        time_t idns_retransmit;
-        time_t idns_query;
+        time_msec_t idns_retransmit;
+        time_msec_t idns_query;
 #endif
 
     } Timeout;
index 44d14837e032ae150287a8a99de1d32ffcad41a0..2e7239d8e67a96f9bd81a58faa97a435be014eb5 100644 (file)
@@ -191,4 +191,7 @@ typedef unsigned char cache_key;
 typedef ssize_t mb_size_t;
 
 typedef int STDIRSELECT(const StoreEntry *);
+
+/*Use uint64_t to store miliseconds*/
+typedef uint64_t time_msec_t;
 #endif /* SQUID_TYPEDEFS_H */