]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.2-20040729
authorWietse Venema <wietse@porcupine.org>
Thu, 29 Jul 2004 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:29:49 +0000 (06:29 +0000)
25 files changed:
postfix/HISTORY
postfix/RELEASE_NOTES
postfix/html/postconf.5.html
postfix/html/smtp-source.1.html
postfix/html/smtp.8.html
postfix/man/man1/smtp-source.1
postfix/man/man5/postconf.5
postfix/man/man8/smtp.8
postfix/proto/postconf.proto
postfix/src/global/deliver_request.h
postfix/src/global/mail_params.h
postfix/src/global/mail_version.h
postfix/src/oqmgr/Makefile.in
postfix/src/oqmgr/qmgr.h
postfix/src/oqmgr/qmgr_deliver.c
postfix/src/oqmgr/qmgr_entry.c
postfix/src/oqmgr/qmgr_queue.c
postfix/src/qmgr/Makefile.in
postfix/src/qmgr/qmgr.h
postfix/src/qmgr/qmgr_deliver.c
postfix/src/qmgr/qmgr_entry.c
postfix/src/qmgr/qmgr_queue.c
postfix/src/smtp/smtp.c
postfix/src/smtp/smtp_connect.c
postfix/src/smtpstone/smtp-source.c

index 4f0d372e26e6fac1c5447b9800edd52f1e7ca4c8..0b6cc78509497bd6b6ee243a7b0ed9051e667437 100644 (file)
@@ -9583,12 +9583,12 @@ Apologies for any names omitted.
        recvmsg(). Workaround is to insert an intervening read
        (write) operation.  Presumably, LINUX 2.4 is confusing the
        data and file descriptor.  Lucky Ralf Hildebrandt.  Files:
-       util/sys_defs.h, global/scache_clnt,c, scache/scache.c.
+       util/sys_defs.h, global/scache_clnt.c, scache/scache.c.
 
 20040723
 
        Bug? Safety? spawn(8) did not reject a user with the -1
-       UID value, so the command was running as root.  Files:
+       UID value, so the command could run as root.  Files:
        util/spawn_command.c, src/util/spawn.c.
 
        User interface: parameter smtp_connection_cache_domains
@@ -9599,6 +9599,18 @@ Apologies for any names omitted.
        Bugfix: "421 Timeout exceeded" wasn't guarded by setjmp().
        Victor Duchovni, Morgan Stanley. File: smtpd/smtpd.c.
 
+20040729
+
+       Feature:  enable SMTP session caching temporarily while a
+       site has a high volume of mail in the active queue.
+       Parameter:  smtp_connection_cache_on_demand (default:
+       yes).  Files:  smtp/smtp_connect.c, *qmgr/qmgr_entry.c,
+       *qmgr/qmgr_queue.c, *qmgr/qmgr_deliver.c.
+
+       Feature: smtp-source -N option to generate unique recipient
+       addresses for (trivial-rewrite) stress testing. Victor
+       Duchovni, Morgan Stanley. File: smtpstone/smtp-source.c.
+
 Open problems:
 
        Low: update events.c so that 1-second timer requests do
index 0f8acd52cc17cf93aec753092c19d4ec0ca803a5..4a4ce9f62184c54924d4c985abfbefcaa7159251 100644 (file)
@@ -7,14 +7,30 @@ snapshot release).  Patches are issued for the official release
 and change the patchlevel and the release date. Patches are never
 issued for snapshot releases.
 
+Incompatible changes with snapshot Postfix-2.2-20040729
+=======================================================
+
+SMTP session caching is enabled temporarily when a destination has
+a high volume of mail in the active queue.  To disable, specify
+"smtp_connection_cache_on_demand = no".
+
+Major changes with snapshot Postfix-2.2-20040729
+================================================
+
+Opportunistic SMTP session caching. When a destination has a high
+volume of mail in the active queue, SMTP session caching is enabled
+temporarily.  This is controlled with a new configuration parameter
+"smtp_connection_cache_on_demand" (default:  yes).
+
 Incompatible changes with snapshot Postfix-2.2-20040723
 =======================================================
 
-Session caching is enabled with smtp_session_cache_destinations,
-and requires "bare" domain names without "[]" or TCP port.  This
-eliminates a syntax conflict between host:port and maptype:mapname,
-and simplifies the user interface, at the cost of a minor loss of
-control over what sessions are cached.
+Permanent SMTP session caching is now enabled with the
+smtp_session_cache_destinations parameter. This requires "bare"
+domain names without "[]" or TCP port.  The change eliminates a
+syntax conflict between host:port and maptype:mapname, and simplifies
+the user interface, at the cost of a minor loss of control over
+what sessions are cached.
 
 Major changes with snapshot Postfix-2.2-20040721
 ================================================
@@ -38,10 +54,10 @@ The default SMTP/LMTP timeouts for sending RSET are reduced to 20s.
 Major changes with snapshot Postfix-2.2-20040720
 ================================================
 
-Selective SMTP session caching. Instead of disconnecting immediately
-after a mail transaction, the SMTP client can save the open session
-to a session cache daemon, so that any SMTP client process can use
-that session for another mail transaction.
+Selective permanent SMTP session caching. Instead of disconnecting
+immediately after a mail transaction, the SMTP client can save the
+open session to a session cache daemon, so that any SMTP client
+process can use that session for another mail transaction.
 
 This feature introduces the scache (session cache) server, which
 is added to your master.cf file when you upgrade Postfix.
index 235e3d1a3b881dfaf9c5dfb8f02ac7431774165c..59035717ef8aec4532fbd71bdd0c50210afa42ce 100644 (file)
@@ -5169,10 +5169,10 @@ The default time unit is s (seconds).
 <DT><b><a name="smtp_connection_cache_destinations">smtp_connection_cache_destinations</a>
 (default: empty)</b></DT><DD>
 
-<p> The SMTP destinations for which SMTP connection caching is
-enabled.  With SMTP connection caching, a connection is not closed
-immediately after completion of a mail transaction.  Instead, the
-connection is kept open for up to $<a href="postconf.5.html#smtp_connection_cache_time_limit">smtp_connection_cache_time_limit</a>
+<p> Permanently enable SMTP connection caching for the specified
+destinations.  With SMTP connection caching, a connection is not
+closed immediately after completion of a mail transaction.  Instead,
+the connection is kept open for up to $<a href="postconf.5.html#smtp_connection_cache_time_limit">smtp_connection_cache_time_limit</a>
 seconds.  This allows connections to be reused for other deliveries,
 and can improve mail delivery performance. </p>
 
