- ares__send_query() now varies the retry timeout pseudo-randomly to avoid
authorPhil Blundell <pb@reciva.com>
Tue, 13 Jan 2009 11:51:04 +0000 (11:51 +0000)
committerPhil Blundell <pb@reciva.com>
Tue, 13 Jan 2009 11:51:04 +0000 (11:51 +0000)
  packet storms when several queries were started at the same time.

CHANGES
ares_process.c

diff --git a/CHANGES b/CHANGES
index 1c6b607..5bb02f7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
   Changelog for the c-ares project
 
-* January 11 2008 (Daniel Stenberg)
+* January 13 2009 (Phil Blundell)
+- ares__send_query() now varies the retry timeout pseudo-randomly to avoid
+  packet storms when several queries were started at the same time.
+
+* January 11 2009 (Daniel Stenberg)
 - Phil Blundell added the internal function ares__expand_name_for_response()
   that is now used by the ares_parse_*_reply() functions instead of the
   ares_expand_name() simply to easier return ARES_EBADRESP for the cases where
index 8c25b11..3aa75cd 100644 (file)
@@ -715,6 +715,7 @@ void ares__send_query(ares_channel channel, struct query *query,
 {
   struct send_request *sendreq;
   struct server_state *server;
+  int timeplus;
 
   server = &channel->servers[query->server];
   if (query->using_tcp)
@@ -778,9 +779,11 @@ void ares__send_query(ares_channel channel, struct query *query,
           return;
         }
     }
+    timeplus = channel->timeout << (query->try / channel->nservers);
+    timeplus = (timeplus * (9 + (rand () & 7))) / 16;
     query->timeout = *now;
     ares__timeadd(&query->timeout,
-                  channel->timeout << (query->try / channel->nservers));
+                  timeplus);
     /* Keep track of queries bucketed by timeout, so we can process
      * timeout events quickly.
      */