X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/059ec3d9952740285fb1ebf47961b8aca2eb1b4a..b2f5a03200c914f601bc9d28c6e069316a3b20eb:/src/src/retry.c diff --git a/src/src/retry.c b/src/src/retry.c index 4566da2e4..5126e5344 100644 --- a/src/src/retry.c +++ b/src/src/retry.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/retry.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */ +/* $Cambridge: exim/src/src/retry.c,v 1.4 2005/09/19 11:56:11 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2004 */ +/* Copyright (c) University of Cambridge 1995 - 2005 */ /* See the file NOTICE for conditions of use and distribution. */ /* Functions concerned with retrying unsuccessful deliveries. */ @@ -739,15 +739,24 @@ for (i = 0; i < 3; i++) if (rule == NULL) next_try = now; else { if (rule->rule == 'F') next_try = now + rule->p1; - else /* assume rule = 'G' */ + else /* rule = 'G' or 'H' */ { int last_predicted_gap = retry_record->next_try - retry_record->last_try; int last_actual_gap = now - retry_record->last_try; int lastgap = (last_predicted_gap < last_actual_gap)? last_predicted_gap : last_actual_gap; - next_try = now + ((lastgap < rule->p1)? rule->p1 : - (lastgap * rule->p2)/1000); + int next_gap = (lastgap * rule->p2)/1000; + if (rule->rule == 'G') + { + next_try = now + ((lastgap < rule->p1)? rule->p1 : next_gap); + } + else /* The 'H' rule */ + { + next_try = now + rule->p1; + if (next_gap > rule->p1) + next_try += random_number(next_gap - rule->p1); + } } } @@ -842,6 +851,9 @@ for (i = 0; i < 3; i++) setflag(addr, af_retry_timedout); addr->message = (addr->message == NULL)? US"retry timeout exceeded" : string_sprintf("%s: retry timeout exceeded", addr->message); + addr->user_message = (addr->user_message == NULL)? + US"retry timeout exceeded" : + string_sprintf("%s: retry timeout exceeded", addr->user_message); log_write(0, LOG_MAIN, "** %s%s%s%s: retry timeout exceeded", addr->address, (addr->parent == NULL)? US"" : US" <",