Fatal error: failed to mmap cache file

Diesen Beitrag schrieb ich 14 Jahre und 7 Monate zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 1 Minute

Es ist zum Auswachsen: auf einem OpenExchange-Setup, das sich auf cyrus-imapd und postfix stützt und das lange, sehr lange einfach vor sich hin funktioniert hat, erscheinen plötzlich nachfolgende Meldungen im Log:

Nov 10 11:44:09 ox imap[26765]: login: localhost [127.0.0.1] spillerm plaintext User logged in
Nov 10 11:44:09 ox imap[26740]: accepted connection
Nov 10 11:44:09 ox imap[26740]: login: localhost [127.0.0.1] spillerm plaintext User logged in
Nov 10 11:44:09 ox imap[26740]: IOERROR: mapping cache file for user.spillerm: Cannot allocate memory
Nov 10 11:44:09 ox imap[26750]: accepted connection
Nov 10 11:44:09 ox master[26850]: about to exec /usr/lib/cyrus-imapd/imapd
Nov 10 11:44:09 ox imap[26740]: Fatal error: failed to mmap cache file
Nov 10 11:44:09 ox master[32168]: process 26740 exited, status 75
Nov 10 11:44:09 ox master[32168]: service imap pid 26740 in BUSY state: terminated abnormally
Nov 10 11:44:09 ox imap[26850]: executed

Also in erster Instanz herausfinden, wo cyrus seinen Kram ablegt (falls man das nicht ohnehin weiß):

$ grep partition-default /etc/imapd.conf
partition-default: /var/spool/imap

Dann schauen wir uns mal an, wie gross das Cache-File des Users tatsächlich ist:

$ cd /var/spool/imap/s/user/spillerm
$ du -h cyrus.cache 
2.1G	cyrus.cache

Okay, das ist zu viel – selbst in Mailboxen mit hunderten Mails erreicht das File nicht eine solche Größe (wenn alles so läuft wie es soll)… Wie also Abhilfe schaffen?

  • cyrus stoppen
    $ /etc/init.d/cyrus-imapd stop
    
  • cyrus.cache dieses Users löschen; am Beispiel des Users spillerm könnte das beispielsweise so aussehen:
    $ rm /var/spool/imap/s/user/spillerm/cyrus.cache
    
  • Mailbox des Users rekonstruieren
    $ reconstruct -rf user.spillerm
    

Ist in /etc/imapd.conf allerdings unixhierarchysep: yes gesetzt, muss der Aufruf etwas modifiziert ausgeführt werden:

$ reconstruct -rf user/spillerm

Dadurch wird, unter anderem, cyrus.cache neu erzeugt. Der Dienst kann nun wieder gestartet werden.

$ /etc/init.d/cyrus-imapd start

Hat den Fehler nachhaltig behoben :)