Files
kumomta/docs/changelog
Wez Furlong 850b64d48c fix: ready queue gets stuck when TSA suspends before MAIL FROM
This sequence of events:

1. Messages are flowing
2. The remote site starts to return a 421 for mail at connection
   time, prior to MAIL FROM, on new connections
3. The local site employs a TSA rule that suspends the corresponding
   ready queue

Could result in the contents of that ready_queue getting stuck.

Here's a representation of the logs:

```
Apr 24 19:03:44 maintain SITENAME: computed ideal connection count as 3
Apr 24 19:03:44 Error in Dispatcher::run for SITENAME: connect to ResolvedAddress { name: "smtp-in.orange.fr.", addr: 80.12.26.32 } port 25 and read initial banner: Command rejected Response { code: 421, enhanced_code: None, content: "XXXXX smtp.orange.fr XXXXX Service refuse. Veuillez essayer plus tard. Service refused, please try later. OFR_999 [999]", command: None } (consecutive_connection_failures=1)
Apr 24 19:03:45 maintain SITENAME: there are now 3 connections, suspended(via config)=false, suspended(admin)=false, queue_size=691
Apr 24 19:03:45 maintain SITENAME: computed ideal connection count as 3
Apr 24 19:03:45 maintain SITENAME: there are now 3 connections, suspended(via config)=false, suspended(admin)=true, queue_size=746
... the above repeats every minute for a while ...
Apr 24 19:03:45 maintain SITENAME: computed ideal connection count as 0
Apr 24 19:13:45 maintain SITENAME: there are now 3 connections, suspended(via config)=false, suspended(admin)=true, queue_size=746
Apr 24 19:13:45 maintain SITENAME: computed ideal connection count as 0
Apr 24 19:13:45 reaping site SITENAME
Apr 24 19:23:44 maintain SITENAME: there are now 0 connections, suspended(via config)=false, suspended(admin)=false, queue_size=1
```

There are two problems:

1. The main mechanism that acts to sweep the read queue into the
   scheduled queue is only triggered once we get past the initial
   connection phase, causing messages to be retained in the
   ready queue instead of moving back into the scheduled queue.
2. The is-reapable logic doesn't consider the number of messages
   that may be in the ready queue. It was written before we had
   a suspension concept and only considers that an ideal connection
   count of 0 implies that there are no messages.
   The result is, in combination with 1, is that we can reap the ready
   queue while it contains messages and forget about them until
   the server is restarted.

This commit resolves both of these issues:

1. The maintain routine will now act to sweep messages into the
   corresponding scheduled queue if an admin suspension is active.
   In addition, this same sweep is considered when we reap the
   ready queue, just in case some other logic bug manifests in
   the future with the same consequences.
2. The reap logic now also requires that the ready queue be empty.
2024-04-25 07:23:39 -07:00
..
2023-05-12 12:44:40 -04:00