@@ -5200,6 +5200,22 @@ ignored.
 <p></p>
 
 
+</DD>
+
+<DT><b><a name="smtp_connection_cache_on_demand">smtp_connection_cache_on_demand</a>
+(default: yes)</b></DT><DD>
+
+<p> Temporarily enable SMTP session caching while a destination
+has a high volume of mail in the <a href="QSHAPE_README.html#active_queue">active queue</a>.  With SMTP connection
+caching, a connection is not closed immediately after completion
+of a mail transaction.  Instead, the connection is kept open for
+up to $<a href="postconf.5.html#smtp_connection_cache_time_limit">smtp_connection_cache_time_limit</a> seconds.  This allows
+connections to be reused for other deliveries, and can improve mail
+delivery performance. </p>
+
+<p> This feature is available in Postfix 2.2 and later. </p>
+
+
 </DD>
 
 <DT><b><a name="smtp_connection_cache_reuse_limit">smtp_connection_cache_reuse_limit</a>
index 18ada81a21d3006b81c3c862706757bc249cd942..ca2477b07623cac0c9b1409b1481220868baa03a 100644 (file)
@@ -52,8 +52,15 @@ SMTP-SOURCE(1)                                     SMTP-SOURCE(1)
        <b>-m</b> <i>message</i><b>_</b><i>count</i>
               Send the specified number of messages (default: 1).
 
+       <b>-N</b>     Prepend  a  non-repeating  sequence  number to each
+              recipient address. This avoids the artificial  100%
+              hit  rate  in the resolve and rewrite client caches
+              and exercises the  trivial-rewrite  daemon,  better
+              approximating  Postfix  performance under real-life
+              work-loads.
+
        <b>-r</b> <i>recipient</i><b>_</b><i>count</i>
-              Send  the specified number of recipients per trans-
+              Send the specified number of recipients per  trans-
               action (default: 1).  Recipient names are generated
               by prepending a number to the recipient address.
 
@@ -62,15 +69,15 @@ SMTP-SOURCE(1)                                     SMTP-SOURCE(1)
               lel (default: 1).
 
        <b>-S</b> <i>subject</i>
