]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Millisecond timing patch for events, comm_select/comm_poll, etc.
authorwessels <>
Fri, 15 May 1998 21:16:19 +0000 (21:16 +0000)
committerwessels <>
Fri, 15 May 1998 21:16:19 +0000 (21:16 +0000)
peerPingTimeout() now uses double the average peer RTT

18 files changed:
src/comm.cc
src/event.cc
src/fqdncache.cc
src/globals.h
src/ipcache.cc
src/main.cc
src/neighbors.cc
src/net_db.cc
src/peer_digest.cc
src/peer_select.cc
src/protos.h
src/send-announce.cc
src/stat.cc
src/store.cc
src/store_client.cc
src/store_digest.cc
src/store_rebuild.cc
src/tools.cc

index 47d2a89d12cdacedfffb325e483fc8c797d280b4..93364426571449a8a42d3ef986e2686e661b6a60 100644 (file)
@@ -1,7 +1,7 @@
 
 
 /*
- * $Id: comm.cc,v 1.254 1998/05/11 21:34:10 wessels Exp $
+ * $Id: comm.cc,v 1.255 1998/05/15 15:16:19 wessels Exp $
  *
  * DEBUG: section 5     Socket Functions
  * AUTHOR: Harvest Derived
 #include <netinet/tcp.h>
 #endif
 
+#if USE_ASYNC_IO
+#define MAX_POLL_TIME 50
+#else
+#define MAX_POLL_TIME 1000
+#endif
+
 typedef struct {
     char *host;
     u_short port;
@@ -893,7 +899,7 @@ fdIsHttpOrIcp(int fd)
 #if HAVE_POLL
 /* poll all sockets; call handlers for those that are ready. */
 int
-comm_poll(time_t sec)
+comm_poll(int msec)
 {
     struct pollfd pfds[SQUID_MAXFD];
     PF *hdl = NULL;
@@ -904,10 +910,8 @@ comm_poll(time_t sec)
     int num;
     static time_t last_timeout = 0;
     static int lastinc = 0;
-    int poll_time;
     static int incoming_counter = 0;
-    time_t timeout;
-    timeout = squid_curtime + sec;
+    double timeout = current_dtime + (msec / 1000.0);
     do {
 #if !ALARM_UPDATES_TIME
        getCurrentTime();
@@ -949,13 +953,10 @@ comm_poll(time_t sec)
            debug(5, 2) ("comm_poll: Still waiting on %d FDs\n", nfds);
        if (nfds == 0)
            return COMM_SHUTDOWN;
-#if USE_ASYNC_IO
-       poll_time = sec > 0 ? 50 : 0;
-#else
-       poll_time = sec > 0 ? 1000 : 0;
-#endif
+       if (msec > MAX_POLL_TIME)
+           msec = MAX_POLL_TIME;
        for (;;) {
-           num = poll(pfds, nfds, poll_time);
+           num = poll(pfds, nfds, msec);
            Counter.select_loops++;
            if (num >= 0)
                break;
@@ -1029,7 +1030,7 @@ comm_poll(time_t sec)
            lastinc = polledinc;
        }
        return COMM_OK;
-    } while (timeout > squid_curtime);
+    } while (timeout > current_dtime);
     debug(5, 8) ("comm_poll: time out: %d.\n", squid_curtime);
     return COMM_TIMEOUT;
 }
@@ -1038,7 +1039,7 @@ comm_poll(time_t sec)
 
 /* Select on all sockets; call handlers for those that are ready. */
 int
-comm_select(time_t sec)
+comm_select(int msec)
 {
     fd_set readfds;
     fd_set writefds;
@@ -1052,12 +1053,7 @@ comm_select(time_t sec)
     static time_t last_timeout = 0;
     struct timeval poll_time;
     static int lastinc;
-    time_t timeout;
-
-    /* assume all process are very fast (less than 1 second). Call
-     * time() only once */
-    /* use only 1 second granularity */
-    timeout = squid_curtime + sec;
+    double timeout = current_dtime + (msec / 1000.0);
 
     do {
 #if !ALARM_UPDATES_TIME
@@ -1100,14 +1096,11 @@ comm_select(time_t sec)
            debug(5, 2) ("comm_select: Still waiting on %d FDs\n", nfds);
        if (nfds == 0)
            return COMM_SHUTDOWN;
+       if (msec > MAX_POLL_TIME)
+           msec = MAX_POLL_TIME;
        for (;;) {
-#if USE_ASYNC_IO
-           poll_time.tv_sec = 0;
-           poll_time.tv_usec = sec > 0 ? 50000 : 0;    /* 50 ms */
-#else
-           poll_time.tv_sec = sec > 0 ? 1 : 0;         /* 1 sec */
-           poll_time.tv_usec = 0;
-#endif
+           poll_time.tv_sec = msec / 1000;
+           poll_time.tv_usec = (msec % 1000) * 1000;
            num = select(maxfd, &readfds, &writefds, NULL, &poll_time);
            Counter.select_loops++;
            if (num >= 0)
@@ -1166,7 +1159,7 @@ comm_select(time_t sec)
            lastinc = polledinc;
        }
        return COMM_OK;
-    } while (timeout > squid_curtime);
+    } while (timeout > current_dtime);
     debug(5, 8) ("comm_select: time out: %d\n", (int) squid_curtime);
     return COMM_TIMEOUT;
 }
