-
v0.46.1 Stable
released this
2026-08-25 16:34:05 -05:00 | 70 commits to main since this releaseThe alias index no longer costs a user-visible pause. It was 8.1 seconds on
the firstget_message_securityafter a restart, paid by whoever asked first.
Now it is ~1 second of work, and it happens before anyone asks.Fixed
-
The index asks the server for the relayed mail instead of reading the
archive. It swept all 4,602 messages because the alias is only visible in
headers — but the relay is visible toIMAP SEARCH, and
origin.resolvereturnsrelayedonly when the From domain is a trusted
relay. SoSEARCH FROMfolded overTRUSTED_RELAYSmatches exactly the
messages the sweep could learn from, and excludes only what it would have
discarded.Verified rather than assumed — both built on one connection, same moment:
messages read time index full sweep 4,602 7.5s 82 aliases, 102 pairs SEARCH FROM307 1.0s 82 aliases, 102 pairs Byte-identical.
resolvestill runs on every hit and is not redundant with
the search: SEARCH matched the relay's name,resolveis what verifies its
signature, and a message failing that must not enter the index.An intermediate version walked the archive newest-first and stopped after two
batches taught nothing — aliased mail is recent, all 258 relayed messages sit
inside the newest 1,000. It worked, and it is gone: it still read 2,000
messages for a 7.3s build, and it needed a heuristic about how far back to
walk that the search does not. -
The build runs at startup, in the background.
warm_alias_index()is
called from__main__after preflight, against the client that lives as long
as the process — not from__init__, where preflight and the tests would each
trigger their own. The build takes a lock, so a request arriving mid-build
waits for the one already running rather than starting a second.A zero
MAIL_ALIAS_INDEX_TTLstill switches the whole thing off, and now
starts no thread either.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-