[Dovecot] nfs flush/fsync config settings problem

Troton_admin yebo at psg.sk
Wed Jan 8 10:23:35 EET 2014


Hi,

I need to place a maildir storage on a NFS filesystem, so I set up the config like this:

mmap_disable = yes
mail_nfs_storage = yes
mail_nfs_index = yes
mail_fsync = always
lock_method = dotlock (also tried fcntl - local lockd is running, no success, now using dotlock, to be sure while debugging)

The problem is that Dovecot (2.2.9/2.2.10 - the relevant code in mail-index.c is the same) logs a fatal error and quits the session (no daemon crash/coredump).

Jan 07 14:13:31 auth: Debug: client in: AUTH    1       PLAIN   service=pop3    session=fRCRJGHvbADDUKU9        lip=192.168.100.102     rip=IP_ADDR       lport=1110      rport=48236     resp=AHRyb3RvbjEAdHJvdG9uMQ== (previous base64 data may contain sensitive data)
Jan 07 14:13:31 auth: Debug: passwd-file(troton1,IP_ADDR,<fRCRJGHvbADDUKU9>): lookup: user=troton1 file=/usr/local/etc/dovecot/passwd-file
Jan 07 14:13:31 auth: Debug: client passdb out: OK      1       user=troton1
Jan 07 14:13:31 auth: Debug: master in: REQUEST 1289355265      29049   1       4f9fdd9e4069fa503e8e6bcc09d4cf30        session_pid=29089
Jan 07 14:13:31 auth: Debug: passwd-file(troton1,IP_ADDR,<fRCRJGHvbADDUKU9>): lookup: user=troton1 file=/usr/local/etc/dovecot/passwd-file
Jan 07 14:13:31 auth: Debug: master userdb out: USER    1289355265      troton1 uid=81  gid=81  home=/home/troton1      mail=maildir:~/Maildir
Jan 07 14:13:31 pop3-login: Info: Login: user=<troton1>, method=PLAIN, rip=IP_ADDR, lip=192.168.100.102, mpid=29089, session=<fRCRJGHvbADDUKU9>
Jan 07 14:13:31 pop3: Debug: Added userdb setting: mail=maildir:~/Maildir
Jan 07 14:13:31 pop3(troton1): Debug: Effective uid=81, gid=81, home=/home/troton1
Jan 07 14:13:31 pop3(troton1): Debug: Namespace inbox: type=private, prefix=, sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes location=maildir:~/Maildir
Jan 07 14:13:31 pop3(troton1): Debug: maildir++: root=/home/troton1/Maildir, index=, indexpvt=, control=, inbox=/home/troton1/Maildir, alt=
Jan 07 14:13:31 pop3(troton1): Info: DEBUG1: fsync_mode=2 , mask=0
Jan 07 14:13:31 pop3(troton1): Info: DEBUG2: fsync_mode=2 flags=85
Jan 07 14:13:31 pop3(troton1): Debug: Namespace : Using permissions from /home/troton1/Maildir: mode=0700 gid=default
Jan 07 14:13:31 pop3(troton1): Info: DEBUG2: fsync_mode=0 flags=85

The user/passdb is just a plaintext file, for debugging purposes.

But what is strange, the messages system log shows:
Jan  7 14:13:31 mailhub2 dovecot: pop3(troton1): Fatal: nfs flush requires mail_fsync=always

That is obviously wrong, even its own doveconf -n utility shows the correct value.

# doveconf -n | grep -E 'sync|nfs'
mail_fsync = always
mail_nfs_index = yes
mail_nfs_storage = yes
maildir_very_dirty_syncs = yes

Affected code seems to be in the lib-index/mail-index.c file, mail_index_file function - around line 585 :

	// my custom debug line
       i_info("DEBUG2: fsync_mode=%u flags=%u", (unsigned int)(index->fsync_mode),(unsigned int)flags);
 
        if ((flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0 &&
            index->fsync_mode != FSYNC_MODE_ALWAYS)
                i_fatal("nfs flush requires mail_fsync=always");

The first time it sees fsync_mode=2 (which is correct value of FSYNC_MODE_ALWAYS), but next function call is with index->fsync_mode=0 and an error is raised, see the logfile above.

Dovecot correctly creates its working files in user's home directory - dovecot-uidlist, dovecot-uidvalidity, dovecot-uidvalidity.52cbfd7b, dovecot.index.log .

The complete (testing, not production) doveconf -n is:
==
# 2.2.10: /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 7.3-RELEASE-p3 amd64  
auth_debug = yes
auth_debug_passwords = yes
auth_mechanisms = plain login
auth_verbose = yes
auth_verbose_passwords = sha1
default_process_limit = 200
disable_plaintext_auth = no
first_valid_uid = 81
imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
info_log_path = /var/log/dovecot.log
last_valid_uid = 81
listen = 192.168.100.102
lock_method = dotlock
mail_debug = yes
mail_fsync = always
mail_gid = 81
mail_location = maildir:%h/Maildir
mail_nfs_index = yes
mail_nfs_storage = yes
mail_prefetch_count = 5
mail_uid = 81
mailbox_list_index = yes
maildir_stat_dirs = yes
maildir_very_dirty_syncs = yes
mmap_disable = yes
namespace inbox {
  inbox = yes
  location = 
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = 
  separator = .
  type = private
}
passdb {
  args = scheme=plain username_format=%n /usr/local/etc/dovecot/passwd-file
  driver = passwd-file
}
plugin {
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
  mail_log_fields = uid box msgid subject size
}
pop3_enable_last = yes
pop3_save_uidl = yes
protocols = imap pop3
service doveadm {
  inet_listener {
    port = 9292
  }
}
service imap-login {
  inet_listener imap {
    port = 1143
  }
}
service imap {
  process_limit = 250
}
service pop3-login {
  inet_listener pop3 {
    port = 1110
  }
}
service pop3 {
  process_limit = 200
}
ssl = no
userdb {
  args = username_format=%n /usr/local/etc/dovecot/passwd-file
  default_fields = uid=81 gid=0 home=/home/%n
  driver = passwd-file
}
protocol imap {
  mail_max_userip_connections = 5
}
protocol pop3 {
  mail_max_userip_connections = 5
}
==
OS: 7.3-RELEASE-p3 FreeBSD 7.3-RELEASE-p3 #1 amd64
Affected Dovecot version: 2.2.9, 2.2.10
How to repeat: Anytime I enter the correct username/pass pair

And I tried to place the homedir on a local disk too, and I got the same error as on NFS.
Any ideas, what could possibly be wrong ?
Is it a feature or a bug ?

Thanks for your help.
Regards,
Troton


More information about the dovecot mailing list