index cc2ab7e63e4c15c8926ecb997bff2b893184f15d..1a9a34fd227030d6fc70e52245420418b52376dd 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: event.cc,v 1.16 1998/05/14 20:47:59 wessels Exp $
+ * $Id: event.cc,v 1.17 1998/05/15 15:16:20 wessels Exp $
  *
  * DEBUG: section 41    Event Processing
  * AUTHOR: Henrik Nordstrom
@@ -36,7 +36,7 @@ struct ev_entry {
     EVH *func;
     void *arg;
     const char *name;
-    time_t when;
+    double when;
     struct ev_entry *next;
     int weight;
 };
@@ -45,18 +45,18 @@ static struct ev_entry *tasks = NULL;
 static OBJH eventDump;
 
 void
-eventAdd(const char *name, EVH * func, void *arg, time_t when, int weight)
+eventAdd(const char *name, EVH * func, void *arg, double when, int weight)
 {
     struct ev_entry *event = xcalloc(1, sizeof(struct ev_entry));
     struct ev_entry **E;
     event->func = func;
     event->arg = arg;
     event->name = name;
-    event->when = squid_curtime + when;
+    event->when = current_dtime + when;
     event->weight = weight;
     if (NULL != arg)
-        cbdataLock(arg);
-    debug(41, 7) ("eventAdd: Adding '%s', in %d seconds\n", name, (int) when);
+       cbdataLock(arg);
+    debug(41, 7) ("eventAdd: Adding '%s', in %f seconds\n", name, when);
     /* Insert after the last event with the same or earlier time */
     for (E = &tasks; *E; E = &(*E)->next) {
        if ((*E)->when > event->when)
@@ -68,11 +68,15 @@ eventAdd(const char *name, EVH * func, void *arg, time_t when, int weight)
 
 /* same as eventAdd but adds a random offset within +-1/3 of delta_ish */
 void
-eventAddIsh(const char *name, EVH * func, void *arg, time_t delta_ish, int weight)
+eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int weight)
 {
-    if (delta_ish >= 3) {
-       const time_t two_third = (2 * delta_ish) / 3;
-       delta_ish = two_third + (squid_random() % two_third);
+    if (delta_ish >= 3.0) {
+       const double two_third = (2.0 * delta_ish) / 3.0;
+       delta_ish = two_third + (drand48() * two_third);
+       /*
+        * I'm sure drand48() isn't portable.  Tell me what function
+        * you have that returns a random double value in the range 0,1.
+        */
     }
     eventAdd(name, func, arg, delta_ish, weight);
 }
@@ -104,25 +108,25 @@ eventRun(void)
     void *arg;
     int weight = 0;
     while (0 == weight) {
-        if ((event = tasks) == NULL)
+       if ((event = tasks) == NULL)
            break;
-        if (event->when > squid_curtime)
+       if (event->when > current_dtime)
            break;
-        func = event->func;
-        arg = event->arg;
-        event->func = NULL;
-        event->arg = NULL;
-        tasks = event->next;
-        if (NULL != arg) {
-            int valid = cbdataValid(arg);
-            cbdataUnlock(arg);
-            if (!valid)
-               return;
-        }
-        weight += event->weight;
-        debug(41, 7) ("eventRun: Running '%s'\n", event->name);
-        func(arg);
-        safe_free(event);
+       func = event->func;
+       arg = event->arg;
+       event->func = NULL;
+       event->arg = NULL;
+       tasks = event->next;
+       if (NULL != arg) {
+           int valid = cbdataValid(arg);
+           cbdataUnlock(arg);
+           if (!valid)
+               return;
+       }
+       weight += event->weight;
+       debug(41, 7) ("eventRun: Running '%s'\n", event->name);
+       func(arg);
+       safe_free(event);
     }
 }
 
@@ -131,7 +135,7 @@ eventNextTime(void)
 {
     if (!tasks)
        return (time_t) 10;
-    return tasks->when - squid_curtime;
+    return (time_t) ((tasks->when - current_dtime) * 1000);
 }
 
 void
@@ -150,8 +154,8 @@ eventDump(StoreEntry * sentry)
        "Operation",
        "Next Execution");
     while (e != NULL) {
-       storeAppendPrintf(sentry, "%s\t%d seconds\n",
-           e->name, (int) (e->when - squid_curtime));
+       storeAppendPrintf(sentry, "%s\t%f seconds\n",
+           e->name, e->when - current_dtime);
        e = e->next;
     }
 }
index 09db48e806164092629730e825116e4fbeafc9df..8b362cab0e765f75389c4dc0b162dfa7151213e2 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: fqdncache.cc,v 1.101 1998/05/14 20:48:00 wessels Exp $
+ * $Id: fqdncache.cc,v 1.102 1998/05/15 15:16:21 wessels Exp $
  *
  * DEBUG: section 35    FQDN Cache
  * AUTHOR: Harvest Derived
@@ -248,7 +248,7 @@ fqdncache_purgelru(void *notused)
     dlink_node *prev = NULL;
     fqdncache_entry *f;
     int removed = 0;
