Commit Graph

398 Commits

Author SHA1 Message Date
Wez Furlong bf76ddd066 docs: fixup get_egress_path_config
You can't actually define this multiple times; I was on early-morning
autopilot when I wrote that up in 48f1e48e6d
2025-05-16 14:07:10 -07:00
Wez Furlong 42bf5c5e61 docs: adjust reference to improve search terms
We've been hoping that mkdocs-material will ship the much anticipated
search enhancements for some time, but it's time to recognize that
we need to do something to improve the search results with how
things work right now.

This is a big commit that changes the titles of the various pages
from the code-annotated synopsis to just the name of the function.

This makes it much easier now to match things like `kumo.reject`
directly, but `reject` remains awkward to find.

I think this is the best that we can do at this time.

A few functions have been annotated with the `status: deprecated` to
show as deprecated in the toc/nav (shows with a little trash can next
to the name).
2025-05-16 14:02:19 -07:00
Wez Furlong 36a14f1ff7 docs: add explicit titles to event reference pages
This makes it easier to search for eg: get_egress_path_config and have
mkdocs return that page as a result.
2025-05-16 06:35:45 -07:00
Wez Furlong 48f1e48e6d docs: expand get_egress_path_config event docs 2025-05-16 06:28:13 -07:00
Wez Furlong 1a7875c663 docs: update configure_resolver page for hickory changes
Since we published a stable release on the new hickory,
tweak this page to show the now-current form of things.
2025-05-14 12:54:19 -07:00
Wez Furlong b0c6b1cf6a smtp_dispatcher: retry more aggressively in transport-error-ish scenarios
Some sites are non-conforming in their behavior when they have a policy
that issues a transient failure and then snips the connection without
explicitly issuing a 421.

This can cause "splash damage" where a message is transiently failed
and the connection snipped "disgracefully" and a subsequent message
that is due to go out on that same established connection encounters
a transport error when the RSET part of the pipeline is sent.

This commit provides methods on the ClientError and Response types
to help reason about whether the response might be specifically
about the message being delivered, vs. more of a transport error.

The gist of this check is that timeouts and transport level stuff
where there is no protocol level response are not considered to
be due to the message.  Protocol level responses prior to MAIL FROM
are similarly considered to be more like transport errors.

The functional change in this commit is:

* If we get a transport-ish error and we have more candidate hosts
  available in the connection plan, then after logging a
  TransientFailure for the error we just encountered, we'll push
  back the message to be tried again on the next connection that
  we open in the current session.

* For timeout errors specifically, this behavior is gated behind
  a try_next_host_on_timeout boolean option.
2025-05-08 10:41:06 -07:00
Wez Furlong c3dff7e2c8 docs: update for latest release 2025-05-06 18:24:15 -07:00
Wez Furlong b29689af74 docs: memoize: allow_stale_reads 2025-05-06 05:55:44 -07:00
Wez Furlong 507822f1c9 docs: fmt 2025-05-06 05:55:34 -07:00
Wez Furlong fedd2959b6 enhance log_arf, log_oob to support LogThenDrop
It is common to want to express that incoming reports should
be logged, but not relayed.

This commit facilitates that by expanding `log_arf` and `log_oob`
to allow more than just a simple boolean value.

We now support both LogThenRelay and LogThenDrop as dispositions
for an incoming report, as well as Ignore to not care about the
report content.

For the LogThenDrop case we'll log only the incoming OOB or Feedback
record to the logs and then discard the incoming message.

For LogThenRelay we'll log the incoming OOB/Feedback report as well
as enqueue the message and log a Reception and, subsequently, records
for its delivery attempts.

The previously supported boolean values are mapped to `Ignore` (false)
and `LogThenRelay` (true), respectively: their behavior is the same as
in prior releases.

The integration test and smtp server tracing infra has been enhanced a
bit to support extracting these new disposition states from the tracer
during the integration test.
2025-05-05 08:25:40 -07:00
Wez Furlong b8310da8be docs: add warning about logging headers
TL;DR: you can easily halve your system performance by logging headers
vs. logging meta.

This is one of those things that is easy to overlook or forget,
but: whenever you need to operate on the message data, rather
than its metadata, the aggregate cost is high.

In this case, we were recently troubleshooting a system where
the CPU was bogged down and we traced it to the logging configuration: a
number of message headers were being logged in a configuration that
made heavy use of throttles and limits in its traffic shaping, and
thus had a large number of Delayed and TransientFailure events being
written to the logs.

When logging headers, each one of those events requires loading
the message from the spool and parsing out the headers.  When the
average message size is ~100KB this imposes a notable overhead
on the CPU and IO utilization of the system.

What we recommend instead of logging headers directly is capturing
the information that you want to log into the message metadata
at the time that the message is received.

The message meta is usually already loaded, but is also typically
much smaller and easier to decode than the full message content
in the cases where it is not loaded.

As a result, it is much cheaper to log meta than to log headers.

