1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) University of Cambridge 1995 - 2009 */
6 /* See the file NOTICE for conditions of use and distribution. */
8 /* Functions concerned with retrying unsuccessful deliveries. */
15 /*************************************************
16 * Check the ultimate address timeout *
17 *************************************************/
19 /* This function tests whether a message has been on the queue longer than
20 the maximum retry time for a particular host.
23 host_key the key to look up a host retry rule
24 domain the domain to look up a domain retry rule
25 basic_errno a specific error number, or zero if none
26 more_errno additional data for the error
29 Returns: TRUE if the ultimate timeout has been reached
33 ultimate_address_timeout(uschar *host_key, uschar *domain, int basic_errno,
34 int more_errno, time_t now)
36 BOOL address_timeout = TRUE; /* no rule => timed out */
39 retry_find_config(host_key+2, domain, basic_errno, more_errno);
41 if (retry != NULL && retry->rules != NULL)
43 retry_rule *last_rule;
44 for (last_rule = retry->rules;
45 last_rule->next != NULL;
46 last_rule = last_rule->next);
47 DEBUG(D_transport|D_retry)
48 debug_printf(" received_time=%d diff=%d timeout=%d\n",
49 received_time, (int)(now - received_time), last_rule->timeout);
50 address_timeout = (now - received_time > last_rule->timeout);
54 DEBUG(D_transport|D_retry)
55 debug_printf("no retry rule found: assume timed out\n");
58 return address_timeout;
63 /*************************************************
64 * Set status of a host+address item *
65 *************************************************/
67 /* This function is passed a host_item which contains a host name and an
68 IP address string. Its job is to set the status of the address if it is not
69 already set (indicated by hstatus_unknown). The possible values are:
71 hstatus_usable the address is not listed in the unusable tree, and does
72 not have a retry record, OR the time is past the next
73 try time, OR the message has been on the queue for more
74 than the maximum retry time for a failing host
76 hstatus_unusable the address is listed in the unusable tree, or does have
77 a retry record, and the time is not yet at the next retry
80 hstatus_unusable_expired as above, but also the retry time has expired
83 The reason a delivery is permitted when a message has been around for a very
84 long time is to allow the ultimate address timeout to operate after a delivery
85 failure. Otherwise some messages may stick around without being tried for too
88 If a host retry record is retrieved from the hints database, the time of last
89 trying is filled into the last_try field of the host block. If a host is
90 generally usable, a check is made to see if there is a retry delay on this
91 specific message at this host.
93 If a non-standard port is being used, it is added to the retry key.
96 domain the address domain
97 host pointer to a host item
98 portstring "" for standard port, ":xxxx" for a non-standard port
99 include_ip_address TRUE to include the address in the key - this is
100 usual, but sometimes is not wanted
101 retry_host_key where to put a pointer to the key for the host-specific
102 retry record, if one is read and the host is usable
103 retry_message_key where to put a pointer to the key for the message+host
104 retry record, if one is read and the host is usable
106 Returns: TRUE if the host has expired but is usable because
107 its retry time has come
111 retry_check_address(uschar *domain, host_item *host, uschar *portstring,
112 BOOL include_ip_address, uschar **retry_host_key, uschar **retry_message_key)
115 time_t now = time(NULL);
116 uschar *host_key, *message_key;
120 dbdata_retry *host_retry_record, *message_retry_record;
122 *retry_host_key = *retry_message_key = NULL;
124 DEBUG(D_transport|D_retry) debug_printf("checking status of %s\n", host->name);
126 /* Do nothing if status already set; otherwise initialize status as usable. */
128 if (host->status != hstatus_unknown) return FALSE;
129 host->status = hstatus_usable;
131 /* Generate the host key for the unusable tree and the retry database. Ensure
132 host names are lower cased (that's what %S does). */
134 host_key = include_ip_address?
135 string_sprintf("T:%S:%s%s", host->name, host->address, portstring) :
136 string_sprintf("T:%S%s", host->name, portstring);
138 /* Generate the message-specific key */
140 message_key = string_sprintf("%s:%s", host_key, message_id);
142 /* Search the tree of unusable IP addresses. This is filled in when deliveries
143 fail, because the retry database itself is not updated until the end of all
144 deliveries (so as to do it all in one go). The tree records addresses that have
145 become unusable during this delivery process (i.e. those that will get put into
146 the retry database when it is updated). */
148 node = tree_search(tree_unusable, host_key);
151 DEBUG(D_transport|D_retry) debug_printf("found in tree of unusables\n");
152 host->status = (node->data.val > 255)?
153 hstatus_unusable_expired : hstatus_unusable;
154 host->why = node->data.val & 255;
158 /* Open the retry database, giving up if there isn't one. Otherwise, search for
159 the retry records, and then close the database again. */
161 if ((dbm_file = dbfn_open(US"retry", O_RDONLY, &dbblock, FALSE)) == NULL)
163 DEBUG(D_deliver|D_retry|D_hints_lookup)
164 debug_printf("no retry data available\n");
167 host_retry_record = dbfn_read(dbm_file, host_key);
168 message_retry_record = dbfn_read(dbm_file, message_key);
169 dbfn_close(dbm_file);
171 /* Ignore the data if it is too old - too long since it was written */
173 if (host_retry_record == NULL)
175 DEBUG(D_transport|D_retry) debug_printf("no host retry record\n");
177 else if (now - host_retry_record->time_stamp > retry_data_expire)
179 host_retry_record = NULL;
180 DEBUG(D_transport|D_retry) debug_printf("host retry record too old\n");
183 if (message_retry_record == NULL)
185 DEBUG(D_transport|D_retry) debug_printf("no message retry record\n");
187 else if (now - message_retry_record->time_stamp > retry_data_expire)
189 message_retry_record = NULL;
190 DEBUG(D_transport|D_retry) debug_printf("message retry record too old\n");
193 /* If there's a host-specific retry record, check for reaching the retry
194 time (or forcing). If not, and the host is not expired, check for the message
195 having been around for longer than the maximum retry time for this host or
196 address. Allow the delivery if it has. Otherwise set the appropriate unusable
197 flag and return FALSE. Otherwise arrange to return TRUE if this is an expired
200 if (host_retry_record != NULL)
202 *retry_host_key = host_key;
204 /* We have not reached the next try time. Check for the ultimate address
205 timeout if the host has not expired. */
207 if (now < host_retry_record->next_try && !deliver_force)
209 DEBUG(D_transport|D_retry)
211 debug_printf("host retry time not reached: checking ultimate address "
213 debug_printf(" now=%d first_failed=%d next_try=%d expired=%d\n",
214 (int)now, (int)host_retry_record->first_failed,
215 (int)host_retry_record->next_try,
216 host_retry_record->expired);
219 if (!host_retry_record->expired &&
220 ultimate_address_timeout(host_key, domain,
221 host_retry_record->basic_errno, host_retry_record->more_errno, now))
223 DEBUG(D_transport|D_retry)
224 debug_printf("on queue longer than maximum retry for "
225 "address - allowing delivery\n");
229 /* We have not hit the ultimate address timeout; host is unusable. */
231 host->status = (host_retry_record->expired)?
232 hstatus_unusable_expired : hstatus_unusable;
233 host->why = hwhy_retry;
234 host->last_try = host_retry_record->last_try;
238 /* Host is usable; set return TRUE if expired. */
240 yield = host_retry_record->expired;
243 /* It's OK to try the host. If there's a message-specific retry record, check
244 for reaching its retry time (or forcing). If not, mark the host unusable,
245 unless the ultimate address timeout has been reached. */
247 if (message_retry_record != NULL)
249 *retry_message_key = message_key;
250 if (now < message_retry_record->next_try && !deliver_force)
252 DEBUG(D_transport|D_retry)
254 debug_printf("host+message retry time not reached: checking ultimate "
255 "address timeout\n");
256 debug_printf(" now=%d first_failed=%d next_try=%d expired=%d\n",
257 (int)now, (int)message_retry_record->first_failed,
258 (int)message_retry_record->next_try, message_retry_record->expired);
260 if (!ultimate_address_timeout(host_key, domain, 0, 0, now))
262 host->status = hstatus_unusable;
263 host->why = hwhy_retry;
267 DEBUG(D_transport|D_retry)
268 debug_printf("on queue longer than maximum retry for "
269 "address - allowing delivery\n");
281 /*************************************************
282 * Add a retry item to an address *
283 *************************************************/
285 /* Retry items are chained onto an address when it is deferred either by router
286 or by a transport, or if it succeeds or fails and there was a previous retry
287 item that now needs to be deleted. Sometimes there can be both kinds of item:
288 for example, if routing was deferred but then succeeded, and delivery then
289 deferred. In that case there is a delete item for the routing retry, and an
290 updating item for the delivery.
292 (But note that that is only visible at the outer level, because in remote
293 delivery subprocesses, the address starts "clean", with no retry items carried
296 These items are used at the end of a delivery attempt to update the retry
297 database. The keys start R: for routing delays and T: for transport delays.
300 addr the address block onto which to hang the item
302 flags delete, host, and message flags, copied into the block
308 retry_add_item(address_item *addr, uschar *key, int flags)
310 retry_item *rti = store_get(sizeof(retry_item));
311 rti->next = addr->retries;
314 rti->basic_errno = addr->basic_errno;
315 rti->more_errno = addr->more_errno;
316 rti->message = addr->message;
319 DEBUG(D_transport|D_retry)
321 int letter = rti->more_errno & 255;
322 debug_printf("added retry item for %s: errno=%d more_errno=", rti->key,
324 if (letter == 'A' || letter == 'M')
325 debug_printf("%d,%c", (rti->more_errno >> 8) & 255, letter);
327 debug_printf("%d", rti->more_errno);
328 debug_printf(" flags=%d\n", flags);
334 /*************************************************
335 * Find retry configuration data *
336 *************************************************/
338 /* Search the in-store retry information for the first retry item that applies
339 to a given destination. If the key contains an @ we are probably handling a
340 local delivery and have a complete address to search for; this happens when
341 retry_use_local_part is set on a router. Otherwise, the key is likely to be a
342 host name for a remote delivery, or a domain name for a local delivery. We
343 prepend *@ on the front of it so that it will match a retry item whose address
344 item pattern is independent of the local part. The alternate key, if set, is
345 always just a domain, so we treat it likewise.
348 key key for which retry info is wanted
349 alternate alternative key, always just a domain
350 basic_errno specific error predicate on the retry rule, or zero
351 more_errno additional data for errno predicate
353 Returns: pointer to retry rule, or NULL
357 retry_find_config(uschar *key, uschar *alternate, int basic_errno,
361 uschar *use_key, *use_alternate;
362 uschar *colon = Ustrchr(key, ':');
365 /* If there's a colon in the key, there are two possibilities:
367 (1) This is a key for a host, ip address, and possibly port, in the format
371 In this case, we temporarily replace the colon with a zero, to terminate
372 the string after the host name.
374 (2) This is a key for a pipe, file, or autoreply delivery, in the format
376 pipe-or-file-or-auto:x@y
378 where x@y is the original address that provoked the delivery. The pipe or
379 file or auto will start with | or / or >, whereas a host name will start
380 with a letter or a digit. In this case we want to use the original address
381 to search for a retry rule. */
388 key = Ustrrchr(key, ':') + 1; /* Take from the last colon */
391 if (replace == 0) colon = key + Ustrlen(key);
394 /* Sort out the keys */
396 use_key = (Ustrchr(key, '@') != NULL)? key : string_sprintf("*@%s", key);
397 use_alternate = (alternate == NULL)? NULL : string_sprintf("*@%s", alternate);
399 /* Scan the configured retry items. */
401 for (yield = retries; yield != NULL; yield = yield->next)
403 uschar *plist = yield->pattern;
404 uschar *slist = yield->senders;
406 /* If a specific error is set for this item, check that we are handling that
407 specific error, and if so, check any additional error information if
410 if (yield->basic_errno != 0)
412 /* Special code is required for quota errors, as these can either be system
413 quota errors, or Exim's own quota imposition, which has a different error
414 number. Full partitions are also treated in the same way as quota errors.
417 if (yield->basic_errno == ERRNO_EXIMQUOTA)
419 if ((basic_errno != ERRNO_EXIMQUOTA && basic_errno != errno_quota &&
420 basic_errno != ENOSPC) ||
421 (yield->more_errno != 0 && yield->more_errno > more_errno))
425 /* The TLSREQUIRED error also covers TLSFAILURE. These are subtly different
426 errors, but not worth separating at this level. */
428 else if (yield->basic_errno == ERRNO_TLSREQUIRED)
430 if (basic_errno != ERRNO_TLSREQUIRED && basic_errno != ERRNO_TLSFAILURE)
434 /* Handle 4xx responses to MAIL, RCPT, or DATA. The code that was received
435 is in the 2nd least significant byte of more_errno (with 400 subtracted).
436 The required value is coded in the 2nd least significant byte of the
437 yield->more_errno field as follows:
440 >= 100 => the decade must match the value less 100
441 < 100 => the exact value must match
444 else if (yield->basic_errno == ERRNO_MAIL4XX ||
445 yield->basic_errno == ERRNO_RCPT4XX ||
446 yield->basic_errno == ERRNO_DATA4XX)
449 if (basic_errno != yield->basic_errno) continue;
450 wanted = (yield->more_errno >> 8) & 255;
453 int evalue = (more_errno >> 8) & 255;
456 if ((evalue/10)*10 != wanted - 100) continue;
458 else if (evalue != wanted) continue;
462 /* There are some special cases for timeouts */
464 else if (yield->basic_errno == ETIMEDOUT)
466 if (basic_errno != ETIMEDOUT) continue;
468 /* Just RTEF_CTOUT in the rule => don't care about 'A'/'M' addresses */
469 if (yield->more_errno == RTEF_CTOUT)
471 if ((more_errno & RTEF_CTOUT) == 0) continue;
474 else if (yield->more_errno != 0)
476 int cf_errno = more_errno;
477 if ((yield->more_errno & RTEF_CTOUT) == 0) cf_errno &= ~RTEF_CTOUT;
478 if (yield->more_errno != cf_errno) continue;
482 /* Default checks for exact match */
486 if (yield->basic_errno != basic_errno ||
487 (yield->more_errno != 0 && yield->more_errno != more_errno))
492 /* If the "senders" condition is set, check it. Note that sender_address may
493 be null during -brt checking, in which case we do not use this rule. */
495 if (slist != NULL && (sender_address == NULL ||
496 match_address_list(sender_address, TRUE, TRUE, &slist, NULL, -1, 0,
500 /* Check for a match between the address list item at the start of this retry
501 rule and either the main or alternate keys. */
503 if (match_address_list(use_key, TRUE, TRUE, &plist, NULL, -1, UCHAR_MAX+1,
505 (use_alternate != NULL &&
506 match_address_list(use_alternate, TRUE, TRUE, &plist, NULL, -1,
507 UCHAR_MAX+1, NULL) == OK))
518 /*************************************************
519 * Update retry database *
520 *************************************************/
522 /* Update the retry data for any directing/routing/transporting that was
523 deferred, or delete it for those that succeeded after a previous defer. This is
524 done all in one go to minimize opening/closing/locking of the database file.
526 Note that, because SMTP delivery involves a list of destinations to try, there
527 may be defer-type retry information for some of them even when the message was
528 successfully delivered. Likewise if it eventually failed.
530 This function may move addresses from the defer to the failed queue if the
531 ultimate retry time has expired.
534 addr_defer queue of deferred addresses
535 addr_failed queue of failed addresses
536 addr_succeed queue of successful addresses
542 retry_update(address_item **addr_defer, address_item **addr_failed,
543 address_item **addr_succeed)
546 open_db *dbm_file = NULL;
547 time_t now = time(NULL);
550 DEBUG(D_retry) debug_printf("Processing retry items\n");
552 /* Three-times loop to handle succeeded, failed, and deferred addresses.
553 Deferred addresses must be handled after failed ones, because some may be moved
554 to the failed chain if they have timed out. */
556 for (i = 0; i < 3; i++)
558 address_item *endaddr, *addr;
559 address_item *last_first = NULL;
560 address_item **paddr = (i==0)? addr_succeed :
561 (i==1)? addr_failed : addr_defer;
562 address_item **saved_paddr = NULL;
564 DEBUG(D_retry) debug_printf("%s addresses:\n", (i == 0)? "Succeeded" :
565 (i == 1)? "Failed" : "Deferred");
567 /* Loop for each address on the chain. For deferred addresses, the whole
568 address times out unless one of its retry addresses has a retry rule that
569 hasn't yet timed out. Deferred addresses should not be requesting deletion
570 of retry items, but just in case they do by accident, treat that case
573 As well as handling the addresses themselves, we must also process any
574 retry items for any parent addresses - these are typically "delete" items,
575 because the parent must have succeeded in order to generate the child. */
577 while ((endaddr = *paddr) != NULL)
579 BOOL timed_out = FALSE;
582 for (addr = endaddr; addr != NULL; addr = addr->parent)
584 int update_count = 0;
585 int timedout_count = 0;
587 DEBUG(D_retry) debug_printf("%s%s\n", addr->address, (addr->retries == NULL)?
588 ": no retry items" : "");
590 /* Loop for each retry item. */
592 for (rti = addr->retries; rti != NULL; rti = rti->next)
595 int message_length, message_space, failing_interval, next_try;
596 retry_rule *rule, *final_rule;
598 dbdata_retry *retry_record;
600 /* Open the retry database if it is not already open; failure to open
601 the file is logged, but otherwise ignored - deferred addresses will
602 get retried at the next opportunity. Not opening earlier than this saves
603 opening if no addresses have retry items - common when none have yet
604 reached their retry next try time. */
606 if (dbm_file == NULL)
607 dbm_file = dbfn_open(US"retry", O_RDWR, &dbblock, TRUE);
609 if (dbm_file == NULL)
611 DEBUG(D_deliver|D_retry|D_hints_lookup)
612 debug_printf("retry database not available for updating\n");
616 /* If there are no deferred addresses, that is, if this message is
617 completing, and the retry item is for a message-specific SMTP error,
618 force it to be deleted, because there's no point in keeping data for
619 no-longer-existing messages. This situation can occur when a domain has
620 two hosts and a message-specific error occurs for the first of them,
621 but the address gets delivered to the second one. This optimization
622 doesn't succeed in cleaning out all the dead entries, but it helps. */
624 if (*addr_defer == NULL && (rti->flags & rf_message) != 0)
625 rti->flags |= rf_delete;
627 /* Handle the case of a request to delete the retry info for this
630 if ((rti->flags & rf_delete) != 0)
632 (void)dbfn_delete(dbm_file, rti->key);
634 debug_printf("deleted retry information for %s\n", rti->key);
638 /* Count the number of non-delete retry items. This is so that we
639 can compare it to the count of timed_out ones, to check whether
640 all are timed out. */
644 /* Get the retry information for this destination and error code, if
645 any. If this item is for a remote host with ip address, then pass
646 the domain name as an alternative to search for. If no retry
647 information is found, we can't generate a retry time, so there is
648 no point updating the database. This retry item is timed out. */
650 if ((retry = retry_find_config(rti->key + 2,
651 ((rti->flags & rf_host) != 0)? addr->domain : NULL,
652 rti->basic_errno, rti->more_errno)) == NULL)
654 DEBUG(D_retry) debug_printf("No configured retry item for %s%s%s\n",
656 ((rti->flags & rf_host) != 0)? US" or " : US"",
657 ((rti->flags & rf_host) != 0)? addr->domain : US"");
658 if (addr == endaddr) timedout_count++;
664 if ((rti->flags & rf_host) != 0)
665 debug_printf("retry for %s (%s) = %s %d %d\n", rti->key,
666 addr->domain, retry->pattern, retry->basic_errno,
669 debug_printf("retry for %s = %s %d %d\n", rti->key, retry->pattern,
670 retry->basic_errno, retry->more_errno);
673 /* Set up the message for the database retry record. Because DBM
674 records have a maximum data length, we enforce a limit. There isn't
675 much point in keeping a huge message here, anyway. */
677 message = (rti->basic_errno > 0)? US strerror(rti->basic_errno) :
678 (rti->message == NULL)?
679 US"unknown error" : string_printing(rti->message);
680 message_length = Ustrlen(message);
681 if (message_length > 150) message_length = 150;
683 /* Read a retry record from the database or construct a new one.
684 Ignore an old one if it is too old since it was last updated. */
686 retry_record = dbfn_read(dbm_file, rti->key);
687 if (retry_record != NULL &&
688 now - retry_record->time_stamp > retry_data_expire)
691 if (retry_record == NULL)
693 retry_record = store_get(sizeof(dbdata_retry) + message_length);
694 message_space = message_length;
695 retry_record->first_failed = now;
696 retry_record->last_try = now;
697 retry_record->next_try = now;
698 retry_record->expired = FALSE;
699 retry_record->text[0] = 0; /* just in case */
701 else message_space = Ustrlen(retry_record->text);
703 /* Compute how long this destination has been failing */
705 failing_interval = now - retry_record->first_failed;
706 DEBUG(D_retry) debug_printf("failing_interval=%d message_age=%d\n",
707 failing_interval, message_age);
709 /* For a non-host error, if the message has been on the queue longer
710 than the recorded time of failure, use the message's age instead. This
711 can happen when some messages can be delivered and others cannot; a
712 successful delivery will reset the first_failed time, and this can lead
713 to a failing message being retried too often. */
715 if ((rti->flags & rf_host) == 0 && message_age > failing_interval)
716 failing_interval = message_age;
718 /* Search for the current retry rule. The cutoff time of the
719 last rule is handled differently to the others. The rule continues
720 to operate for ever (the global maximum interval will eventually
721 limit the gaps) but its cutoff time determines when an individual
722 destination times out. If there are no retry rules, the destination
723 always times out, but we can't compute a retry time. */
726 for (rule = retry->rules; rule != NULL; rule = rule->next)
728 if (failing_interval <= rule->timeout) break;
732 /* If there's an un-timed out rule, the destination has not
733 yet timed out, so the address as a whole has not timed out (but we are
734 interested in this only for the end address). Make sure the expired
735 flag is false (can be forced via fixdb from outside, but ensure it is
736 consistent with the rules whenever we go through here). */
740 retry_record->expired = FALSE;
743 /* Otherwise, set the retry timeout expired, and set the final rule
744 as the one from which to compute the next retry time. Subsequent
745 messages will fail immediately until the retry time is reached (unless
746 there are other, still active, retries). */
751 retry_record->expired = TRUE;
752 if (addr == endaddr) timedout_count++;
755 /* There is a special case to consider when some messages get through
756 to a destination and others don't. This can happen locally when a
757 large message pushes a user over quota, and it can happen remotely
758 when a machine is on a dodgy Internet connection. The messages that
759 get through wipe the retry information, causing those that don't to
760 stay on the queue longer than the final retry time. In order to
761 avoid this, we check, using the time of arrival of the message, to
762 see if it has been on the queue for more than the final cutoff time,
763 and if so, cause this retry item to time out, and the retry time to
764 be set to "now" so that any subsequent messages in the same condition
765 also get tried. We search for the last rule onwards from the one that
766 is in use. If there are no retry rules for the item, rule will be null
767 and timedout_count will already have been updated.
769 This implements "timeout this rule if EITHER the host (or routing or
770 directing) has been failing for more than the maximum time, OR if the
771 message has been on the queue for more than the maximum time."
773 February 2006: It is possible that this code is no longer needed
774 following the change to the retry calculation to use the message age if
775 it is larger than the time since first failure. It may be that the
776 expired flag is always set when the other conditions are met. However,
777 this is a small bit of code, and it does no harm to leave it in place,
780 if (received_time <= retry_record->first_failed &&
781 addr == endaddr && !retry_record->expired && rule != NULL)
783 retry_rule *last_rule;
784 for (last_rule = rule;
785 last_rule->next != NULL;
786 last_rule = last_rule->next);
787 if (now - received_time > last_rule->timeout)
789 DEBUG(D_retry) debug_printf("on queue longer than maximum retry\n");
795 /* Compute the next try time from the rule, subject to the global
796 maximum, and update the retry database. If rule == NULL it means
797 there were no rules at all (and the timeout will be set expired),
798 or we have a message that is older than the final timeout. In this
799 case set the next retry time to now, so that one delivery attempt
800 happens for subsequent messages. */
802 if (rule == NULL) next_try = now; else
804 if (rule->rule == 'F') next_try = now + rule->p1;
805 else /* rule = 'G' or 'H' */
807 int last_predicted_gap =
808 retry_record->next_try - retry_record->last_try;
809 int last_actual_gap = now - retry_record->last_try;
810 int lastgap = (last_predicted_gap < last_actual_gap)?
811 last_predicted_gap : last_actual_gap;
812 int next_gap = (lastgap * rule->p2)/1000;
813 if (rule->rule == 'G')
815 next_try = now + ((lastgap < rule->p1)? rule->p1 : next_gap);
817 else /* The 'H' rule */
819 next_try = now + rule->p1;
820 if (next_gap > rule->p1)
821 next_try += random_number(next_gap - rule->p1)/2 +
822 (next_gap - rule->p1)/2;
827 /* Impose a global retry max */
829 if (next_try - now > retry_interval_max)
830 next_try = now + retry_interval_max;
832 /* If the new message length is greater than the previous one, we
833 have to copy the record first. */
835 if (message_length > message_space)
837 dbdata_retry *newr = store_get(sizeof(dbdata_retry) + message_length);
838 memcpy(newr, retry_record, sizeof(dbdata_retry));
842 /* Set up the retry record; message_length may be less than the string
843 length for very long error strings. */
845 retry_record->last_try = now;
846 retry_record->next_try = next_try;
847 retry_record->basic_errno = rti->basic_errno;
848 retry_record->more_errno = rti->more_errno;
849 Ustrncpy(retry_record->text, message, message_length);
850 retry_record->text[message_length] = 0;
854 int letter = retry_record->more_errno & 255;
855 debug_printf("Writing retry data for %s\n", rti->key);
856 debug_printf(" first failed=%d last try=%d next try=%d expired=%d\n",
857 (int)retry_record->first_failed, (int)retry_record->last_try,
858 (int)retry_record->next_try, retry_record->expired);
859 debug_printf(" errno=%d more_errno=", retry_record->basic_errno);
860 if (letter == 'A' || letter == 'M')
861 debug_printf("%d,%c", (retry_record->more_errno >> 8) & 255,
864 debug_printf("%d", retry_record->more_errno);
865 debug_printf(" %s\n", retry_record->text);
868 (void)dbfn_write(dbm_file, rti->key, retry_record,
869 sizeof(dbdata_retry) + message_length);
870 } /* Loop for each retry item */
872 /* If all the non-delete retry items are timed out, the address is
873 timed out, provided that we didn't skip any hosts because their retry
874 time was not reached (or because of hosts_max_try). */
876 if (update_count > 0 && update_count == timedout_count)
878 if (!testflag(endaddr, af_retry_skipped))
880 DEBUG(D_retry) debug_printf("timed out: all retries expired\n");
886 debug_printf("timed out but some hosts were skipped\n");
889 } /* Loop for an address and its parents */
891 /* If this is a deferred address, and retry processing was requested by
892 means of one or more retry items, and they all timed out, move the address
893 to the failed queue, and restart this loop without updating paddr.
895 If there were several addresses batched in the same remote delivery, only
896 the original top one will have host retry items attached to it, but we want
897 to handle all the same. Each will have a pointer back to its "top" address,
898 and they will now precede the item with the retries because addresses are
899 inverted when added to these final queues. We have saved information about
900 them in passing (below) so they can all be cut out at once. */
902 if (i == 2) /* Handling defers */
904 if (endaddr->retries != NULL && timed_out)
906 if (last_first == endaddr) paddr = saved_paddr;
908 *paddr = endaddr->next;
910 endaddr->next = *addr_failed;
913 for (;; addr = addr->next)
915 setflag(addr, af_retry_timedout);
916 addr->message = (addr->message == NULL)? US"retry timeout exceeded" :
917 string_sprintf("%s: retry timeout exceeded", addr->message);
918 addr->user_message = (addr->user_message == NULL)?
919 US"retry timeout exceeded" :
920 string_sprintf("%s: retry timeout exceeded", addr->user_message);
921 log_write(0, LOG_MAIN, "** %s%s%s%s: retry timeout exceeded",
923 (addr->parent == NULL)? US"" : US" <",
924 (addr->parent == NULL)? US"" : addr->parent->address,
925 (addr->parent == NULL)? US"" : US">");
927 if (addr == endaddr) break;
930 continue; /* Restart from changed *paddr */
933 /* This address is to remain on the defer chain. If it has a "first"
934 pointer, save the pointer to it in case we want to fail the set of
935 addresses when we get to the first one. */
937 if (endaddr->first != last_first)
939 last_first = endaddr->first;
944 /* All cases (succeed, fail, defer left on queue) */
946 paddr = &(endaddr->next); /* Advance to next address */
947 } /* Loop for all addresses */
948 } /* Loop for succeed, fail, defer */
950 /* Close and unlock the database */
952 if (dbm_file != NULL) dbfn_close(dbm_file);
954 DEBUG(D_retry) debug_printf("end of retry processing\n");