-    eventAdd("fqdncache_purgelru", fqdncache_purgelru, NULL, 10, 1);
+    eventAdd("fqdncache_purgelru", fqdncache_purgelru, NULL, 10.0, 1);
     for (m = lru_list.tail; m; m = prev) {
        if (memInUse(MEM_FQDNCACHE_ENTRY) < fqdncache_low)
            break;
index 5ef074be4a6274391a7f5dc74cc9b2a372ec6a5d..676f57c4b133e1f2cdbd234c41b5a3476f0d7a80 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: globals.h,v 1.54 1998/04/24 07:09:33 wessels Exp $
+ * $Id: globals.h,v 1.55 1998/05/15 15:16:22 wessels Exp $
  */
 
 extern FILE *debug_log;                /* NULL */
@@ -92,6 +92,7 @@ extern char *icp_opcode_str[];
 extern char *swap_log_op_str[];
 extern char *lookup_t_str[];
 extern double request_failure_ratio;   /* 0.0 */
+extern double current_dtime;
 extern int store_hash_buckets; /* 0 */
 extern hash_table *store_table;        /* NULL */
 extern dlink_list store_list;
index 23b23521b0fba7a54c14737ea87272867fe333f3..d29816dd88a4a2f771539ba05488f07c225cf336 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: ipcache.cc,v 1.186 1998/05/14 20:48:01 wessels Exp $
+ * $Id: ipcache.cc,v 1.187 1998/05/15 15:16:23 wessels Exp $
  *
  * DEBUG: section 14    IP Cache
  * AUTHOR: Harvest Derived
@@ -284,7 +284,7 @@ ipcache_purgelru(void *voidnotused)
     dlink_node *prev = NULL;
     ipcache_entry *i;
     int removed = 0;
-    eventAdd("ipcache_purgelru", ipcache_purgelru, NULL, 10, 1);
+    eventAdd("ipcache_purgelru", ipcache_purgelru, NULL, 10.0, 1);
     for (m = lru_list.tail; m; m = prev) {
        if (memInUse(MEM_IPCACHE_ENTRY) < ipcache_low)
            break;
index 5b7c501c9ea846ca438bdbbc7a2b3ce9b279edc4..541ecc813e8026e4b3cb85433caad352f5e98258 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: main.cc,v 1.250 1998/05/14 20:48:03 wessels Exp $
+ * $Id: main.cc,v 1.251 1998/05/15 15:16:25 wessels Exp $
  *
  * DEBUG: section 1     Startup and Main Loop
  * AUTHOR: Harvest Derived
@@ -465,7 +465,7 @@ mainInitialize(void)
     redirectOpenServers();
     useragentOpenLog();
     httpHeaderInitModule();    /* must go before any header processing (e.g. the one in errorInitialize) */
-    httpAnonInitModule();       /* must go before accepting requests */
+    httpAnonInitModule();      /* must go before accepting requests */
     errorInitialize();
     accessLogInit();
 #ifdef SQUID_SNMP
@@ -517,12 +517,12 @@ mainInitialize(void)
     debug(1, 0) ("Ready to serve requests.\n");
 
     if (!configured_once) {
-       eventAdd("storeMaintain", storeMaintainSwapSpace, NULL, 1, 1);
-       eventAdd("storeDirClean", storeDirClean, NULL, 15, 1);
+       eventAdd("storeMaintain", storeMaintainSwapSpace, NULL, 1.0, 1);
+       eventAdd("storeDirClean", storeDirClean, NULL, 15.0, 1);
        if (Config.onoff.announce)
-           eventAdd("start_announce", start_announce, NULL, 3600, 1);
-       eventAdd("ipcache_purgelru", ipcache_purgelru, NULL, 10, 1);
-       eventAdd("fqdncache_purgelru", fqdncache_purgelru, NULL, 15, 1);
+           eventAdd("start_announce", start_announce, NULL, 3600.0, 1);
+       eventAdd("ipcache_purgelru", ipcache_purgelru, NULL, 10.0, 1);
+       eventAdd("fqdncache_purgelru", fqdncache_purgelru, NULL, 15.0, 1);
     }
     configured_once = 1;
 }
index 40c717837cf8aa383d6b770a8b2d92c6e38839dd..3a1b7af186b8c30282537256696dd720a907774c 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: neighbors.cc,v 1.209 1998/05/14 20:48:05 wessels Exp $
+ * $Id: neighbors.cc,v 1.210 1998/05/15 15:16:27 wessels Exp $
  *
  * DEBUG: section 15    Neighbor Routines
  * AUTHOR: Harvest Derived
@@ -413,7 +413,8 @@ neighborsUdpPing(request_t * request,
     StoreEntry * entry,
     IRCB * callback,
     void *callback_data,
-    int *exprep)
+    int *exprep,
+    double *exprtt)
 {
     const char *url = storeUrl(entry);
     MemObject *mem = entry->mem_obj;
@@ -433,6 +434,7 @@ neighborsUdpPing(request_t * request,
     mem->start_ping = current_time;
     mem->icp_reply_callback = callback;
     mem->ircb_data = callback_data;
+    *exprtt = 0.0;
     for (i = 0, p = first_ping; i++ < Config.npeers; p = p->next) {
        if (p == NULL)
            p = Config.peers;
@@ -494,6 +496,7 @@ neighborsUdpPing(request_t * request,
        } else if (neighborUp(p)) {
            /* its alive, expect a reply from it */
            (*exprep)++;
+           (*exprtt) += (double) p->stats.rtt;
        } else {
            /* Neighbor is dead; ping it anyway, but don't expect a reply */
            /* log it once at the threshold */
@@ -544,6 +547,13 @@ neighborsUdpPing(request_t * request,
     request->hierarchy.n_sent = peers_pinged;
     request->hierarchy.n_expect = *exprep;
 #endif
+    /*
+     * Average out the expected RTT and then double it
+     */
+    if (*exprep > 0)
+       (*exprtt) = 2.0 * (*exprtt) / (double) (*exprep);
+    else
+       *exprtt = Config.neighborTimeout;
     return peers_pinged;
 }
 
@@ -570,7 +580,7 @@ peerDigestLookup(peer * p, request_t * request, StoreEntry * entry)
        debug(15, 5) ("peerDigestLookup: !initialized\n");
        if (!EBIT_TEST(p->digest.flags, PD_INIT_PENDING)) {
            EBIT_SET(p->digest.flags, PD_INIT_PENDING);
-           eventAdd("peerDigestInit", peerDigestInit, p, 0);
+           eventAdd("peerDigestInit", peerDigestInit, p, 0.0, 1);
        }
        return LOOKUP_NONE;
     } else {
@@ -939,7 +949,7 @@ peerDNSConfigure(const ipcache_addrs * ia, void *data)
     ap->sin_port = htons(p->icp_port);
     if (p->type == PEER_MULTICAST)
        peerCountMcastPeersSchedule(p, 10);
-    eventAddIsh("netdbExchangeStart", netdbExchangeStart, p, 30, 1);
+    eventAddIsh("netdbExchangeStart", netdbExchangeStart, p, 30.0, 1);
 }
 
 static void
@@ -954,7 +964,7 @@ peerRefreshDNS(void *datanotused)
        ipcache_nbgethostbyname(p->host, peerDNSConfigure, p);
     }
     /* Reconfigure the peers every hour */
-    eventAddIsh("peerRefreshDNS", peerRefreshDNS, NULL, 3600, 1);
+    eventAddIsh("peerRefreshDNS", peerRefreshDNS, NULL, 3600.0, 1);
 }
 
 /*
@@ -994,7 +1004,7 @@ peerCheckConnectDone(int fd, int status, void *data)
        debug(15, 0) ("TCP connection to %s/%d succeeded\n",
            p->host, p->http_port);
     } else {
-       eventAdd("peerCheckConnect", peerCheckConnect, p, 80, 1);
+       eventAdd("peerCheckConnect", peerCheckConnect, p, 80.0, 1);
     }
     comm_close(fd);
     return;
@@ -1008,7 +1018,7 @@ peerCheckConnectStart(peer * p)
     debug(15, 0) ("TCP connection to %s/%d failed\n", p->host, p->http_port);
     p->tcp_up = 0;
     p->last_fail_time = squid_curtime;
-    eventAdd("peerCheckConnect", peerCheckConnect, p, 80, 1);
+    eventAdd("peerCheckConnect", peerCheckConnect, p, 80.0, 1);
 }
 
 static void
@@ -1019,7 +1029,7 @@ peerCountMcastPeersSchedule(peer * p, time_t when)
     eventAdd("peerCountMcastPeersStart",
        peerCountMcastPeersStart,
        p,
-       when, 1);
+       (double) when, 1);
     p->mcast.flags |= PEER_COUNT_EVENT_PENDING;
 }
 
@@ -1059,7 +1069,7 @@ peerCountMcastPeersStart(void *data)
     eventAdd("peerCountMcastPeersDone",
        peerCountMcastPeersDone,
        psstate,
-       Config.neighborTimeout, 1);
+       (double) Config.neighborTimeout, 1);
     p->mcast.flags |= PEER_COUNTING;
     peerCountMcastPeersSchedule(p, MCAST_COUNT_RATE);
 }
index 136c6e303a1d249940ea8c544ba0596674449fa3..9c1d44f0aabfbec9c268a242b7daa8f7e81a8fff 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: net_db.cc,v 1.101 1998/05/14 20:48:06 wessels Exp $
+ * $Id: net_db.cc,v 1.102 1998/05/15 15:16:28 wessels Exp $
  *
  * DEBUG: section 37    Network Measurement Database
  * AUTHOR: Duane Wessels
@@ -397,7 +397,7 @@ netdbSaveState(void *foo)
     getCurrentTime();
     debug(37, 0) ("NETDB state saved; %d entries, %d msec\n",
        count, tvSubMsec(start, current_time));
-    eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600, 1);
+    eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600.0, 1);
 }
 
 static void
@@ -627,7 +627,7 @@ netdbInit(void)
     addr_table = hash_create((HASHCMP *) strcmp, n, hash_string);
     n = hashPrime(3 * Config.Netdb.high / 4);
     host_table = hash_create((HASHCMP *) strcmp, n, hash_string);
-    eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600, 1);
+    eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600.0, 1);
     netdbReloadState();
     cachemgrRegister("netdb",
        "Network Measurement Database",
index b66acfd827520f379b0a5082da2c637b876de720..a06403e2b9011dae0793067dbb4cb265c6c161fb 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: peer_digest.cc,v 1.29 1998/05/14 20:48:07 wessels Exp $
+ * $Id: peer_digest.cc,v 1.30 1998/05/15 15:16:29 wessels Exp $
  *
  * DEBUG: section 72    Peer Digest Routines
  * AUTHOR: Alex Rousskov
@@ -71,10 +71,10 @@ peerDigestInit(void *data)
 {
     peer *p = data;
     assert(p);
-    assert(p->digest.flags == (1<<PD_INIT_PENDING));
+    assert(p->digest.flags == (1 << PD_INIT_PENDING));
     assert(!p->digest.cd);
     assert(SM_PAGE_SIZE == 4096);      /* we use MEM_4K_BUF */
-debug(0,0)("peerDigestInit: called for %s\n", p->host);
+    debug(0, 0) ("peerDigestInit: called for %s\n", p->host);
     if (EBIT_TEST(p->options, NEIGHBOR_NO_DIGEST)) {
        peerDigestDisable(p);
     } else {
@@ -142,7 +142,7 @@ peerDigestDelay(peer * p, int disable, time_t delay)
            disable ? "disabling" : "delaying",
            p->host ? p->host : "<null>",
            delay, mkrfc1123(squid_curtime + delay));
-       eventAdd("peerDigestValidate", peerDigestValidate, p, delay, 1);
+       eventAdd("peerDigestValidate", peerDigestValidate, p, (double) delay, 1);
     } else {
        assert(disable);
        debug(72, 2) ("peerDigestDisable: disabling peer %s for good\n",
@@ -154,7 +154,7 @@ peerDigestDelay(peer * p, int disable, time_t delay)
 
 /* request new digest if our copy is too old; schedule next validation */
 static void
-peerDigestValidate(void * data)
+peerDigestValidate(void *data)
 {
     peer *p = data;
     StoreEntry *e = NULL;
@@ -244,8 +244,8 @@ peerDigestRequest(peer * p)
     debug(72, 2) ("peerDigestRequest: %s key: %s\n", url, storeKeyText(key));
     req = urlParse(METHOD_GET, url);
     if (NULL == req) {
-       debug(72,1)("peerDigestRequest: Bad URI: %s\n", url);
-       return;         /* @?@ */
+       debug(72, 1) ("peerDigestRequest: Bad URI: %s\n", url);
+       return;                 /* @?@ */
     }
     requestLink(req);
     assert(req);
index 4f760bdb20160a50dc44942d67451bcca5c8558f..b5e06a1ff27c86182b7baacb19b5868d0bd87f50 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: peer_select.cc,v 1.57 1998/05/14 20:48:08 wessels Exp $
+ * $Id: peer_select.cc,v 1.58 1998/05/15 15:16:30 wessels Exp $
  *
  * DEBUG: section 44    Peer Selection Algorithm
  * AUTHOR: Duane Wessels
@@ -238,6 +238,7 @@ peerSelectFoo(ps_state * psstate)
     StoreEntry *entry = psstate->entry;
     request_t *request = psstate->request;
     int direct;
+    double expected_rtt;
     debug(44, 3) ("peerSelectFoo: '%s %s'\n",
        RequestMethodStr[request->method],
        request->host);
@@ -294,9 +295,9 @@ peerSelectFoo(ps_state * psstate)
        request->hier.alg = PEER_SA_NETDB;
        code = CLOSEST_PARENT;
        debug(44, 2) ("peerSelect: %s/%s\n", hier_strings[code], p->host);
-        hierarchyNote(&request->hier, code, &psstate->icp, p->host);
-        peerSelectCallback(psstate, p);
-        return;
+       hierarchyNote(&request->hier, code, &psstate->icp, p->host);
+       peerSelectCallback(psstate, p);
+       return;
     } else if (peerSelectIcpPing(request, direct, entry)) {
        assert(entry->ping_status == PING_NONE);
        request->hier.alg = PEER_SA_ICP;
@@ -306,17 +307,19 @@ peerSelectFoo(ps_state * psstate)
            entry,
            peerHandleIcpReply,
            psstate,
-           &psstate->icp.n_replies_expected);
+           &psstate->icp.n_replies_expected,
+           &expected_rtt);
        if (psstate->icp.n_sent == 0)
            debug(44, 0) ("WARNING: neighborsUdpPing returned 0\n");
-       debug(44,3)("peerSelectFoo: %d ICP replies expected\n",
-               psstate->icp.n_replies_expected);
+       debug(44, 3) ("peerSelectFoo: %d ICP replies expected, RTT %f\n",
+           psstate->icp.n_replies_expected, expected_rtt);
        if (psstate->icp.n_replies_expected > 0) {
            entry->ping_status = PING_WAITING;
            eventAdd("peerPingTimeout",
                peerPingTimeout,
                psstate,
-               Config.neighborTimeout, 0);
+               expected_rtt,
+               0);
            return;
        }
     }
