New $queue_name variable
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 8 May 2016 12:26:13 +0000 (13:26 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Mon, 9 May 2016 13:17:47 +0000 (14:17 +0100)
queue_run_max main option expanded, allowing per-queue values

12 files changed:
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/daemon.c
src/src/expand.c
src/src/globals.c
src/src/globals.h
src/src/readconf.c
test/confs/0001
test/confs/0574
test/log/0574
test/scripts/0000-Basic/0002
test/stdout/0002

index 7b1e1ecb69f10b825cf7ad72d58a8b45e583b3f8..50ce06e08b10eeef8ec3c4d4a3a23113a9723646 100644 (file)
@@ -12208,6 +12208,14 @@ The value set for the &%qualify_domain%& option in the configuration file.
 The value set for the &%qualify_recipient%& option in the configuration file,
 or if not set, the value of &$qualify_domain$&.
 
+.new
+.vitem &$queue_name$&
+.vindex &$queue_name$&
+.cindex "named queues"
+.cindex queues named
+The name of the spool queue in use; empty for the default queue.
+.wen
+
 .vitem &$rcpt_count$&
 .vindex "&$rcpt_count$&"
 When a message is being received by SMTP, this variable contains the number of
@@ -15918,7 +15926,7 @@ large list. In most situations, &%queue_run_in_order%& should not be set.
 
 
 
-.option queue_run_max main integer 5
+.option queue_run_max main integer&!! 5
 .cindex "queue runner" "maximum number of"
 This controls the maximum number of queue runner processes that an Exim daemon
 can run simultaneously. This does not mean that it starts them all at once,
@@ -15933,6 +15941,13 @@ the limit, allowing any number of simultaneous queue runner processes to be
 run. If you do not want queue runs to occur, omit the &%-q%&&'xx'& setting on
 the daemon's command line.
 
+.new
+.cindex queues named
+.condex "named queues"
+To set limits for different named queues use
+an expansion depending on the &$queue_name$& variable.
+.wen
+
 .option queue_smtp_domains main "domain list&!!" unset
 .cindex "queueing incoming messages"
 .cindex "message" "queueing remote deliveries"
index aabeff3383c06427b19bf484222d2846c6aad117..912fe65eee8612b40c4f0883c1495bb161cd644a 100644 (file)
@@ -12,9 +12,10 @@ Version 4.88
  1. The new perl_tainmode option allows to run the embedded perl
     interpreter in taint mode.
 
- 2. Facility for named queues.  A commandline argument can specify
+ 2. Facility for named queues:  A commandline argument can specify
     the queue name for a queue-runner, and an ACL modifier can set
-    the queue to be used for a message.
+    the queue to be used for a message.  A $queue_name variable gives
+    visibility.
 
 
 Version 4.87
index 60ef3377331efa506a48b2b036f3667b1653ffbc..3634ad448237df378740c0d3f838aff3f74b79de 100644 (file)
@@ -866,10 +866,10 @@ while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
   /* If it wasn't an accepting process, see if it was a queue-runner
   process that we are tracking. */
 
-  if (queue_pid_slots != NULL)
+  if (queue_pid_slots)
     {
-    for (i = 0; i < queue_run_max; i++)
-      {
+    int max = atoi(expand_string(queue_run_max));
+    for (i = 0; i < max; i++)
       if (queue_pid_slots[i] == pid)
         {
         queue_pid_slots[i] = 0;
@@ -878,7 +878,6 @@ while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
           queue_run_count, (queue_run_count == 1)? "" : "es");
         break;
         }
-      }
     }
   }
 }
@@ -916,6 +915,7 @@ int *listen_sockets = NULL;
 int listen_socket_count = 0;
 ip_address_item *addresses = NULL;
 time_t last_connection_time = (time_t)0;
+int local_queue_run_max = atoi(expand_string(queue_run_max));
 
 /* If any debugging options are set, turn on the D_pid bit so that all
 debugging lines get the pid added. */
@@ -1572,11 +1572,11 @@ originator_login = ((pw = getpwuid(exim_uid)) != NULL)?
 /* Get somewhere to keep the list of queue-runner pids if we are keeping track
 of them (and also if we are doing queue runs). */
 