-              Send mail with the  named  subject  line  (default:
+              Send  mail  with  the  named subject line (default:
               none).
 
-       <b>-t</b> <i>to</i>  Use   the  specified  recipient  address  (default:
+       <b>-t</b> <i>to</i>  Use  the  specified  recipient  address   (default:
               &lt;foo@<a href="postconf.5.html#myhostname">myhostname</a>&gt;).
 
        <b>-R</b> <i>interval</i>
               Wait for a random period of time 0 &lt;= n &lt;= interval
-              between  messages.   Suspending one thread does not
+              between messages.  Suspending one thread  does  not
               affect other delivery threads.
 
        <b>-w</b> <i>interval</i>
@@ -78,7 +85,7 @@ SMTP-SOURCE(1)                                     SMTP-SOURCE(1)
               thread does not affect other delivery threads.
 
        [<b>inet:</b>]<i>host</i>[:<i>port</i>]
-              Connect  via  TCP  to  host  <i>host</i>,  port  <i>port</i>. The
+              Connect via  TCP  to  host  <i>host</i>,  port  <i>port</i>.  The
               default port is <b>smtp</b>.
 
        <b>unix:</b><i>pathname</i>
@@ -91,7 +98,7 @@ SMTP-SOURCE(1)                                     SMTP-SOURCE(1)
        <a href="smtp-sink.1.html">smtp-sink(1)</a>, SMTP/LMTP message dump
 
 <b>LICENSE</b>
-       The Secure Mailer license must be  distributed  with  this
+       The  Secure  Mailer  license must be distributed with this
        software.
 
 <b>AUTHOR(S)</b>
index 8fd7b06a968c3befeb18aa1d8201e6fff02b9d93..80866468773ee70073347e0b48db7a128f8098d6 100644 (file)
@@ -37,11 +37,16 @@ SMTP(8)                                                   SMTP(8)
        After  a  successful  mail  transaction,  a session may be
        saved to the <a href="scache.8.html"><b>scache(8)</a></b> session cache server,  so  that  it
        may  be  used by any SMTP client for a subsequent transac-
-       tion.  Session caching is disabled by default.
+       tion.
+
+       By default, session caching  is  enabled  temporarily  for
+       destinations that have a high volume of mail in the active
+       queue. Session caching can be enabled permanently for spe-
+       cific destinations.
 
 <b>SECURITY</b>
        The SMTP client is moderately security-sensitive. It talks
-       to  SMTP  servers  and  to DNS servers on the network. The
+       to SMTP servers and to DNS servers  on  the  network.  The
        SMTP client can be run chrooted at fixed low privilege.
 
 <b>STANDARDS</b>
@@ -57,30 +62,30 @@ SMTP(8)                                                   SMTP(8)
        <a href="http://www.faqs.org/rfcs/rfc2920.html">RFC 2920</a> (SMTP Pipelining)
 
 <b>DIAGNOSTICS</b>
-       Problems and transactions are logged to <b>syslogd</b>(8).   Cor-
-       rupted  message files are marked so that the queue manager
+       Problems  and transactions are logged to <b>syslogd</b>(8).  Cor-
+       rupted message files are marked so that the queue  manager
        can move them to the <b>corrupt</b> queue for further inspection.
 
-       Depending  on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b> parameter,
-       the postmaster is notified of bounces, protocol  problems,
+       Depending on the setting of the <b><a href="postconf.5.html#notify_classes">notify_classes</a></b>  parameter,
+       the  postmaster is notified of bounces, protocol problems,
        and of other trouble.
 
 <b>BUGS</b>
        SMTP session caching does not work with TLS. The necessary
-       support for TLS object passivation and re-activation  does
-       not  exist  without closing the session, which defeats the
+       support  for TLS object passivation and re-activation does
+       not exist without closing the session, which  defeats  the
        purpose.
 
-       SMTP session caching assumes  that  SASL  credentials  are
-       valid  for  all  destinations  that  map  onto the same IP
+       SMTP  session  caching  assumes  that SASL credentials are
+       valid for all destinations  that  map  onto  the  same  IP
        address and TCP port.
 
 <b>CONFIGURATION PARAMETERS</b>
        Changes to <b>main.cf</b> are picked up automatically, as <a href="smtp.8.html">smtp(8)</a>
-       processes  run  for only a limited amount of time. Use the
+       processes run for only a limited amount of time.  Use  the
        command "<b>postfix reload</b>" to speed up a change.
 
-       The text below provides  only  a  parameter  summary.  See
+       The  text  below  provides  only  a parameter summary. See
        <a href="postconf.5.html">postconf(5)</a> for more details including examples.
 
 <b>COMPATIBILITY CONTROLS</b>
@@ -94,7 +99,7 @@ SMTP(8)                                                   SMTP(8)
               Never send EHLO at the start of an SMTP session.
 
        <b><a href="postconf.5.html#smtp_defer_if_no_mx_address_found">smtp_defer_if_no_mx_address_found</a> (no)</b>
-              Defer  mail  delivery when no MX record resolves to
+              Defer mail delivery when no MX record  resolves  to
               an IP address.
 
        <b><a href="postconf.5.html#smtp_line_length_limit">smtp_line_length_limit</a> (990)</b>
@@ -102,17 +107,17 @@ SMTP(8)                                                   SMTP(8)
               that Postfix will send via SMTP.
 
        <b><a href="postconf.5.html#smtp_pix_workaround_delay_time">smtp_pix_workaround_delay_time</a> (10s)</b>
-              How  long  the  Postfix  SMTP  client pauses before
+              How long the  Postfix  SMTP  client  pauses  before
               sending ".&lt;CR&gt;&lt;LF&gt;" in order to work around the PIX
               firewall "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;" bug.
 
        <b><a href="postconf.5.html#smtp_pix_workaround_threshold_time">smtp_pix_workaround_threshold_time</a> (500s)</b>
-              How  long  a  message must be queued before the PIX
-              firewall  "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;"  bug  workaround   is
+              How long a message must be queued  before  the  PIX
+              firewall   "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;"  bug  workaround  is
               turned on.
 
        <b><a href="postconf.5.html#smtp_quote_rfc821_envelope">smtp_quote_rfc821_envelope</a> (yes)</b>
-              Quote  addresses in SMTP MAIL FROM and RCPT TO com-
+              Quote addresses in SMTP MAIL FROM and RCPT TO  com-
               mands as required by <a href="http://www.faqs.org/rfcs/rfc821.html">RFC 821</a>.
 
        <b><a href="postconf.5.html#smtp_skip_5xx_greeting">smtp_skip_5xx_greeting</a> (yes)</b>
@@ -120,7 +125,7 @@ SMTP(8)                                                   SMTP(8)
               (go away, do not try again later).
 
        <b><a href="postconf.5.html#smtp_skip_quit_response">smtp_skip_quit_response</a> (yes)</b>
-              Do  not wait for the response to the SMTP QUIT com-
+              Do not wait for the response to the SMTP QUIT  com-
               mand.
 
        Available in Postfix version 2.0 and earlier:
@@ -133,7 +138,7 @@ SMTP(8)                                                   SMTP(8)
        Available in Postfix version 2.0 and later:
 
        <b><a href="postconf.5.html#disable_mime_output_conversion">disable_mime_output_conversion</a> (no)</b>
-              Disable  the  conversion of 8BITMIME format to 7BIT
+              Disable the conversion of 8BITMIME format  to  7BIT
               format.
 
        <b><a href="postconf.5.html#mime_boundary_length_limit">mime_boundary_length_limit</a> (2048)</b>
@@ -148,43 +153,43 @@ SMTP(8)                                                   SMTP(8)
        Available in Postfix version 2.1 and later:
 
        <b><a href="postconf.5.html#smtp_send_xforward_command">smtp_send_xforward_command</a> (no)</b>
-              Send the non-standard  XFORWARD  command  when  the
-              Postfix  SMTP  server EHLO response announces XFOR-
+              Send  the  non-standard  XFORWARD  command when the
+              Postfix SMTP server EHLO response  announces  XFOR-
               WARD support.
 
 <b>SASL AUTHENTICATION CONTROLS</b>
        <b><a href="postconf.5.html#smtp_sasl_auth_enable">smtp_sasl_auth_enable</a> (no)</b>
-              Enable SASL  authentication  in  the  Postfix  SMTP
+              Enable  SASL  authentication  in  the  Postfix SMTP
               client.
 
        <b><a href="postconf.5.html#smtp_sasl_password_maps">smtp_sasl_password_maps</a> (empty)</b>
-              Optional  SMTP  client lookup tables with one user-
-              name:password entry per remote hostname or  domain.
+              Optional SMTP client lookup tables with  one  user-
+              name:password  entry per remote hostname or domain.
 
        <b><a href="postconf.5.html#smtp_sasl_security_options">smtp_sasl_security_options</a> (noplaintext, noanonymous)</b>
-              What  authentication  mechanisms  the  Postfix SMTP
+              What authentication  mechanisms  the  Postfix  SMTP
               client is allowed to use.
 
 <b>RESOURCE AND RATE CONTROLS</b>
        <b><a href="postconf.5.html#smtp_destination_concurrency_limit">smtp_destination_concurrency_limit</a>      ($<a href="postconf.5.html#default_destination_concurrency_limit">default_destina</a>-</b>
        <b><a href="postconf.5.html#default_destination_concurrency_limit">tion_concurrency_limit</a>)</b>
-              The maximal number of parallel  deliveries  to  the
-              same  destination  via  the  smtp  message delivery
+              The  maximal  number  of parallel deliveries to the
+              same destination  via  the  smtp  message  delivery
               transport.
 
        <b><a href="postconf.5.html#smtp_destination_recipient_limit">smtp_destination_recipient_limit</a>        ($<a href="postconf.5.html#default_destination_recipient_limit">default_destina</a>-</b>
        <b><a href="postconf.5.html#default_destination_recipient_limit">tion_recipient_limit</a>)</b>
-              The maximal number of recipients per  delivery  via
+              The  maximal  number of recipients per delivery via
               the smtp message delivery transport.
 
        <b><a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> (30s)</b>
-              The  SMTP  client  time  limit for completing a TCP
+              The SMTP client time limit  for  completing  a  TCP
               connection,  or  zero  (use  the  operating  system
               built-in time limit).
 
        <b><a href="postconf.5.html#smtp_helo_timeout">smtp_helo_timeout</a> (300s)</b>
-              The  SMTP client time limit for sending the HELO or
-              EHLO command, and for receiving the initial  server
+              The SMTP client time limit for sending the HELO  or
+              EHLO  command, and for receiving the initial server
               response.
 
        <b><a href="postconf.5.html#smtp_xforward_timeout">smtp_xforward_timeout</a> (300s)</b>
@@ -192,30 +197,30 @@ SMTP(8)                                                   SMTP(8)
               command, and for receiving the server response.
 
        <b><a href="postconf.5.html#smtp_mail_timeout">smtp_mail_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  MAIL
-              FROM   command,   and   for  receiving  the  server
+              The  SMTP  client  time  limit for sending the MAIL
+              FROM  command,  and  for   receiving   the   server
               response.
 
        <b><a href="postconf.5.html#smtp_rcpt_timeout">smtp_rcpt_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
-              RCPT  TO  command,  and  for  receiving  the server
+              The  SMTP  client  time  limit for sending the SMTP
+              RCPT TO  command,  and  for  receiving  the  server
               response.
 
        <b><a href="postconf.5.html#smtp_data_init_timeout">smtp_data_init_timeout</a> (120s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
-              DATA   command,   and   for  receiving  the  server
+              The  SMTP  client  time  limit for sending the SMTP
+              DATA  command,  and  for   receiving   the   server
               response.
 
        <b><a href="postconf.5.html#smtp_data_xfer_timeout">smtp_data_xfer_timeout</a> (180s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
+              The  SMTP  client  time  limit for sending the SMTP
               message content.
 
        <b><a href="postconf.5.html#smtp_data_done_timeout">smtp_data_done_timeout</a> (600s)</b>
-              The  SMTP  client  time  limit for sending the SMTP
+              The SMTP client time limit  for  sending  the  SMTP
               ".", and for receiving the server response.
 
        <b><a href="postconf.5.html#smtp_quit_timeout">smtp_quit_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  QUIT
+              The  SMTP  client  time  limit for sending the QUIT
               command, and for receiving the server response.
 
        Available in Postfix version 2.1 and later:
@@ -226,23 +231,28 @@ SMTP(8)                                                   SMTP(8)
               lookups, or zero (no limit).
 
        <b><a href="postconf.5.html#smtp_mx_session_limit">smtp_mx_session_limit</a> (2)</b>
-              The  maximal  number  of SMTP sessions per delivery
-              request before giving up or delivering to  a  fall-
+              The maximal number of SMTP  sessions  per  delivery
+              request  before  giving up or delivering to a fall-
               back relay host, or zero (no limit).
 
        <b><a href="postconf.5.html#smtp_rset_timeout">smtp_rset_timeout</a> (20s)</b>
-              The  SMTP  client  time  limit for sending the RSET
+              The SMTP client time limit  for  sending  the  RSET
               command, and for receiving the server response.
 
        Available in Postfix version 2.2 and later:
 
        <b><a href="postconf.5.html#smtp_connection_cache_destinations">smtp_connection_cache_destinations</a> (empty)</b>
-              The SMTP destinations  for  which  SMTP  connection
-              caching is enabled.
+              Permanently  enable SMTP connection caching for the
+              specified destinations.
+
+       <b>smtp_connection_cache_on_demand (yes)</b>
+              Temporarily enable SMTP  session  caching  while  a
+              destination has a high volume of mail in the active
+              queue.
 
        <b><a href="postconf.5.html#smtp_connection_cache_reuse_limit">smtp_connection_cache_reuse_limit</a> (10)</b>
               When SMTP session caching is enabled, the number of
-              times that an SMTP session is reused before  it  is
+              times  that  an SMTP session is reused before it is
               closed.
 
        <b><a href="postconf.5.html#smtp_connection_cache_time_limit">smtp_connection_cache_time_limit</a> (2s)</b>
@@ -252,46 +262,46 @@ SMTP(8)                                                   SMTP(8)
 
 <b>TROUBLE SHOOTING CONTROLS</b>
        <b><a href="postconf.5.html#debug_peer_level">debug_peer_level</a> (2)</b>
-              The  increment  in  verbose  logging  level  when a
-              remote client or server matches a  pattern  in  the
+              The increment  in  verbose  logging  level  when  a
+              remote  client  or  server matches a pattern in the
               <a href="postconf.5.html#debug_peer_list">debug_peer_list</a> parameter.
 
        <b><a href="postconf.5.html#debug_peer_list">debug_peer_list</a> (empty)</b>
-              Optional  list  of remote client or server hostname
-              or network address patterns that cause the  verbose
-              logging  level  to increase by the amount specified
+              Optional list of remote client or  server  hostname
+              or  network address patterns that cause the verbose
+              logging level to increase by the  amount  specified
               in $<a href="postconf.5.html#debug_peer_level">debug_peer_level</a>.
 
        <b><a href="postconf.5.html#error_notice_recipient">error_notice_recipient</a> (postmaster)</b>
-              The recipient  of  postmaster  notifications  about
-              mail  delivery  problems that are caused by policy,
+              The  recipient  of  postmaster  notifications about
+              mail delivery problems that are caused  by  policy,
               resource, software or protocol errors.
 
        <b><a href="postconf.5.html#notify_classes">notify_classes</a> (resource, software)</b>
-              The list of error classes that are reported to  the
+              The  list of error classes that are reported to the
               postmaster.
 
 <b>MISCELLANEOUS CONTROLS</b>
        <b><a href="postconf.5.html#best_mx_transport">best_mx_transport</a> (empty)</b>
-              Where  the  Postfix SMTP client should deliver mail
+              Where the Postfix SMTP client should  deliver  mail
               when it detects a "mail loops back to myself" error
               condition.
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The  default  location  of  the Postfix main.cf and
+              The default location of  the  Postfix  main.cf  and
               master.cf configuration files.
 
        <b><a href="postconf.5.html#daemon_timeout">daemon_timeout</a> (18000s)</b>
-              How much time a Postfix daemon process may take  to
-              handle  a  request  before  it  is  terminated by a
+              How  much time a Postfix daemon process may take to
+              handle a request  before  it  is  terminated  by  a
               built-in watchdog timer.
 
        <b><a href="postconf.5.html#disable_dns_lookups">disable_dns_lookups</a> (no)</b>
-              Disable DNS lookups in the Postfix  SMTP  and  LMTP
+              Disable  DNS  lookups  in the Postfix SMTP and LMTP
               clients.
 
        <b><a href="postconf.5.html#fallback_relay">fallback_relay</a> (empty)</b>
-              Optional  list of relay hosts for SMTP destinations
+              Optional list of relay hosts for SMTP  destinations
               that can't be found or that are unreachable.
 
        <b><a href="postconf.5.html#inet_interfaces">inet_interfaces</a> (all)</b>
@@ -303,25 +313,25 @@ SMTP(8)                                                   SMTP(8)
               over an internal communication channel.
 
        <b><a href="postconf.5.html#max_idle">max_idle</a> (100s)</b>
-              The maximum amount of time  that  an  idle  Postfix
-              daemon  process  waits for the next service request
+              The  maximum  amount  of  time that an idle Postfix
+              daemon process waits for the next  service  request
               before exiting.
 
        <b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
-              The maximal number of connection requests before  a
+              The  maximal number of connection requests before a
               Postfix daemon process terminates.
 
        <b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
-              The  process ID of a Postfix command or daemon pro-
+              The process ID of a Postfix command or daemon  pro-
               cess.
 
        <b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
-              The process name of a  Postfix  command  or  daemon
+              The  process  name  of  a Postfix command or daemon
               process.
 
        <b><a href="postconf.5.html#proxy_interfaces">proxy_interfaces</a> (empty)</b>
               The network interface addresses that this mail sys-
-              tem receives mail on by way of a proxy  or  network
+              tem  receives  mail on by way of a proxy or network
               address translation unit.
 
        <b><a href="postconf.5.html#smtp_bind_address">smtp_bind_address</a> (empty)</b>
@@ -329,22 +339,22 @@ SMTP(8)                                                   SMTP(8)
               client should bind to when making a connection.
 
        <b><a href="postconf.5.html#smtp_helo_name">smtp_helo_name</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
-              The hostname to send in the SMTP EHLO or HELO  com-
+              The  hostname to send in the SMTP EHLO or HELO com-
               mand.
 
        <b><a href="postconf.5.html#smtp_host_lookup">smtp_host_lookup</a> (dns)</b>
-              What  mechanisms  when the SMTP client uses to look
+              What mechanisms when the SMTP client uses  to  look
               up a host's IP address.
 
        <b><a href="postconf.5.html#smtp_randomize_addresses">smtp_randomize_addresses</a> (yes)</b>
-              Randomize the order  of  equal-preference  MX  host
+              Randomize  the  order  of  equal-preference MX host
               addresses.
 
        <b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (postfix)</b>
-              The  mail system name that is prepended to the pro-
+              The mail system name that is prepended to the  pro-
               cess  name  in  syslog  records,  so  that  "smtpd"
               becomes, for example, "postfix/smtpd".
 
@@ -360,7 +370,7 @@ SMTP(8)                                                   SMTP(8)
        <a href="SASL_README.html">SASL_README</a>, Postfix SASL howto
 
 <b>LICENSE</b>
-       The Secure Mailer license must be  distributed  with  this
+       The  Secure  Mailer  license must be distributed with this
        software.
 
 <b>AUTHOR(S)</b>
index a593c06b61aa693f523eabe597e31fee3d3eb1fd..7ecff03518cc4e6b31eaf8b3870fdd7e8a30f427 100644 (file)
@@ -45,6 +45,12 @@ include message headers.
 Speak LMTP rather than SMTP.
 .IP "\fB-m \fImessage_count\fR"
 Send the specified number of messages (default: 1).
+.IP "\fB-N\fR"
+Prepend a non-repeating sequence number to each recipient
+address. This avoids the artificial 100% hit rate in the
+resolve and rewrite client caches and exercises the
+trivial-rewrite daemon, better approximating Postfix
+performance under real-life work-loads.
 .IP "\fB-r \fIrecipient_count\fR"
 Send the specified number of recipients per transaction (default: 1).
 Recipient names are generated by prepending a number to the
index f520c1710f32d8c367fc5a820d042838030b7b04..360055e1935cf527946d31512a17fc0e442eaeee 100644 (file)
@@ -2698,10 +2698,10 @@ the operating system).
 Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
 .SH smtp_connection_cache_destinations (default: empty)
-The SMTP destinations for which SMTP connection caching is
-enabled.  With SMTP connection caching, a connection is not closed
-immediately after completion of a mail transaction.  Instead, the
-connection is kept open for up to $smtp_connection_cache_time_limit
+Permanently enable SMTP connection caching for the specified
+destinations.  With SMTP connection caching, a connection is not
+closed immediately after completion of a mail transaction.  Instead,
+the connection is kept open for up to $smtp_connection_cache_time_limit
 seconds.  This allows connections to be reused for other deliveries,
 and can improve mail delivery performance.
 .PP
@@ -2721,6 +2721,16 @@ a "type:table" with domains and/or relay hosts on the left-hand
 side.  The right-hand side result from "type:table" lookups is
 ignored.
 .PP
+.SH smtp_connection_cache_on_demand (default: yes)
+Temporarily enable SMTP session caching while a destination
+has a high volume of mail in the active queue.  With SMTP connection
+caching, a connection is not closed immediately after completion
+of a mail transaction.  Instead, the connection is kept open for
+up to $smtp_connection_cache_time_limit seconds.  This allows
+connections to be reused for other deliveries, and can improve mail
+delivery performance.
+.PP
+This feature is available in Postfix 2.2 and later.
 .SH smtp_connection_cache_reuse_limit (default: 10)
 When SMTP session caching is enabled, the number of times that
 an SMTP session is reused before it is closed.
index cc98f8252b53d9b4be80ccf6d7ee156619094be6..f6f530e28bfa6e4e4ff563de15dcc88c6da70f33 100644 (file)
@@ -35,7 +35,11 @@ deliver the mail to an alternate host.
 After a successful mail transaction, a session may be saved
 to the \fBscache(8)\fR session cache server, so that it
 may be used by any SMTP client for a subsequent transaction.
-Session caching is disabled by default.
+
+By default, session caching is enabled temporarily for
+destinations that have a high volume of mail in the active
+queue. Session caching can be enabled permanently for
+specific destinations.
 .SH "SECURITY"
 .na
 .nf
@@ -210,8 +214,11 @@ for receiving the server response.
 .PP
 Available in Postfix version 2.2 and later:
 .IP "\fBsmtp_connection_cache_destinations (empty)\fR"
-The SMTP destinations for which SMTP connection caching is
-enabled.
+Permanently enable SMTP connection caching for the specified
+destinations.
+.IP "\fBsmtp_connection_cache_on_demand (yes)\fR"
+Temporarily enable SMTP session caching while a destination
+has a high volume of mail in the active queue.
 .IP "\fBsmtp_connection_cache_reuse_limit (10)\fR"
 When SMTP session caching is enabled, the number of times that
 an SMTP session is reused before it is closed.
index 6cee85a30b94e2e0f6841374b036dd55a47d08f0..dcae6958c39cb92860fd967b6dc997a109acacb9 100644 (file)
@@ -3187,10 +3187,10 @@ an SMTP session is reused before it is closed.
 
 %PARAM smtp_connection_cache_destinations
 
-<p> The SMTP destinations for which SMTP connection caching is
-enabled.  With SMTP connection caching, a connection is not closed
-immediately after completion of a mail transaction.  Instead, the
-connection is kept open for up to $smtp_connection_cache_time_limit
+<p> Permanently enable SMTP connection caching for the specified
+destinations.  With SMTP connection caching, a connection is not
+closed immediately after completion of a mail transaction.  Instead,
+the connection is kept open for up to $smtp_connection_cache_time_limit
 seconds.  This allows connections to be reused for other deliveries,
 and can improve mail delivery performance. </p>
 
@@ -3217,6 +3217,18 @@ ignored.
 
 <p></p>
 
+%PARAM smtp_connection_cache_on_demand yes
+
+<p> Temporarily enable SMTP session caching while a destination
+has a high volume of mail in the active queue.  With SMTP connection
+caching, a connection is not closed immediately after completion
+of a mail transaction.  Instead, the connection is kept open for
+up to $smtp_connection_cache_time_limit seconds.  This allows
+connections to be reused for other deliveries, and can improve mail
+delivery performance. </p>
+
+<p> This feature is available in Postfix 2.2 and later. </p>
+
 %PARAM smtp_connect_timeout 30s
 
 <p>
index 6017878be48ef0d52742b24645f52e73b70babd6..ef541ed96c499e8e80f0a6f06bead93438c72d7e 100644 (file)
@@ -62,6 +62,7 @@ typedef struct DELIVER_REQUEST {
 #define DEL_REQ_FLAG_VERIFY    (1<<8)  /* verify recipient, don't deliver */
 #define DEL_REQ_FLAG_EXPAND    (1<<9)  /* verify expansion, don't deliver */
 #define DEL_REQ_FLAG_RECORD    (1<<10) /* record and deliver */
+#define DEL_REQ_FLAG_SCACHE    (1<<11) /* opportunistic caching */
 
 #define DEL_REQ_TRACE_FLAGS_MASK \
        (DEL_REQ_FLAG_VERIFY | DEL_REQ_FLAG_EXPAND | DEL_REQ_FLAG_RECORD)
index 9bdd34cefa5253ea4118b4bb35d623285a70fcd0..fb4a00e78d091d9f3d3b709cd9966116f5195d9a 100644 (file)
@@ -781,6 +781,10 @@ extern int var_smtp_reuse_limit;
 #define DEF_SMTP_CACHE_DEST    ""
 extern char *var_smtp_cache_dest;
 
+#define VAR_SMTP_CACHE_DEMAND  "smtp_connection_cache_on_demand"
+#define DEF_SMTP_CACHE_DEMAND  1
+extern bool var_smtp_cache_demand;
+
 #define VAR_SMTP_CONN_TMOUT    "smtp_connect_timeout"
 #define DEF_SMTP_CONN_TMOUT    "30s"
 extern int var_smtp_conn_tmout;
index 477479d4d2c6a4dff43131be0bf31c720a377298..9c3c899200badf75bf5dd8940878483d6777d9d4 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change the patchlevel and the release date. Snapshots change the
   * release date only.
   */
-#define MAIL_RELEASE_DATE      "20040723"
+#define MAIL_RELEASE_DATE      "20040729"
 #define MAIL_VERSION_NUMBER    "2.2"
 
 #define VAR_MAIL_VERSION       "mail_version"
index 63b9590c493730fcbe652a62b08ff8f896f0881c..37a7e44bc4d782a7926366ab78cca78258024039 100644 (file)
@@ -155,6 +155,9 @@ qmgr_entry.o: ../../include/events.h
 qmgr_entry.o: ../../include/vstream.h
 qmgr_entry.o: ../../include/vbuf.h
 qmgr_entry.o: ../../include/mail_params.h
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstring.h
+qmgr_entry.o: ../../include/recipient_list.h
 qmgr_entry.o: qmgr.h
 qmgr_entry.o: ../../include/scan_dir.h
 qmgr_message.o: qmgr_message.c
index 3a5e3ca846013d82c102421c6f1986894d4584f3..f3c59d95f7ec5f1810b75f1dc15702f5ef96da00 100644 (file)
@@ -140,6 +140,7 @@ struct QMGR_ENTRY_LIST {
 };
 
 struct QMGR_QUEUE {
+    int     dflags;                    /* delivery request options */
     char   *name;                      /* domain name or address */
     char   *nexthop;                   /* domain name */
     int     todo_refcount;             /* queue entries (todo list) */
index 60e2378d7371507d5a9ef46fb159b3fd03418297..ea66506660dc4ed94f7a6c88651904564bcea7a6 100644 (file)
@@ -143,6 +143,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
     }
 
     flags = message->tflags
+       | entry->queue->dflags
        | (message->inspect_xport ? DEL_REQ_FLAG_BOUNCE : DEL_REQ_FLAG_DEFLT);
     attr_print(stream, ATTR_FLAG_MORE,
               ATTR_TYPE_NUM, MAIL_ATTR_FLAGS, flags,
index 3d3f9f461e53f44b24d233d74c36d1de2dc47744..01240fb4b46ef3c3e10a55428d5d1f6bd8b825db 100644 (file)
@@ -84,6 +84,7 @@
 /* Global library. */
 
 #include <mail_params.h>
+#include <deliver_request.h>           /* opportunistic session caching */
 
 /* Application-specific. */
 
@@ -187,6 +188,7 @@ void    qmgr_entry_done(QMGR_ENTRY *entry, int which)
 
 QMGR_ENTRY *qmgr_entry_create(QMGR_QUEUE *queue, QMGR_MESSAGE *message)
 {
+    char   *myname = "qmgr_entry_create";
     QMGR_ENTRY *entry;
 
     /*
@@ -207,6 +209,22 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_QUEUE *queue, QMGR_MESSAGE *message)
     QMGR_LIST_APPEND(queue->todo, entry);
     queue->todo_refcount++;
 
+    /*
+     * With opportunistic session caching, the delivery agent must not only
+     * 1) save a session upon completion, but also 2) reuse a cached session
+     * upon the next delivery request. In order to not miss out on 2), we
+     * have to make caching sticky or else we get silly behavior when the
+     * in-memory queue drains. New connections must not be made while cached
+     * connections aren't being reused.
+     */
+    if ((queue->dflags & DEL_REQ_FLAG_SCACHE) == 0
+       && queue->window < queue->todo_refcount + queue->busy_refcount) {
+       if (msg_verbose)
+           msg_info("%s: passing on-demand session caching threshold for %s",
+                    myname, queue->name);
+       queue->dflags |= DEL_REQ_FLAG_SCACHE;
+    }
+
     /*
      * Warn if a destination is falling behind while the active queue
      * contains a non-trivial amount of single-recipient email. When a
index 3c88b7eda17636e9d6a291618cb1d852c3d420ab..810d9edc546569b547c487a7dec260af7e41cf6f 100644 (file)
@@ -183,6 +183,7 @@ void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
        queue->reason = mystrdup(reason);
        event_request_timer(qmgr_queue_unthrottle_wrapper,
                            (char *) queue, var_min_backoff_time);
+       queue->dflags = 0;
     }
 }
 
@@ -254,6 +255,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
 
     queue = (QMGR_QUEUE *) mymalloc(sizeof(QMGR_QUEUE));
     qmgr_queue_count++;
+    queue->dflags = 0;
     queue->name = mystrdup(name);
     queue->nexthop = mystrdup(nexthop);
     queue->todo_refcount = 0;
index 3239af2855d31dad990b44b34f33edd65c58286f..368bd255c30d2ed57dab2d56a66de52a42e63dbd 100644 (file)
@@ -157,6 +157,9 @@ qmgr_entry.o: ../../include/events.h
 qmgr_entry.o: ../../include/vstream.h
 qmgr_entry.o: ../../include/vbuf.h
 qmgr_entry.o: ../../include/mail_params.h
+qmgr_entry.o: ../../include/deliver_request.h
+qmgr_entry.o: ../../include/vstring.h
+qmgr_entry.o: ../../include/recipient_list.h
 qmgr_entry.o: qmgr.h
 qmgr_entry.o: ../../include/scan_dir.h
 qmgr_job.o: qmgr_job.c
index 141873c20d347d952c8fe22779738059f7db3b77..6c285358e0487eb8c59354e69fe9d542010436b3 100644 (file)
@@ -176,6 +176,7 @@ struct QMGR_ENTRY_LIST {
 };
 
 struct QMGR_QUEUE {
+    int     dflags;                    /* delivery request options */
     char   *name;                      /* domain name or address */
     char   *nexthop;                   /* domain name */
     int     todo_refcount;             /* queue entries (todo list) */
index 34fdb465d9dbd7945bc6a650f6b14cdf8995a15a..178f93d5e36eb48e683d8ddc95b831774d515a25 100644 (file)
@@ -148,6 +148,7 @@ static int qmgr_deliver_send_request(QMGR_ENTRY *entry, VSTREAM *stream)
     }
 
     flags = message->tflags
+       | entry->queue->dflags
        | (message->inspect_xport ? DEL_REQ_FLAG_BOUNCE : DEL_REQ_FLAG_DEFLT);
     attr_print(stream, ATTR_FLAG_MORE,
               ATTR_TYPE_NUM, MAIL_ATTR_FLAGS, flags,
index c26d2932549c681f8ca9ad497b194ff39771604e..bfb6d2e59e7fe829ffdec42daacc2fc46de17a2b 100644 (file)
@@ -92,6 +92,7 @@
 /* Global library. */
 
 #include <mail_params.h>
+#include <deliver_request.h>           /* opportunistic session caching */
 
 /* Application-specific. */
 
@@ -244,6 +245,7 @@ void    qmgr_entry_done(QMGR_ENTRY *entry, int which)
 
 QMGR_ENTRY *qmgr_entry_create(QMGR_PEER *peer, QMGR_MESSAGE *message)
 {
+    char   *myname = "qmgr_entry_create";
     QMGR_ENTRY *entry;
     QMGR_QUEUE *queue = peer->queue;
 
@@ -268,6 +270,22 @@ QMGR_ENTRY *qmgr_entry_create(QMGR_PEER *peer, QMGR_MESSAGE *message)
     QMGR_LIST_APPEND(queue->todo, entry, queue_peers);
     queue->todo_refcount++;
 
+    /*
+     * With opportunistic session caching, the delivery agent must not only
+     * 1) save a session upon completion, but also 2) reuse a cached session
+     * upon the next delivery request. In order to not miss out on 2), we
+     * have to make caching sticky or else we get silly behavior when the
+     * in-memory queue drains. New connections must not be made while cached
+     * connections aren't being reused.
+     */
+    if ((queue->dflags & DEL_REQ_FLAG_SCACHE) == 0
+       && queue->window < queue->todo_refcount + queue->busy_refcount) {
+       if (msg_verbose)
+           msg_info("%s: passing on-demand session caching threshold for %s",
+                    myname, queue->name);
+       queue->dflags |= DEL_REQ_FLAG_SCACHE;
+    }
+
     /*
      * Warn if a destination is falling behind while the active queue
      * contains a non-trivial amount of single-recipient email. When a
index b86034a571d2fdde3a2d29a4587e2a6a2918c187..262ce5e700217d3673a2057baae9ac4a1e5e7070 100644 (file)
@@ -181,6 +181,7 @@ void    qmgr_queue_throttle(QMGR_QUEUE *queue, const char *reason)
        queue->reason = mystrdup(reason);
        event_request_timer(qmgr_queue_unthrottle_wrapper,
                            (char *) queue, var_min_backoff_time);
+       queue->dflags = 0;
     }
 }
 
@@ -231,6 +232,7 @@ QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name,
 
     queue = (QMGR_QUEUE *) mymalloc(sizeof(QMGR_QUEUE));
     qmgr_queue_count++;
+    queue->dflags = 0;
     queue->name = mystrdup(name);
     queue->nexthop = mystrdup(nexthop);
     queue->todo_refcount = 0;
index 095d00c1846753f3fde5493204799f1e14321c5b..1431de19d8445514a821f980b4edb293f3d1ceed 100644 (file)
 /*     After a successful mail transaction, a session may be saved
 /*     to the \fBscache(8)\fR session cache server, so that it
 /*     may be used by any SMTP client for a subsequent transaction.
-/*     Session caching is disabled by default.
+/*
+/*     By default, session caching is enabled temporarily for
+/*     destinations that have a high volume of mail in the active
+/*     queue. Session caching can be enabled permanently for
+/*     specific destinations.
 /* SECURITY
 /* .ad
 /* .fi
 /* .PP
 /*     Available in Postfix version 2.2 and later:
 /* .IP "\fBsmtp_connection_cache_destinations (empty)\fR"
-/*     The SMTP destinations for which SMTP connection caching is
-/*     enabled.
+/*     Permanently enable SMTP connection caching for the specified
+/*     destinations.
+/* .IP "\fBsmtp_connection_cache_on_demand (yes)\fR"
+/*     Temporarily enable SMTP session caching while a destination
+/*     has a high volume of mail in the active queue.
 /* .IP "\fBsmtp_connection_cache_reuse_limit (10)\fR"
 /*     When SMTP session caching is enabled, the number of times that
 /*     an SMTP session is reused before it is closed.
@@ -374,6 +381,7 @@ int     var_smtp_cache_conn;
 int     var_smtp_reuse_limit;
 char   *var_smtp_cache_dest;
 char   *var_scache_service;
+bool    var_smtp_cache_demand;
 
  /*
   * Global variables. smtp_errno is set by the address lookup routines and by
@@ -489,7 +497,7 @@ static void post_init(char *unused_name, char **unused_argv)
     /*
      * Session cache instance.
      */
-    if (*var_smtp_cache_dest)
+    if (*var_smtp_cache_dest || var_smtp_cache_demand)
 #if 0
        smtp_scache = scache_multi_create();
 #else
@@ -601,6 +609,7 @@ int     main(int argc, char **argv)
        VAR_SMTP_QUOTE_821_ENV, DEF_SMTP_QUOTE_821_ENV, &var_smtp_quote_821_env,
        VAR_SMTP_DEFER_MXADDR, DEF_SMTP_DEFER_MXADDR, &var_smtp_defer_mxaddr,
        VAR_SMTP_SEND_XFORWARD, DEF_SMTP_SEND_XFORWARD, &var_smtp_send_xforward,
+       VAR_SMTP_CACHE_DEMAND, DEF_SMTP_CACHE_DEMAND, &var_smtp_cache_demand,
        0,
     };
 
index 600b6fa5d2cb06d56c86a1564dc5e05d5cd270d7..8ae3dcfa4bb5be56f63324ad3f2eec9f7892911c 100644 (file)
@@ -521,10 +521,14 @@ int     smtp_connect(SMTP_STATE *state)
         * :port, because : is already used for maptype:mapname. Because of
         * this limitation we use the bare domain without the optional [] or
         * non-default TCP port.
+        * 
+        * Opportunistic (a.k.a. on-demand) session caching on request by the
+        * queue manager. This is turned temporarily when a destination has a
+        * high volume of mail in the active queue.
         */
        if (cpp == sites->argv
-           && smtp_cache_dest
-           && string_list_match(smtp_cache_dest, domain)) {
+           && ((request->flags & DEL_REQ_FLAG_SCACHE) != 0
+               || (smtp_cache_dest && string_list_match(smtp_cache_dest, domain)))) {
            sess_flags |= SMTP_SESS_FLAG_CACHE;
            SET_NEXTHOP_STATE(state, lookup_mx, domain, port);
        }
index 106f30bb3019e3b5fc32724c03d4725082db14e8..4a6d7df40f53adb8eefde8a5aa145e4eaea9cc74 100644 (file)
 /*     Speak LMTP rather than SMTP.
 /* .IP "\fB-m \fImessage_count\fR"
 /*     Send the specified number of messages (default: 1).
+/* .IP "\fB-N\fR"
+/*     Prepend a non-repeating sequence number to each recipient
+/*     address. This avoids the artificial 100% hit rate in the
+/*     resolve and rewrite client caches and exercises the
+/*     trivial-rewrite daemon, better approximating Postfix
+/*     performance under real-life work-loads.
 /* .IP "\fB-r \fIrecipient_count\fR"
 /*     Send the specified number of recipients per transaction (default: 1).
 /*     Recipient names are generated by prepending a number to the
@@ -171,6 +177,7 @@ static int random_delay = 0;
 static int fixed_delay = 0;
 static int talk_lmtp = 0;
 static char *subject = 0;
+static int number_rcpts = 0;
 
 static void enqueue_connect(SESSION *);
 static void start_connect(SESSION *);
@@ -573,9 +580,10 @@ static void send_rcpt(int unused_event, char *context)
     if ((except = vstream_setjmp(session->stream)) != 0)
        msg_fatal("%s while sending recipient", exception_text(except));
 
-    if (session->rcpt_count > 1)
+    if (session->rcpt_count > 1 || number_rcpts > 0)
        command(session->stream, "RCPT TO:<%d%s>",
-               session->rcpt_count, recipient);
+               number_rcpts ? number_rcpts++ : session->rcpt_count,
+               recipient);
     else
        command(session->stream, "RCPT TO:<%s>", recipient);
     session->rcpt_count--;
@@ -767,7 +775,7 @@ static void quit_done(int unused_event, char *context)
 
 static void usage(char *myname)
 {
-    msg_fatal("usage: %s -s sess -l msglen -m msgs -c -C count -d -f from -o -t to -r rcptcount -R delay -v -w delay host[:port]", myname);
+    msg_fatal("usage: %s -cdLNov -s sess -l msglen -m msgs -C count -f from -t to -r rcptcount -R delay -w delay host[:port]", myname);
 }
 
 /* main - parse JCL and start the machine */
@@ -789,7 +797,7 @@ int     main(int argc, char **argv)
     /*
      * Parse JCL.
      */
-    while ((ch = GETOPT(argc, argv, "cC:df:l:Lm:or:R:s:S:t:vw:")) > 0) {
+    while ((ch = GETOPT(argc, argv, "cC:df:l:Lm:Nor:R:s:S:t:vw:")) > 0) {
        switch (ch) {
        case 'c':
            count++;
@@ -822,6 +830,9 @@ int     main(int argc, char **argv)
            if ((message_count = atoi(optarg)) <= 0)
                msg_fatal("bad message count: %s", optarg);
            break;
+       case 'N':
+           number_rcpts = 1;
+           break;
        case 'o':
            send_helo_first = 0;
            send_headers = 0;