index 2d474b47a6cb5d755e17adec20ba6a08b818b863..48565264e200bc848ad501bfa7b7a4f3758e18d9 100644 (file)
@@ -106,9 +106,9 @@ extern int comm_listen(int sock);
 extern int comm_open(int, int, struct in_addr, u_short port, int, const char *note);
 extern u_short comm_local_port(int fd);
 #if HAVE_POLL
-extern int comm_poll(time_t);
+extern int comm_poll(int);
 #else
-extern int comm_select(time_t);
+extern int comm_select(int);
 #endif
 extern void commSetSelect(int, unsigned int, PF *, void *, time_t);
 extern void comm_add_close_handler(int fd, PF *, void *);
@@ -165,8 +165,8 @@ extern dnsserver_t *dnsGetFirstAvailable(void);
 extern void dnsStats(StoreEntry *);
 extern void dnsFreeMemory(void);
 
-extern void eventAdd(const char *name, EVH * func, void *arg, time_t when, int);
-extern void eventAddIsh(const char *name, EVH * func, void *arg, time_t delta_ish, int);
+extern void eventAdd(const char *name, EVH * func, void *arg, double when, int);
+extern void eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int);
 extern void eventRun(void);
 extern time_t eventNextTime(void);
 extern void eventDelete(EVH * func, void *arg);
