From: Simon Schubert <2@0x2c.org> Date: Mon, 28 Jun 2010 21:06:19 +0000 (+0200) Subject: randomize delivery backoff times X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0de88752bf18606a67dac982a82c726ade31bfb3;p=people%2Fms%2Fdma.git randomize delivery backoff times Submitted-by: Peter Pentchev (earlier version) Bug: #599542 --- diff --git a/dma.c b/dma.c index e6192a1..4685e09 100644 --- 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: