[dovecot] Architectural questions

Thomas Wouters thomas at xs4all.net
Sat Oct 19 15:38:46 EEST 2002


Greetings,

I have some architectural questions regarding dovecot, and though I've half
answered them by looking at the source, I'm also interested in hearing
whether my (our) wishes and suggestions are already being considered (or can
be considered, once built) for inclusion in dovecot itself.

Let me first explain why I'm doing this. I work for XS4ALL, a fairly large
ISP in the Netherlands. We provide a wide variety of services, including
shell access, pop3, webmail, et cetera. We use Sendmail on several clusters
of FreeBSD machines (loadbalanced using layer-4 ethernet switches) and
several NetApp Filers (dedicated NFS servers with fail-safe disk-arrays and
such) for backend. Several years ago (when we were a lot smaller) we noticed
the typical use of the mailboxes included leaving much old email on the
server, at least for a while, and that this is a bothersome thing when using
mbox mailboxes. (The mboxes basically have to be copied over whenever the
status of an email changes, leading to a lot of I/O.)

We briefly played with modifying sendmail and the pop server to avoid the
full copy in the common case (only status changes) by doing in-place edits
of a pre-generated Status line, as well as avoid full scanning of the mbox
file by creating special headers to mark the 'real' length of an email. It
worked, for a while, but it wasn't going to scale very well. So we switched
to maildir mailboxes for the mail spool. A modified mail.local (which we
need for other reasons as well) delivers in /var/spool/mail/u/s/username,
and mutt, uqwk, a modified pine and qmail's pop3 daemon read it from there.
Until last week our clients could choose to have mbox inboxes, to use with
'elm' or 'mail', but we decided to discontinue that support. Our new shell
servers, which are in test, don't have elm installed anymore anyway.

We still have support for mbox mailboxes in a user's homedirectory though,
by using procmail and such. So when we needed an IMAP server for use with
our webmail (based on SquirrelMail), we were forced to go with the UW-IMAP
server, with the maildir patch that's been scattered around the 'net. This
worked, for a while; we also use the maildir patch with pine after all.
However, the maildir patch is not very good. Not at all, even, and it only
seems to work by pure chance. Pine works for the average user who does not
get a lot of new mail while his pine is open or does not use procmail, and
fortunately a lot of the people that do get a lot of email use mutt, which
does work properly. The UW-IMAP server worked fine because SquirrelMail only
uses (used) a small subset of the available functionality. But that's
changing, as SquirrelMail gets actively developed, and we're also
considering other IMAP-based services. But we can't switch to Courier or
Cyrus because we need mbox support. And while looking for mbox patches for
either of those two, I ran across dovecot. Yay! :)

Dovecot is not everything we'd want, but it comes very close, and contrary
to UW-IMAP both the design and the actual source code are clean, readable
and logical, which means we can add the features we need and support them.
What we need and want to add is fairly simple, but I've only been looking at
dovecot since yesterday so I'd be happy to hear if any of it is possible,
feasible, unwise or unacceptable.

 - First off, we need the maildir support to be 'correct' in that it does
   not rely on the naming of the files in the mailbox, other than the very
   loose specification DJB gives (doesn't contain a colon or slash and
   doesn't start with a dot.) The pine/UW-imap patch breaks here because it
   depends on the first part of the filename being time() or something else
   that, when sorted alphanumerically, puts new mail at the end. Our
   LDA does this, but procmail does not, and it shouldn't have to.

 - Second, we need the maildir support to be 'correct' in that it does not
   rely on the directory order being persistant. The NetApp Filers use
   btree-indexed directories, so the order of readdir() can change
   completely whenever a file is added or removed. The pine/uw-imap patch
   relies on the '.uidvalidity' file being modified whenever the maildir sort
   order changed, and this isn't happening.

I *think*, from reading the sources, both of those are correct already. If
they aren't, I'd strongly urge you to fix it, as #1 is a problem for anyone
using procmail and #2 is a problem for anyone with 'indexed' directories
(including such new filesystems as reiserfs, and I assume FreeBSD's new
hashed directories.)

 - We need to avoid using fcntl(). The Netapps support it, but file-locking
   over NFS is very, very poorly designed and we've had too much problems of
   various kinds before, with fcntl. We also don't like the idea of having
   thousands of fcntl locks at the same time ;P Instead, we've switched to
   the locking method described in the Linux open(2) manpage under O_EXCL.
   (We call it 'dot-locking', I'm not sure where the name came from.)

   The actual implementation of that method is pretty simple, and I have a C
   version and a Python version hanging around here somewhere (the Python
   version is being used by GNU Mailman, last I looked.) If we're going to
   use dovecot, we will replace most, if not all, fcntl()s with dot-locking,
   the question is whether you want it contributed to dovecot :)

 - Every user's incoming mailbox is /var/spool/u/s/username. Other mailboxes
   are in /home/u/username/mail or /home/u/username/Mail (the second if the
   first does not exist.) We are not yet certain whether we want the inbox
   to be able to have subdir-mailboxes, as /var/spool and /home have
   different quotas and we urge people not to store their mail on
   /var/spool. (for one thing, it doesn't get backed-up.) We want these
   things to work without magical symlinks or empty files, because people
   _will_ delete them and cause unnecessary helpdesk calls :) Again, the
   question is mostly whether this is desirable in dovecot (or something
   enough like it to reduce local changes.)

 - We have over 300k mailboxes at the moment. We expect that number to keep
   growing. The indexer process (as described by design.txt) does not sound
   as a good idea in our case :) How necessary is it, really ? Especially
   since we do not expect more than 10% of those mailboxes to be actually
   used by IMAP, not even once. If disabling the indexer completely just
   means longer startup times for IMAP sessions, we can live with that.

 - The UW-IMAP maildir patch stores UID's in the indiviual filenames, using
   a 'U' flag. Will this interfere with dovecot ? We don't really need
   dovecot and UW-IMAP to share UIDs, but we would like to have an as
   painless transition as possible, without having to rename millions of
   files to remove the U flag and other flags :P It would also be nice to
   keep pine using the existing maildir patch, even though very few
   IMAP-users would use pine.

 - Would dovecot scale, architecturally speaking, to 500k+ active mailboxes ?
   The amount of hardware is not really an issue, we can add a lot of
   machines (off-the-shelve intel hadware) to each cluster, but if each
   dovecot process has to load in an index of all possible mailboxes... that
   would be a problem. Doing an inordinate number of file-accesses over NFS
   would also be a problem, but I haven't seen any indication of that in the
   source, yet.

In case it wasn't clear yet, I'm very happy to have found dovecot. The lack
of a decent mbox IMAP server has always dismayed me, let alone an
mbox+maildir one :) I should also point out that even though XS4ALL is a
commercial company, we would contribute our changes even if the licence
didn't require it, and we want to contribute them back the way you want
them, not necessarily the way it's easiest for us. We have a lot of
experience with opensource software, as a simple google on my name should
indicate ;P

Regards,
-- 
Thomas Wouters <thomas at xs4all.net>

Hi! I'm a .signature virus! copy me into your .signature file to help me spread!



More information about the dovecot mailing list