@@ -232,7 +232,7 @@ extern void httpProcessReplyHeader(HttpStateData *, const char *, int);
 extern size_t httpBuildRequestPrefix(request_t * request,
     request_t * orig_request,
     StoreEntry * entry,
-    MemBuf *mb,
+    MemBuf * mb,
     int cfd,
     int flags);
 extern void httpAnonInitModule();
@@ -271,7 +271,7 @@ extern void httpBodyPackInto(const HttpBody * body, Packer * p);
 extern void httpHdrCcInitModule();
 extern void httpHdrCcCleanModule();
 extern HttpHdrCc *httpHdrCcCreate();
-extern HttpHdrCc *httpHdrCcParseCreate(const String *str);
+extern HttpHdrCc *httpHdrCcParseCreate(const String * str);
 extern void httpHdrCcDestroy(HttpHdrCc * cc);
 extern HttpHdrCc *httpHdrCcDup(const HttpHdrCc * cc);
 extern void httpHdrCcPackInto(const HttpHdrCc * cc, Packer * p);
@@ -281,9 +281,9 @@ extern void httpHdrCcUpdateStats(const HttpHdrCc * cc, StatHist * hist);
 extern void httpHdrCcStatDumper(StoreEntry * sentry, int idx, double val, double size, int count);
 
 /* Http Range Header Field */
