There is a small design error in my patch, making it perform slightly
different than I described.
        if (parent_timeout > sibling_timeout)
should read
        if (parent_exprep)
Updated patch attached.
Which one is the correct I don't know. Should Squid bother waiting for
slow siblings when the parents are much faster (at least twice as fast)?
/Henrik
    [ Part 2: "Attached Text" ]
Index: squid/src/neighbors.c
diff -u squid/src/neighbors.c:1.1.1.31.6.2 squid/src/neighbors.c:1.1.1.31.6.4
--- squid/src/neighbors.c:1.1.1.31.6.2	Wed May  5 11:33:50 1999
+++ squid/src/neighbors.c	Sat May  8 14:28:45 1999
@@ -374,6 +374,8 @@
     icp_common_t *query;
     int queries_sent = 0;
     int peers_pinged = 0;
+    int parent_timeout = 0, parent_exprep = 0;
+    int sibling_timeout = 0, sibling_exprep = 0;
 
     if (Config.peers == NULL)
         return 0;
@@ -383,7 +385,6 @@
     mem->start_ping = current_time;
     mem->ping_reply_callback = callback;
     mem->ircb_data = callback_data;
-    *timeout = 0.0;
     reqnum = icpSetCacheKey(entry->key);
     for (i = 0, p = first_ping; i++ < Config.npeers; p = p->next) {
         if (p == NULL)
@@ -438,8 +439,13 @@
             (*exprep) += p->mcast.n_replies_expected;
         } else if (neighborUp(p)) {
             /* its alive, expect a reply from it */
-	    (*exprep)++;
-	    (*timeout) += p->stats.rtt;
+	    if (neighborType(p, request) == PEER_PARENT) {
+		parent_exprep++;
+		parent_timeout += p->stats.rtt;
+	    } else {
+		sibling_exprep++;
+		sibling_timeout += p->stats.rtt;
+	    }
         } else {
             /* Neighbor is dead; ping it anyway, but don't expect a reply */
             /* log it once at the threshold */
@@ -489,12 +495,20 @@
     }
 #endif
     /*
+     * How many replies to expect?
+     */
+    *exprep = parent_exprep + sibling_exprep;
+    /*
      * If there is a configured timeout, use it
      */
     if (Config.Timeout.icp_query)
         *timeout = Config.Timeout.icp_query;
     else if (*exprep > 0)
-	(*timeout) = 2 * (*timeout) / (*exprep);
+	/* Else use a calculated timeout */
+	if (parent_exprep)
+	    *timeout = 2 * parent_timeout / parent_exprep;
+	else
+	    *timeout = 2 * sibling_timeout / sibling_exprep;
     else
         *timeout = 2000;	/* 2 seconds */
     return peers_pinged;
Received on Tue Jul 29 2003 - 13:15:58 MDT
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:12:07 MST