This commit adds some warnings and cross links to help folks
be aware of this, and to generally navigate related meta and logging
topics more easily via tags.
2025-04-25 05:52:44 -07:00
Wez Furlong 18e510ebe2 ready_queue: introduce dispatcher_wakeup_strategy and maintainer_wakeup_strategy
These allow optionally reducing how aggressively the dispatcher and
maintainers will be awoken when message(s) are submitted to the ready
queue.

The default behavior remains the same; the new thing here is the
ability to make it more relaxed, which should reduce some CPU
overheads for very busy systems with many queues.

Making things more relaxed does introduce a possibility for higher
outbound latency in some edge cases with low or bursty traffic.
2025-04-16 15:19:27 -07:00
Wez Furlong eda083f083 dns-resolver: use thundering herd protection and add semaphore
This commit does two things:

* Migrate the limit of 128 concurrent lookups from the shaping code
  and into the general mx lookup code
* Adjust the mx lookup implementation to run inside the cache
  getter, which applies thundering herd protection to the lookup.

These together will constrain the amount of queries being sent
to the upstream dns resolver and reduce the chances of it being
overwhelmed, especially if we are doing duplicate queries from
multiple concurrent contexts simultaneously.
2025-04-06 08:45:49 -07:00
Edgar Vaitkevicius d0314c0f3a Updated Kafka producer docs
They mistakenly referred to AMQP and queues before.
2025-04-03 09:37:04 -07:00
Wez Furlong 3b14587192 fix delayed shutdown for non-smtp delivery handlers
Occasionally we'll have someone report that systemd timed out
and sigkill'd their kumo on shutdown.

One possible scenario for this is a lua delivery handler that
is taking too long, presumably because the other end of it
(eg: webhook or other custom endpoint) is not responding in
a timely fashion.

The way that we handle shutdown is that we compute a maximum
theoretical timeout value by summing up all of the smtp client
timeout values.  Some of those can be several minutes in
duration because the are using default values derived from
a very conservative set of values suggested by the SMTP
RFCs from the '70s.

Those obviously should not apply to a custom delivery handler,
but also, in the context of an established SMTP session, we
should not add in the connection-establishment-specific values
when we're just waiting for a per-message send.

This commit addresses this situation on two fronts:

* Introduce a new system_shutdown_timeout value that allows the
  user to conveniently express their desired timeout value
  in a single option.  This is *not* set by default!
* The default value for system_shutdown_timeout is computed by
  summing the per-message-delivery smtp timeout options, which
  is a much more reasonable, and more importantly, shorter than
  our 300s TimeoutStopSec value in kumomta.service
2025-04-02 14:21:31 -07:00
Wez Furlong ff7f9eb666 move readyq maint into its own thread pool
Previously, we'd use the qmaint pool to spawn both the scheduled
and ready queue maintenance tasks.

This commit splits them apart in order to avoid the potential for
cross-task contention on the same threads if a scheduled queue
and ready queue pair are communicating with each other.
2025-04-02 10:36:46 -07:00
Wez Furlong 4b33354dee allow overriding available_parallelism value
We recently observed a system running on an over-committed VM that
reported 4x the actually available parallelism.

Since we scale our thread pool sizes from this value, it resulted
in an extra-over-committed configuration for kumod.

You may now set KUMO_AVAILABLE_PARALLELISM in the environment to
override the value that we see both interally and expose via
the lua function with the same name.
2025-04-01 06:37:12 -07:00
Wez Furlong ee52558f67 docs: format example in configure_resolver.md 2025-03-28 14:35:16 -07:00
Wez Furlong c07a595170 inspect-sched-q/inspect-message: include scheduling info
This is a quick and dirty export of the scheduling data from
the message and into the MessageInformation type that describes it.
2025-03-28 14:34:48 -07:00
Ryan Bonnell 8d5a604d4e Fix typo in name of new "Delayed" log record type 2025-03-26 05:15:45 -07:00
Wez Furlong 9d84a04d48 docs: note about hickory resolveropts schema change 2025-03-25 12:54:33 -07:00
Wez Furlong 0534d888bb docs: redis: clarify the redis URL syntax that we support 2025-03-24 07:13:35 -07:00
Wez Furlong e422f56b5c smtp_server: add smtp_server_get_dynamic_parameters event
This helps to deploy IP-based virtual service.
2025-03-23 08:24:28 -07:00
Wez Furlong 6c49d51ee7 smtp_server: add smtp_server_connection_accepted event 2025-03-23 07:15:45 -07:00
Wez Furlong 8253417576 smtp_server: add meta parameter to start_esmtp_listener
This allows pre-defining connection metadata values.  When coupled with
`peer` and/or `via`, these can be done based on the corresponding
addresses associated with the session.

closes: https://github.com/KumoCorp/kumomta/issues/355
2025-03-22 11:13:22 -07:00
Wez Furlong a7c98a7d0f smtp_server: add via matching parameter to start_esmtp_listener
Similar to the peer option, but this one matches based on the
local address, giving a bit more flexibility for virtual hosting.
2025-03-22 11:07:19 -07:00
Wez Furlong 3e9bc5a946 smtp_server: introduce new peer matching option to start_esmtp_listener
This allows crafting peer-address-specific values for a listener.
2025-03-22 10:35:42 -07:00
Wez Furlong 9de685aa54 smtp_server: refactor tls_config
The motivation here is to remove tls_config from EsmtpListenerParams
to make some future configuration changes easier, so this commit
moves that simple cache out to an explicit lru ttl cache.