-extern HttpHdrRange *httpHdrRangeParseCreate(const String *range_spec);
+extern HttpHdrRange *httpHdrRangeParseCreate(const String * range_spec);
 /* returns true if ranges are valid; inits HttpHdrRange */
-extern int httpHdrRangeParseInit(HttpHdrRange * range, const String *range_spec);
+extern int httpHdrRangeParseInit(HttpHdrRange * range, const String * range_spec);
 extern void httpHdrRangeDestroy(HttpHdrRange * range);
 extern HttpHdrRange *httpHdrRangeDup(const HttpHdrRange * range);
 extern void httpHdrRangePackInto(const HttpHdrRange * range, Packer * p);
@@ -304,10 +304,10 @@ extern void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count);
 extern int httpHeaderIdByName(const char *name, int name_len, const HttpHeaderFieldInfo * attrs, int end);
 extern void httpHeaderMaskInit(HttpHeaderMask * mask);
 extern void httpHeaderCalcMask(HttpHeaderMask * mask, const int *enums, int count);
-extern int httpHeaderHasConnDir(const HttpHeader *hdr, const char *directive);
-extern void strListAdd(String *str, const char *item, char del);
-extern int strListIsMember(const String *str, const char *item, char del);
-extern int strListGetItem(const String *str, char del, const char **item, int *ilen, const char **pos);
+extern int httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive);
+extern void strListAdd(String * str, const char *item, char del);
+extern int strListIsMember(const String * str, const char *item, char del);
+extern int strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos);
 extern const char *getStringPrefix(const char *str, const char *end);
 extern int httpHeaderParseInt(const char *start, int *val);
 extern int httpHeaderParseSize(const char *start, size_t * sz);
@@ -329,7 +329,7 @@ extern void httpHeaderPutInt(HttpHeader * hdr, http_hdr_type type, int number);
 extern void httpHeaderPutTime(HttpHeader * hdr, http_hdr_type type, time_t time);
 extern void httpHeaderPutStr(HttpHeader * hdr, http_hdr_type type, const char *str);
 extern void httpHeaderPutAuth(HttpHeader * hdr, const char *authScheme, const char *realm);
-extern void httpHeaderPutCc(HttpHeader * hdr, const HttpHdrCc *cc);
+extern void httpHeaderPutCc(HttpHeader * hdr, const HttpHdrCc * cc);
 extern void httpHeaderPutExt(HttpHeader * hdr, const char *name, const char *value);
 extern int httpHeaderGetInt(const HttpHeader * hdr, http_hdr_type id);
 extern time_t httpHeaderGetTime(const HttpHeader * hdr, http_hdr_type id);
@@ -351,7 +351,7 @@ extern void httpHeaderEntryPackInto(const HttpHeaderEntry * e, Packer * p);
 extern void httpHeaderStoreReport(StoreEntry * e);
 
 /* Http Msg (currently in HttpReply.c @?@ ) */
-extern int httpMsgIsPersistent(float http_ver, const HttpHeader *hdr);
+extern int httpMsgIsPersistent(float http_ver, const HttpHeader * hdr);
 extern int httpMsgIsolateHeaders(const char **parse_start, const char **blk_start, const char **blk_end);
 
 /* Http Reply */
@@ -392,9 +392,9 @@ extern request_t *requestCreate(method_t, protocol_t, const char *urlpath);
 extern void requestDestroy(request_t *);
 extern request_t *requestLink(request_t *);
 extern void requestUnlink(request_t *);
-extern int httpRequestParseHeader(request_t *req, const char *parse_start);
+extern int httpRequestParseHeader(request_t * req, const char *parse_start);
 extern void httpRequestSetHeaders(request_t *, method_t, const char *uri, const char *header_str);
-extern int httpRequestHdrAllowed(const HttpHeaderEntry *e, String *strConnection);
+extern int httpRequestHdrAllowed(const HttpHeaderEntry * e, String * strConnection);
 
 extern void icmpOpen(void);
 extern void icmpClose(void);
