Mercurial > dovecot > core-2.2
changeset 2724:0b4d8354737a HEAD
Don't lock/unlock mbox separately for each message. Drop the lock only at
the end of the transaction.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 10 Oct 2004 20:44:54 +0300 |
parents | 12b503fbb8af |
children | ccd07e584938 |
files | src/lib-storage/index/index-storage.h src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/mbox/mbox-storage.c src/lib-storage/index/mbox/mbox-transaction.c |
diffstat | 4 files changed, 12 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.h Sun Oct 10 20:25:44 2004 +0300 +++ b/src/lib-storage/index/index-storage.h Sun Oct 10 20:44:54 2004 +0300 @@ -78,7 +78,7 @@ ino_t mbox_ino; unsigned int mbox_excl_locks, mbox_shared_locks; struct dotlock mbox_dotlock; - unsigned int mbox_lock_id, mbox_mail_lock_id; + unsigned int mbox_lock_id; int mbox_readonly; time_t mbox_dirty_stamp; off_t mbox_dirty_size;
--- a/src/lib-storage/index/mbox/mbox-mail.c Sun Oct 10 20:25:44 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-mail.c Sun Oct 10 20:44:54 2004 +0300 @@ -16,6 +16,8 @@ static int mbox_mail_seek(struct index_mail *mail) { + struct mbox_transaction_context *t = + (struct mbox_transaction_context *)mail->trans; struct index_mailbox *ibox = mail->ibox; enum mbox_sync_flags sync_flags = 0; int ret, deleted; @@ -30,7 +32,7 @@ return -1; i_assert(ibox->mbox_lock_type != F_UNLCK); - ibox->mbox_mail_lock_id = ibox->mbox_lock_id; + t->mbox_lock_id = ibox->mbox_lock_id; } if (mbox_file_open_stream(ibox) < 0) @@ -49,8 +51,8 @@ if (ret == 0) { /* we'll need to re-sync it completely */ if (ibox->mbox_lock_type == F_RDLCK) { - if (ibox->mbox_mail_lock_id == ibox->mbox_lock_id) - ibox->mbox_mail_lock_id = 0; + if (ibox->mbox_lock_id == t->mbox_lock_id) + t->mbox_lock_id = 0; (void)mbox_unlock(mail->ibox, ibox->mbox_lock_id); ibox->mbox_lock_id = 0; i_assert(ibox->mbox_lock_type == F_UNLCK);
--- a/src/lib-storage/index/mbox/mbox-storage.c Sun Oct 10 20:25:44 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-storage.c Sun Oct 10 20:44:54 2004 +0300 @@ -365,14 +365,6 @@ return t_strconcat(storage->dir, "/", name, NULL); } -static void mbox_mail_deinit(struct index_mail *mail) -{ - if (mail->ibox->mbox_mail_lock_id != 0) { - (void)mbox_unlock(mail->ibox, mail->ibox->mbox_mail_lock_id); - mail->ibox->mbox_mail_lock_id = 0; - } -} - static int mbox_mail_is_recent(struct index_mailbox *ibox __attr_unused__, uint32_t uid __attr_unused__) { @@ -416,7 +408,6 @@ ibox->mbox_lock_type = F_UNLCK; ibox->mbox_ext_idx = mbox_ext_idx; - ibox->mail_deinit = mbox_mail_deinit; ibox->is_recent = mbox_mail_is_recent; ibox->mail_interface = &mbox_mail; ibox->mbox_do_dirty_syncs = getenv("MBOX_DIRTY_SYNCS") != NULL;
--- a/src/lib-storage/index/mbox/mbox-transaction.c Sun Oct 10 20:25:44 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-transaction.c Sun Oct 10 20:44:54 2004 +0300 @@ -37,6 +37,12 @@ } t = NULL; + if (lock_id != 0 && ibox->mbox_lock_type != F_WRLCK) { + /* unlock before writing any changes */ + (void)mbox_unlock(ibox, lock_id); + lock_id = 0; + } + if (ret == 0) { enum mbox_sync_flags mbox_sync_flags = MBOX_SYNC_LAST_COMMIT; if ((flags & MAILBOX_SYNC_FLAG_FULL_READ) != 0)