-if (queue_interval > 0 && queue_run_max > 0)
+if (queue_interval > 0 && local_queue_run_max > 0)
   {
   int i;
-  queue_pid_slots = store_get(queue_run_max * sizeof(pid_t));
-  for (i = 0; i < queue_run_max; i++) queue_pid_slots[i] = 0;
+  queue_pid_slots = store_get(local_queue_run_max * sizeof(pid_t));
+  for (i = 0; i < local_queue_run_max; i++) queue_pid_slots[i] = 0;
   }
 
 /* Set up the handler for termination of child processes. */
@@ -1791,7 +1791,7 @@ for (;;)
       re-exec is required. */
 
       if (queue_interval > 0 &&
-         (queue_run_max <= 0 || queue_run_count < queue_run_max))
+         (local_queue_run_max <= 0 || queue_run_count < local_queue_run_max))
         {
         if ((pid = fork()) == 0)
           {
@@ -1879,15 +1879,13 @@ for (;;)
         else
           {
           int i;
-          for (i = 0; i < queue_run_max; ++i)
-            {
+          for (i = 0; i < local_queue_run_max; ++i)
             if (queue_pid_slots[i] <= 0)
               {
               queue_pid_slots[i] = pid;
               queue_run_count++;
               break;
               }
-            }
           DEBUG(D_any) debug_printf("%d queue-runner process%s running\n",
             queue_run_count, (queue_run_count == 1)? "" : "es");
           }
index f783682b4af0b1b0dacf3dc72ffd0603f4dca402..249254923ba4f2d9c484e9802c05fa8294e81377 100644 (file)
@@ -625,6 +625,7 @@ static var_entry var_table[] = {
   { "prvscheck_result",    vtype_stringptr,   &prvscheck_result },
   { "qualify_domain",      vtype_stringptr,   &qualify_domain_sender },
   { "qualify_recipient",   vtype_stringptr,   &qualify_domain_recipient },
+  { "queue_name",          vtype_stringptr,   &queue_name },
   { "rcpt_count",          vtype_int,         &rcpt_count },
   { "rcpt_defer_count",    vtype_int,         &rcpt_defer_count },
   { "rcpt_fail_count",     vtype_int,         &rcpt_fail_count },
index 8b2287aca6799d9cf8f82bfa07ea828fe28fc4a9..3ba82e0a79821e2fa363841b4fdd0707f4a0a39f 100644 (file)
@@ -1031,7 +1031,7 @@ BOOL    queue_run_first_delivery = FALSE;
 BOOL    queue_run_force        = FALSE;
 BOOL    queue_run_in_order     = FALSE;
 BOOL    queue_run_local        = FALSE;
-int     queue_run_max          = 5;
+uschar *queue_run_max          = US"5";
 pid_t   queue_run_pid          = (pid_t)0;
 int     queue_run_pipe         = -1;
 BOOL    queue_running          = FALSE;
index bd7518074b5e56206f7eeb45a73c50f95a544374..362c2bfb9a557f6f71c45da6e2d36e44dcc5715e 100644 (file)
@@ -677,7 +677,7 @@ extern uschar *queue_only_file;        /* Queue if file exists/not-exists */
 extern BOOL    queue_only_override;    /* Allow override from command line */
 extern BOOL    queue_only_policy;      /* ACL or local_scan wants queue_only */
 extern BOOL    queue_run_in_order;     /* As opposed to random */
-extern int     queue_run_max;          /* Max queue runners */
+extern uschar *queue_run_max;          /* Max queue runners */
 extern BOOL    queue_smtp;             /* Disable all immediate STMP (-odqs)*/
 extern uschar *queue_smtp_domains;     /* Ditto, for these domains */
 
index 375f01a1a5e313d8acbf18eab22f5f38038fbee4..63a1641227dd4f5b57699c5147c6f70aa4c3e6e6 100644 (file)
@@ -374,7 +374,7 @@ static optionlist optionlist_config[] = {
   { "queue_only_load_latch",    opt_bool,        &queue_only_load_latch },
   { "queue_only_override",      opt_bool,        &queue_only_override },
   { "queue_run_in_order",       opt_bool,        &queue_run_in_order },
-  { "queue_run_max",            opt_int,         &queue_run_max },
+  { "queue_run_max",            opt_stringptr,   &queue_run_max },
   { "queue_smtp_domains",       opt_stringptr,   &queue_smtp_domains },
   { "receive_timeout",          opt_time,        &receive_timeout },
   { "received_header_text",     opt_stringptr,   &received_header_text },
index 0daf053bdd04824618722e4c87cc78c0cc3f27b1..0fd7efe44c702433e6700514a1897a9f6bb7c428 100644 (file)
@@ -148,7 +148,7 @@ no_queue_only_override
 queue_only_file = /var/spool/exim/queue_only
 queue_only_load = 8.2
 no_queue_run_in_order
-queue_run_max = 5
+queue_run_max = ${if = {1}{1} {5}{10}}
 queue_smtp_domains = x.y.z
 receive_timeout = 0s
 received_header_text = Received: ${if def:sender_rcvhost {from ${sender_rcvhost}\n\t}{${if def:sender_ident {from ${sender_ident} }}${if def:sender_helo_name {(helo=${sender_helo_name})\n\t}}}}by ${primary_hostname} ${if def:received_protocol {with ${received_protocol}}} (Exim ${version_number} #${compile_number})\n\tid ${message_id}${if def:received_for {\n\tfor $received_for}}
index 722988a2979f5bcbd381a81425caaaddb8aa6d36..289ed1955a1663d2f88e62df8824dc45725e028b 100644 (file)
@@ -13,12 +13,21 @@ tls_advertise_hosts =
 
 log_selector = +received_recipients +sender_on_delivery
 
-acl_smtp_rcpt = accept queue = ${if eq {normal}{$local_part} {} {$local_part}}
+acl_smtp_rcpt = rcpt
 queue_only
 queue_run_in_order
 
 #---------------
 
+begin acl
+
+rcpt:
+  accept
+    queue = ${if eq {normal}{$local_part} {} {$local_part}}
+    logwrite = using queue '$queue_name'
+
+#---------------
+
 begin routers
 
 all:
index 6b3ed743c343225bfa1b34be02b148ff0d5a3c26..042d10c6ed0050525798d1359ee9d4c510a0a8df 100644 (file)
@@ -1,4 +1,6 @@
+1999-03-02 09:44:33 using queue ''
 1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local-smtp S=sss for normal@test.ex
+1999-03-02 09:44:33 using queue 'alternate'
 1999-03-02 09:44:33 10HmaY-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local-smtp S=sss Q=alternate for alternate@test.ex
 1999-03-02 09:44:33 Start queue run: pid=pppp -qq
 1999-03-02 09:44:33 10HmaX-0005vi-00 => normal <normal@test.ex> F=<CALLER@the.local.host.name> R=all T=dump
@@ -10,6 +12,7 @@
 1999-03-02 09:44:33 10HmaY-0005vi-00 => alternate <alternate@test.ex> F=<CALLER@the.local.host.name> Q=alternate R=all T=dump
 1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
 1999-03-02 09:44:33 End 'alternate' queue run: pid=pppp
+1999-03-02 09:44:33 using queue 'lowpri'
 1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local-smtp S=sss Q=lowpri for lowpri@test.ex
 
 ******** SERVER ********
index 583adcff04f54a015e6dfcf23a0ddfa8154d510d..278a38660519afadefd1ae19eef06594dae3d9aa 100644 (file)
@@ -23,6 +23,7 @@ primary_hostname: ${primary_hostname}
 qualify_domain: $qualify_domain
 bounce_return_size_limit: ${bounce_return_size_limit}
 spool_directory: $spool_directory
+queue_name: $queue_name
 unknown: ${unknown}
 h_subject: $h_subject:(should be empty)
 h_subject:$h_subject (should be empty)
index 9a2768bdc99426e612a11487bdc83cfa0e883a14..0bbd4c75497e8fb385d05e58de88f18bd0919a12 100644 (file)
@@ -14,6 +14,7 @@
 > qualify_domain: myhost.test.ex
 > bounce_return_size_limit: 102400
 > spool_directory: TESTSUITE/spool
+> queue_name: 
 > Failed: unknown variable in "${unknown}"
 > h_subject: (should be empty)
 > h_subject: (should be empty)