@@ -505,7 +505,8 @@ extern int neighborsUdpPing(request_t *,
     StoreEntry *,
     IRCB * callback,
     void *data,
-    int *exprep);
+    int *exprep,
+    double *exprtt);
 extern void neighborAddAcl(const char *, const char *);
 extern void neighborsUdpAck(const cache_key *, icp_common_t *, const struct sockaddr_in *);
 extern void neighborAdd(const char *, const char *, int, int, int, int, int);
index 19956ad7f0d52b3f5386f8f1e5f5ce8703443c87..4416f75716c7c5f1d2f772c110b86ef44cf86ab9 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: send-announce.cc,v 1.50 1998/05/14 20:48:11 wessels Exp $
+ * $Id: send-announce.cc,v 1.51 1998/05/15 15:16:32 wessels Exp $
  *
  * DEBUG: section 27    Cache Announcer
  * AUTHOR: Duane Wessels
@@ -43,7 +43,7 @@ start_announce(void *datanotused)
        return;
     cbdataAdd(junk = xmalloc(1), MEM_NONE);
     ipcache_nbgethostbyname(Config.Announce.host, send_announce, junk);
-    eventAdd("send_announce", start_announce, NULL, Config.Announce.period, 1);
+    eventAdd("send_announce", start_announce, NULL, (double) Config.Announce.period, 1);
 }
 
 static void
index d5e2073e2f26b626f9449de03f07b8de4b1a3392..1d672a84fecc7439d6b345b2887f5b56cba965bb 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: stat.cc,v 1.247 1998/05/14 20:48:12 wessels Exp $
+ * $Id: stat.cc,v 1.248 1998/05/15 15:16:33 wessels Exp $
  *
  * DEBUG: section 18    Cache Manager Statistics
  * AUTHOR: Harvest Derived
@@ -750,7 +750,7 @@ statInit(void)
     for (i = 0; i < N_COUNT_HOUR_HIST; i++)
        statCountersInit(&CountHourHist[i]);
     statCountersInit(&Counter);
-    eventAdd("statAvgTick", statAvgTick, NULL, COUNT_INTERVAL, 1);
+    eventAdd("statAvgTick", statAvgTick, NULL, (double) COUNT_INTERVAL, 1);
     cachemgrRegister("info",
        "General Runtime Information",
        info_get, 0);
index dda67107cf39f1be7d9d06ea1943676747336a65..ce300a941c10f268519c5cc0aa854045ea972ac8 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: store.cc,v 1.414 1998/05/14 20:48:15 wessels Exp $
+ * $Id: store.cc,v 1.415 1998/05/15 15:16:35 wessels Exp $
  *
  * DEBUG: section 20    Storage Manager
  * AUTHOR: Harvest Derived
@@ -657,7 +657,7 @@ storeMaintainSwapSpace(void *datanotused)
     int max_scan;
     int max_remove;
     static time_t last_warn_time = 0;
-    eventAdd("storeMaintainSwapSpace", storeMaintainSwapSpace, NULL, 1, 1);
+    eventAdd("storeMaintainSwapSpace", storeMaintainSwapSpace, NULL, 1.0, 1);
     /* We can't delete objects while rebuilding swap */
     if (store_rebuilding)
        return;
index 23dd326597139e12913f2f1b5e1cd7c19ba7c136..74ccc31bbadb9a285f41fe04db95c119750ebe21 100644 (file)
@@ -140,7 +140,7 @@ storeClientCopy2(StoreEntry * e, store_client * sc)
     if (sc->flags.store_copying) {
        sc->flags.copy_event_pending = 1;
        debug(20, 3) ("storeClientCopy: Queueing storeClientCopyEvent()\n");
-       eventAdd("storeClientCopyEvent", storeClientCopyEvent, sc, 0, 0);
+       eventAdd("storeClientCopyEvent", storeClientCopyEvent, sc, 0.0, 0);
        return;
     }
     cbdataLock(sc);            /* ick, prevent sc from getting freed */
index 6df82f0155db691b0dccb81f3c3bfd6c1a809095..452d299e3de0e7fad8a2a1b9aefe944e8430963e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: store_digest.cc,v 1.16 1998/05/14 20:48:17 wessels Exp $
+ * $Id: store_digest.cc,v 1.17 1998/05/15 15:16:37 wessels Exp $
  *
  * DEBUG: section 71    Store Digest Manager
  * AUTHOR: Alex Rousskov
@@ -200,7 +200,7 @@ storeDigestRebuildResume()
     if (!storeDigestResize())
        cacheDigestClear(store_digest);         /* not clean()! */
     memset(&sd_stats, 0, sizeof(sd_stats));
-    eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0, 1);
+    eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0.0, 1);
 }
 
 /* finishes swap out sequence for the digest; schedules next rebuild */
@@ -211,7 +211,7 @@ storeDigestRebuildFinish()
     sd_state.rebuild_lock = 0;
     sd_state.rebuild_count++;
     debug(71, 2) ("storeDigestRebuildFinish: done.\n");
-    eventAdd("storeDigestRebuildStart", storeDigestRebuildStart, NULL, StoreDigestRebuildPeriod, 1);
+    eventAdd("storeDigestRebuildStart", storeDigestRebuildStart, NULL, (double) StoreDigestRebuildPeriod, 1);
     /* resume pending Rewrite if any */
     if (sd_state.rewrite_lock)
        storeDigestRewriteResume();
@@ -238,7 +238,7 @@ storeDigestRebuildStep(void *datanotused)
     if (sd_state.rebuild_offset >= store_hash_buckets)
        storeDigestRebuildFinish();
     else
