]> git.ipfire.org Git - people/ms/dma.git/commitdiff
randomize delivery backoff times
authorSimon Schubert <2@0x2c.org>
Mon, 28 Jun 2010 21:06:19 +0000 (23:06 +0200)
committerSimon Schubert <2@0x2c.org>
Mon, 28 Jun 2010 22:51:02 +0000 (00:51 +0200)
Submitted-by: Peter Pentchev (earlier version)
Bug:  #599542

dma.c

diff --git a/dma.c b/dma.c
index e6192a15095327d449dd9d4b0a5eac70f6cfceba..4685e0968752536ab495756e21636803fec02ba5 100644 (file)
--- a/dma.c
+++ b/dma.c
@@ -268,11 +268,16 @@ static void
 deliver(struct qitem *it)
 {
        int error;
-       unsigned int backoff = MIN_RETRY;
+       unsigned int backoff;
        const char *errmsg = "unknown bounce reason";
        struct timeval now;
        struct stat st;
 
+       if (it->remote)
+               backoff = MIN_RETRY;
+       else
+               backoff = 1;    /* one second for local deliveries */
+
 retry:
        syslog(LOG_INFO, "trying delivery");
 
@@ -299,10 +304,12 @@ retry:
                                 MAX_TIMEOUT);
                        goto bounce;
                }
-               if (sleep(backoff) == 0)
-                       backoff *= 2;
-               if (backoff > MAX_RETRY)
-                       backoff = MAX_RETRY;
+               if (sleep(backoff) == 0) {
+                       /* pick the next backoff between [1.5, 2.5) times backoff */
+                       backoff = backoff + backoff / 2 + random() % backoff;
+                       if (backoff > MAX_RETRY)
+                               backoff = MAX_RETRY;
+               }
                goto retry;
 
        case -1: