Mercurial > dovecot > core-2.2
changeset 12460:69efe4b2bc80
maildir: Log a warning if scanning new/ or cur/ takes over 60s.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 23 Nov 2010 16:23:31 +0000 |
parents | 94fd6fee57a1 |
children | ef24f74f32d7 |
files | src/lib-storage/index/maildir/maildir-sync-index.c src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/maildir/maildir-sync.h |
diffstat | 3 files changed, 19 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync-index.c Tue Nov 23 16:11:15 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-sync-index.c Tue Nov 23 16:23:31 2010 +0000 @@ -15,8 +15,6 @@ #include <stdlib.h> #include <unistd.h> -#define MAILDIR_SYNC_TIME_WARN_SECS 60 - struct maildir_index_sync_context { struct maildir_mailbox *mbox; struct maildir_sync_context *maildir_sync_ctx;
--- a/src/lib-storage/index/maildir/maildir-sync.c Tue Nov 23 16:11:15 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-sync.c Tue Nov 23 16:23:31 2010 +0000 @@ -363,8 +363,8 @@ struct dirent *dp; struct stat st; enum maildir_uidlist_rec_flag flags; - unsigned int i = 0, move_count = 0; - time_t now; + unsigned int time_diff, i, readdir_count = 0, move_count = 0; + time_t start_time; int ret = 1; bool move_new, dir_changed = FALSE; @@ -404,13 +404,13 @@ } #endif - now = time(NULL); + start_time = time(NULL); if (new_dir) { - ctx->mbox->maildir_hdr.new_check_time = now; + ctx->mbox->maildir_hdr.new_check_time = start_time; ctx->mbox->maildir_hdr.new_mtime = st.st_mtime; ctx->mbox->maildir_hdr.new_mtime_nsecs = ST_MTIME_NSEC(st); } else { - ctx->mbox->maildir_hdr.cur_check_time = now; + ctx->mbox->maildir_hdr.cur_check_time = start_time; ctx->mbox->maildir_hdr.cur_mtime = st.st_mtime; ctx->mbox->maildir_hdr.cur_mtime_nsecs = ST_MTIME_NSEC(st); } @@ -468,8 +468,8 @@ MAILDIR_UIDLIST_REC_FLAG_RECENT; } - i++; - if ((i % MAILDIR_SLOW_CHECK_COUNT) == 0) + readdir_count++; + if ((readdir_count % MAILDIR_SLOW_CHECK_COUNT) == 0) maildir_sync_notify(ctx); ret = maildir_uidlist_sync_next(ctx->uidlist_sync_ctx, @@ -510,23 +510,29 @@ if (dir_changed) { /* save the exact new times. the new mtimes should be >= - "now", but just in case something weird happens and mtime - doesn't update, use "now". */ + "start_time", but just in case something weird happens and + mtime doesn't update, use "start_time". */ if (stat(ctx->new_dir, &st) == 0) { ctx->mbox->maildir_hdr.new_check_time = - I_MAX(st.st_mtime, now); + I_MAX(st.st_mtime, start_time); ctx->mbox->maildir_hdr.new_mtime = st.st_mtime; ctx->mbox->maildir_hdr.new_mtime_nsecs = ST_MTIME_NSEC(st); } if (stat(ctx->cur_dir, &st) == 0) { ctx->mbox->maildir_hdr.new_check_time = - I_MAX(st.st_mtime, now); + I_MAX(st.st_mtime, start_time); ctx->mbox->maildir_hdr.cur_mtime = st.st_mtime; ctx->mbox->maildir_hdr.cur_mtime_nsecs = ST_MTIME_NSEC(st); } } + time_diff = time(NULL) - start_time; + if (time_diff >= MAILDIR_SYNC_TIME_WARN_SECS) { + i_warning("Maildir: Scanning %s took %u seconds " + "(%u readdir()s, %u rename()s to cur/)", + path, time_diff, readdir_count, move_count); + } return ret < 0 ? -1 : (move_count <= MAILDIR_RENAME_RESCAN_COUNT || final ? 0 : 1);
--- a/src/lib-storage/index/maildir/maildir-sync.h Tue Nov 23 16:11:15 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-sync.h Tue Nov 23 16:23:31 2010 +0000 @@ -11,6 +11,8 @@ /* readdir() should be pretty fast to do, but check anyway every n files to see if we need to touch the uidlist lock. */ #define MAILDIR_SLOW_CHECK_COUNT 10000 +/* If syncing takes longer than this, log a warning. */ +#define MAILDIR_SYNC_TIME_WARN_SECS 60 struct maildir_mailbox;