-       eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0, 1);
+       eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0.0, 1);
 }
 
 
@@ -295,7 +295,7 @@ storeDigestRewriteResume()
     httpReplySwapOut(e->mem_obj->reply, e);
     storeDigestCBlockSwapOut(e);
     storeBufferFlush(e);
-    eventAdd("storeDigestSwapOutStep", storeDigestSwapOutStep, sd_state.rewrite_lock, 0, 1);
+    eventAdd("storeDigestSwapOutStep", storeDigestSwapOutStep, sd_state.rewrite_lock, 0.0, 1);
 }
 
 /* finishes swap out sequence for the digest; schedules next rewrite */
@@ -311,14 +311,14 @@ storeDigestRewriteFinish(StoreEntry * e)
     requestUnlink(e->mem_obj->request);
     e->mem_obj->request = NULL;
     storeUnlockObject(e);
-       /*
-        * note, it won't really get free()'d here because we used
-        * MEM_DONTFREE in the call to cbdataAdd().
-        */
+    /*
+     * note, it won't really get free()'d here because we used
+     * MEM_DONTFREE in the call to cbdataAdd().
+     */
     cbdataFree(sd_state.rewrite_lock);
     sd_state.rewrite_lock = e = NULL;
     sd_state.rewrite_count++;
-    eventAdd("storeDigestRewriteStart", storeDigestRewriteStart, NULL, StoreDigestRewritePeriod, 1);
+    eventAdd("storeDigestRewriteStart", storeDigestRewriteStart, NULL, (double) StoreDigestRewritePeriod, 1);
     /* resume pending Rebuild if any */
     if (sd_state.rebuild_lock)
        storeDigestRebuildResume();
@@ -326,9 +326,9 @@ storeDigestRewriteFinish(StoreEntry * e)
 
 /* swaps out one digest "chunk" per invocation; schedules next swap out */
 static void
-storeDigestSwapOutStep(void * data)
+storeDigestSwapOutStep(void *data)
 {
-    StoreEntry * e = data;
+    StoreEntry *e = data;
     int chunk_size = StoreDigestSwapOutChunkSize;
     assert(e);
     assert(e == sd_state.rewrite_lock);
@@ -343,7 +343,7 @@ storeDigestSwapOutStep(void * data)
     if (sd_state.rewrite_offset >= store_digest->mask_size)
        storeDigestRewriteFinish(e);
     else
-       eventAdd("storeDigestSwapOutStep", storeDigestSwapOutStep, e, 0, 1);
+       eventAdd("storeDigestSwapOutStep", storeDigestSwapOutStep, e, 0.0, 1);
 }
 
 static void
index 355d748829305ace25f69976486eb5d0ab50d597..5e858c7004b8ec4dd84512be97750f7968a5dc66 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: store_rebuild.cc,v 1.37 1998/05/14 20:48:18 wessels Exp $
+ * $Id: store_rebuild.cc,v 1.38 1998/05/15 15:16:38 wessels Exp $
  *
  * DEBUG: section 20    Store Rebuild Routines
  * AUTHOR: Duane Wessels
@@ -395,7 +395,7 @@ storeRebuildADirectory(void *unused)
     if (opt_foreground_rebuild)
        storeRebuildADirectory(NULL);
     else
-       eventAdd("storeRebuild", storeRebuildADirectory, NULL, 0, 1);
+       eventAdd("storeRebuild", storeRebuildADirectory, NULL, 0.0, 1);
 }
 
 #if TEMP_UNUSED_CODE
@@ -627,7 +627,7 @@ storeCleanup(void *datanotused)
        if ((++validnum & 0xFFFF) == 0)
            debug(20, 1) ("  %7d Entries Validated so far.\n", validnum);
     }
-    eventAdd("storeCleanup", storeCleanup, NULL, 0, 1);
+    eventAdd("storeCleanup", storeCleanup, NULL, 0.0, 1);
 }
 
 void
@@ -720,7 +720,7 @@ storeRebuildComplete(void)
        r > 0 ? (int) r : 0,
        (double) RebuildState.objcount / (r > 0 ? r : 1));
     debug(20, 1) ("Beginning Validation Procedure\n");
-    eventAdd("storeCleanup", storeCleanup, NULL, 0, 1);
+    eventAdd("storeCleanup", storeCleanup, NULL, 0.0, 1);
 }
 
 void
@@ -760,5 +760,5 @@ storeRebuildStart(void)
        debug(20, 1) ("Rebuilding storage in Cache Dir #%d (%s)\n",
            i, clean ? "CLEAN" : "DIRTY");
     }
-    eventAdd("storeRebuild", storeRebuildADirectory, NULL, 0, 1);
+    eventAdd("storeRebuild", storeRebuildADirectory, NULL, 0.0, 1);
 }
index b80886a0b2f6b7a67a8fb48a00e39068280e85b4..f21750583828dbd85de39f4993929fb3c6b7b778 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: tools.cc,v 1.153 1998/04/08 00:34:20 wessels Exp $
+ * $Id: tools.cc,v 1.154 1998/05/15 15:16:39 wessels Exp $
  *
  * DEBUG: section 21    Misc Functions
  * AUTHOR: Harvest Derived
@@ -718,6 +718,8 @@ getCurrentTime(void)
 #else
     gettimeofday(&current_time, NULL);
 #endif
+    current_dtime = (double) current_time.tv_sec +
+       (double) current_time.tv_usec / 1000000.0;
     return squid_curtime = current_time.tv_sec;
 }