I realized that my last message about locking gave bad information -- or rather, very little information.
Here's my setup:
Home directories and user login information are located on an Xserve running Mac OS X 10.2.6. Home directories are split between 2 different directories -- /Users and /Students. Home dirs are exported via NFS to the mail server. User login info is shared via LDAP to the mail server and to Windows machines in classrooms.
The mail server is an old beige G3 running Debian Woody (linux 2.4.20) kernel. It's completely up-to-date. Homedirs are mounted at /Network/Servers/network.uphamscornercs.net/Users and /Network/Servers/network.uphamscornercs.net/Students, in keeping with the OS X Server userdir name scheme. The only user with a shell on the server is root, other than that all user information is pulled from LDAP using PAM.
Postfix is setup to deliver mail to maildir:~/Maildir, and dovecot is set to read mail from the same directory. This is working without any problem.
- Clients Entourage works fine to access mailboxes -- it reads mail without a problem. However, it pops up an error message intermittently that reads "Mail could not be read: Internal Error [<datestamp>]". This message doesn't seem to interfere with reading mail, it's just an annoyance.
Squirrelmail doesn't work to access mailboxes. It logs in fine, but gives the following error message in all windows that require mailbox access: "ERROR : Could not complete request. Query: <imap query string> Reason Given: Internal error [<datestamp>]"
In both cases (Entourage and Squirrelmail), the Internal Error is accompanied by the following error message in the /var/log/mail.log file: "imap(marlier): Sep 16 08:40:45 dovecot:Error: /Network/Servers/network.uphamscornercs.net/Users/marlier/Maildir/.subscript ions failed with subscription file file_wait_lock(): Invalid argument"
So, it looks to me like something isn't working with locking. I'm not sure whether the problem is with the NFS mount, or with dovecot, or with permissions, or something else, but I'd like to get it fixed. I love the server, and if I can get this licked I think I've got a long-term setup.
Relevant sections of /usr/local/etc/dovecot.conf:
# Use mmap() instead of read() to read mail files. read() seems to be a bit # faster with my Linux/x86 and it's better with NFS, so that's the default. mail_read_mmaped = no
# Copy mail to another folders using hard links. This is much faster than # actually copying the file. This is problematic only if something modifies # the mail in one folder but doesn't want it modified in the others. I don't # know any MUA which would modify mail files directly. IMAP protocol also # requires that the mails don't change, so it would be problematic in any case. # If you care about performance, enable it. maildir_copy_with_hardlinks = no
# Check if mails' content has been changed by external programs. This slows # down things as extra stat() needs to be called for each file. If changes are # noticed, the message is treated as a new message, since IMAP protocol # specifies that existing message are immutable. maildir_check_content_changes = yes
# Which locking methods to use for locking mbox. There's three available: # dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe # solution. If you want to use /var/mail/ like directory, the users # will need write access to that directory. # fcntl : Use this if possible. Works with NFS too if lockd is used. # flock : May not exist in all systems. Doesn't work with NFS. # # You can use both fcntl and flock too; if you do the order they're declared # with is important to avoid deadlocks if other MTAs/MUAs are using both fcntl # and flock. Some operating systems don't allow using both of them # simultaneously, eg. BSDs. If dotlock is used, it's always created first. mbox_locks = dotlock
# Should we create dotlock file even when we want only a read-lock? Setting # this to yes hurts the performance when the mailbox is accessed simultaneously # by multiple processes, but it's needed for reliable reading if no other # locking methods are available. mbox_read_dotlock = yes
# Maximum time in seconds to wait for lock (all of them) before aborting. mbox_lock_timeout = 300
# If dotlock exists but the mailbox isn't modified in any way, override the # lock file after this many seconds. mbox_dotlock_change_timeout = 30
# umask to use for mail files and directories umask = 0077
# Drop all privileges before exec()ing the mail process. This is mostly # meant for debugging, otherwise you don't get core dumps. Note that setting # this to yes means that log file is opened as the logged in user, which # might not work. It could also be a small security risk if you use single UID # for multiple users, as the users could ptrace() each others processes then. mail_drop_priv_before_exec = no
Thanks in advance for any help you can give.
- Ian