Mercurial > dovecot > original-hg > dovecot-1.2
changeset 4396:208194b3742a HEAD
Handle transaction log deletions silently. Handle whole index directory
deletions silently (the most common cases anyway).
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 17 Jun 2006 16:42:37 +0300 |
parents | 3f9b7d2a7c60 |
children | 5cbabd4ccd9c |
files | src/lib-index/mail-index.c src/lib-index/mail-transaction-log.c |
diffstat | 2 files changed, 30 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index.c Sat Jun 17 16:03:27 2006 +0300 +++ b/src/lib-index/mail-index.c Sat Jun 17 16:42:37 2006 +0300 @@ -1702,8 +1702,8 @@ if (errno != ENOENT) return -1; - /* lost it? recreate */ - (void)mail_index_mark_corrupted(index); + /* lost it? recreate later */ + mail_index_mark_corrupted(index); return -1; }
--- a/src/lib-index/mail-transaction-log.c Sat Jun 17 16:03:27 2006 +0300 +++ b/src/lib-index/mail-transaction-log.c Sat Jun 17 16:42:37 2006 +0300 @@ -561,11 +561,25 @@ dev_t dev, ino_t ino, uoff_t file_size) { struct dotlock *dotlock; - mode_t old_mask; + struct stat st; + mode_t old_mask; int fd; i_assert(!MAIL_INDEX_IS_IN_MEMORY(log->index)); + if (stat(log->index->dir, &st) < 0) { + if (ENOTFOUND(errno)) { + /* the whole index directory was deleted, which means + the mailbox was deleted by another process. + fail silently. */ + mail_index_mark_corrupted(log->index); + return -1; + } + mail_index_file_set_syscall_error(log->index, log->index->dir, + "stat()"); + return -1; + } + /* With dotlocking we might already have path.lock created, so this filename has to be different. */ old_mask = umask(log->index->mode ^ 0666); @@ -921,15 +935,19 @@ path = t_strconcat(log->index->filepath, MAIL_TRANSACTION_LOG_SUFFIX, NULL); if (nfs_safe_stat(path, &st) < 0) { - mail_index_file_set_syscall_error(log->index, path, "stat()"); - return -1; - } - - if (log->head != NULL && - log->head->st_ino == st.st_ino && - CMP_DEV_T(log->head->st_dev, st.st_dev)) { - /* same file */ - return 0; + if (errno != ENOENT) { + mail_index_file_set_syscall_error(log->index, path, + "stat()"); + return -1; + } + /* log was deleted. just reopen/recreate it. */ + } else { + if (log->head != NULL && + log->head->st_ino == st.st_ino && + CMP_DEV_T(log->head->st_dev, st.st_dev)) { + /* same file */ + return 0; + } } file = create_if_needed ?