On Sat, Jun 20, 2015 at 07:18:34PM +0000, Viktor Dukhovni wrote:

> If there is to be a global rate delay, the transport process limit
> might as well be equal to 1.  At which point to implement a rate
> delay, it suffices for each delivery to take a minimum amount of
> time, so an option along the lines of:
> 
>     smtp_minimum_delay = 0s
> 
> would do the trick, by having the smtp_delivery_agent sleep if
> necessary to ensure that deliveries take at least that amount of
> time.
> 
> This would require no changes to the queue manager, which is a
> rather complex program that is best left as-is.
> 
> -- 
>       Viktor.

Thanks for the feedback!  Slowing down the SMTP delivery agent sure was easy...
there are a few things to clean up, but the patch below seems to be giving the
behavior I need.

-Adam

==========================
WIP minimum delay implemented in smtp delivery agent

FIXME:
* Document config parameter.
* Consider renaming to "smtp_rate_delay".
* Do LMTP as well.
* Test and assert process concurrency == 1 when using a rate delay.
* Conflicts with connection timeout < rate delay.

diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h
index 823fc0c..d3ac1c0 100644
--- a/postfix/src/global/mail_params.h
+++ b/postfix/src/global/mail_params.h
@@ -1025,6 +1025,10 @@ extern char *var_smtp_cache_dest;
 #endif
 extern bool var_smtp_cache_demand;
 
+#define VAR_SMTP_MINIMUM_DELAY "smtp_minimum_delay"
+#define DEF_SMTP_MINIMUM_DELAY "0s"
+extern int var_smtp_minimum_delay;
+
 #define VAR_SMTP_CONN_TMOUT    "smtp_connect_timeout"
 #define DEF_SMTP_CONN_TMOUT    "30s"
 extern int var_smtp_conn_tmout;
@@ -1813,6 +1817,10 @@ extern bool var_lmtp_cache_conn;
 #define DEF_LMTP_SKIP_QUIT_RESP        0
 extern bool var_lmtp_skip_quit_resp;
 
+#define VAR_LMTP_MINIMUM_DELAY "smtp_minimum_delay"
+#define DEF_LMTP_MINIMUM_DELAY "0s"
+extern int var_lmtp_minimum_delay;
+
 #define VAR_LMTP_CONN_TMOUT    "lmtp_connect_timeout"
 #define DEF_LMTP_CONN_TMOUT    "0s"
 extern int var_lmtp_conn_tmout;
diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c
index e1a8d2c..c1a27b9 100644
--- a/postfix/src/smtp/smtp.c
+++ b/postfix/src/smtp/smtp.c
@@ -801,6 +801,7 @@
   * Tunable parameters. These have compiled-in defaults that can be overruled
   * by settings in the global Postfix configuration file.
   */
+int     var_smtp_minimum_delay;
 int     var_smtp_conn_tmout;
 int     var_smtp_helo_tmout;
 int     var_smtp_xfwd_tmout;
@@ -1022,6 +1023,11 @@ static void smtp_service(VSTREAM *client_stream, char 
*service, char **argv)
        status = deliver_message(service, request);
        deliver_request_done(client_stream, request, status);
     }
+
+    if (var_smtp_minimum_delay > 0) {
+       msg_warn("Waiting %d seconds after smtp delivery", 
var_smtp_minimum_delay);
+       sleep(var_smtp_minimum_delay);
+    }
 }
 
 /* post_init - post-jail initialization */
diff --git a/postfix/src/smtp/smtp_params.c b/postfix/src/smtp/smtp_params.c
index 2346441..6c4873a 100644
--- a/postfix/src/smtp/smtp_params.c
+++ b/postfix/src/smtp/smtp_params.c
@@ -64,6 +64,7 @@
        0,
     };
     static const CONFIG_TIME_TABLE smtp_time_table[] = {
+       VAR_SMTP_MINIMUM_DELAY, DEF_SMTP_MINIMUM_DELAY, 
&var_smtp_minimum_delay, 0, 0,
        VAR_SMTP_CONN_TMOUT, DEF_SMTP_CONN_TMOUT, &var_smtp_conn_tmout, 0, 0,
        VAR_SMTP_HELO_TMOUT, DEF_SMTP_HELO_TMOUT, &var_smtp_helo_tmout, 1, 0,
        VAR_SMTP_XFWD_TMOUT, DEF_SMTP_XFWD_TMOUT, &var_smtp_xfwd_tmout, 1, 0,

Reply via email to