This has the welcome side effect of enabling periodic reloading
of the tls parameters, which in turn makes it a hands-off process
for updating certificates: we no longer require the service to
be restarted for that.
2025-03-22 09:18:38 -07:00
Wez Furlong 19341dc710 lruttl: add params to control timeout and retry on sema timeout
These are hooked up only for memoize at this time.  No default
behavior is changed by this commit, but you can optionally
specify these parameters in order to change the behavior.
2025-03-21 16:56:12 -07:00
Wez Furlong 337b4e33a8 docs: update for stable 2025.03.19-1d3f1f67 release 2025-03-20 07:28:32 -07:00
Wez Furlong 98e99594d9 shaping: process tsa websocket pushes in batches
We'll wait up to 3s at a time for however many mesages are available
to extract from the tsa daemon websocket, then process the results
in batches.

This avoids the potential for geometric complexity if there is a run of
subscription updates happening around the same time.
2025-03-18 14:05:30 -07:00
Wez Furlong 9e6321ecb6 shaping: add timeout for tsa shaping data fetches 2025-03-18 14:05:30 -07:00
Wez Furlong 6d17a0a453 docs: mention mta-sts and dane on the enable_tls page 2025-03-17 08:52:10 -07:00
Wez Furlong c2444b6266 add expiry to per-msg scheduling overrides
This commit allows setting a per-message `expires` timestamp
via msg:set_scheduling (and thus msg:import_scheduling_header).

The expiration takes precedence over max_age; max_age will be
ignored for messages that have configured and expiration time.

The expiration time is independent of the other scheduling
restrictions.
2025-03-15 07:18:13 -07:00
Wez Furlong 9286394e72 docs: fixup list bullets for source_selection_rate 2025-03-11 09:54:14 -07:00
Wez Furlong 6ef73a096e docs for source_selection_rate 2025-03-11 09:46:58 -07:00
Wez Furlong 0fe856516c add kumo.log_(error|info|warn|debug) functions
These log their arguments to the diagnostic log.
2025-03-06 17:15:15 -07:00
Wez Furlong 85b922d40b add kumo.set_lruttl_cache_capacity function
This allows configuring the capacity limit for internal caches.
2025-03-05 08:50:11 -07:00
Wez Furlong b2887cb7b8 data_processing_timeout: increase default to 5 minutes
I worry that 1 minute might be too short to be universally good,
particularly as a change in behavior from an earlier build: going from
no timeout to 1 minute could be super surprising and un-welcome.

Let's bump this up to 5 minutes which more closely matches the
default for DATA in the base SMTP RFC.
2025-03-04 16:23:16 -07:00
Wez Furlong fa1857be98 docs: add data_processing_timeout 2025-03-04 16:23:15 -07:00
Wez Furlong c5014f9594 docs: add some rocksdb tuning options to the docs 2025-03-04 16:23:14 -07:00
Wez Furlong df8aa10ad1 docs: split define_spool docs into separate pages 2025-03-04 16:23:14 -07:00
Ryan Bonnell c91b978ea3 Fix misspelling of word 'parameter' 2025-02-28 08:40:07 -08:00
Wez Furlong 9ba637ab38 dns-resolver: add negative caching for MX lookup failures
This is why slow DNS often expanded to 3-4x as long as the expected
timeout value; we make a handful of calls in succession, assuming
that the cache was effective in an earlier stage.

We now cache errors for 5 minutes by default, and it can be configured
as desired.

refs: https://github.com/KumoCorp/kumomta/issues/325
2025-02-27 15:55:37 -07:00
Wez Furlong f363445ceb add kumo.dns.set_mx_timeout and make it default to 5s
closes: https://github.com/KumoCorp/kumomta/issues/325
2025-02-27 05:54:26 -07:00
Wez Furlong 3071fe9701 add shrink_policy queue config option
This allows reducing how much of a message is freed when it is
delayed.
2025-02-21 17:15:52 -07:00
Wez Furlong 3805afdcc1 docs: fixup list presentation for (low|no)_memory_reduction_policy 2025-02-21 14:32:36 -07:00
Wez Furlong a1fb96dfc0 add (low|no)_memory_reduction_policy options
These provide more control over the memory vs spool IO tradeoff
when memory is short.
2025-02-21 10:48:14 -07:00
Wez Furlong 7cf6b93783 memory: allow setting soft and low memory limit/thresholds
If you have a lot of RAM, using only default percentages could
potentially leave some RAM unused.  These lua functions
allow more precise control over the limits.
2025-02-20 12:06:12 -07:00
Wez Furlong 1ce8239dd9 add kumo.string.eval_template function 2025-02-20 08:52:04 -07:00