From: Timo Sirainen Date: Sun, 5 Dec 2010 21:05:40 +0000 (+0000) Subject: maildir: maildir_uidlist_lookup() -> maildir_sync_lookup() refactoring. X-Git-Tag: 2.1.alpha1~468 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6013fbad6638795a00e6c2a2dd2cdbee19612494;p=thirdparty%2Fdovecot%2Fcore.git maildir: maildir_uidlist_lookup() -> maildir_sync_lookup() refactoring. --- diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 7378dcd80d..7471d00586 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -188,7 +188,7 @@ maildir_mail_get_fname(struct maildir_mailbox *mbox, struct mail *mail, bool exists; int ret; - ret = maildir_uidlist_lookup(mbox->uidlist, mail->uid, &flags, fname_r); + ret = maildir_sync_lookup(mbox, mail->uid, &flags, fname_r); if (ret != 0) return ret; @@ -588,8 +588,7 @@ static void maildir_mail_set_cache_corrupted(struct mail *_mail, if (field == MAIL_FETCH_VIRTUAL_SIZE) { /* make sure it gets removed from uidlist. if it's in file name, we can't really do more than log it. */ - ret = maildir_uidlist_lookup(mbox->uidlist, _mail->uid, - &flags, &fname); + ret = maildir_sync_lookup(mbox, _mail->uid, &flags, &fname); if (ret <= 0) return; if (maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE, diff --git a/src/lib-storage/index/maildir/maildir-sync.c b/src/lib-storage/index/maildir/maildir-sync.c index 0a7b224ae8..abfc14968f 100644 --- a/src/lib-storage/index/maildir/maildir-sync.c +++ b/src/lib-storage/index/maildir/maildir-sync.c @@ -881,8 +881,8 @@ static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced, } if (find_uid != NULL && *find_uid != 0) { - ret = maildir_uidlist_lookup_nosync(ctx->mbox->uidlist, - *find_uid, &flags, &fname); + ret = maildir_uidlist_lookup(ctx->mbox->uidlist, + *find_uid, &flags, &fname); if (ret < 0) return -1; if (ret == 0) { @@ -897,6 +897,35 @@ static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced, return maildir_uidlist_sync_deinit(&ctx->uidlist_sync_ctx, TRUE); } +int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid, + enum maildir_uidlist_rec_flag *flags_r, + const char **fname_r) +{ + int ret; + + ret = maildir_uidlist_lookup(mbox->uidlist, uid, flags_r, fname_r); + if (ret <= 0) { + if (ret < 0) + return -1; + if (maildir_uidlist_is_open(mbox->uidlist)) { + /* refresh uidlist and check again in case it was added + after the last mailbox sync */ + if (maildir_uidlist_refresh(mbox->uidlist) < 0) + return -1; + } else { + /* the uidlist doesn't exist. */ + if (maildir_storage_sync_force(mbox, uid) < 0) + return -1; + } + + /* try again */ + ret = maildir_uidlist_lookup(mbox->uidlist, uid, + flags_r, fname_r); + } + + return ret; +} + int maildir_storage_sync_force(struct maildir_mailbox *mbox, uint32_t uid) { struct maildir_sync_context *ctx; diff --git a/src/lib-storage/index/maildir/maildir-sync.h b/src/lib-storage/index/maildir/maildir-sync.h index a9d6c8a27f..83217fc461 100644 --- a/src/lib-storage/index/maildir/maildir-sync.h +++ b/src/lib-storage/index/maildir/maildir-sync.h @@ -42,6 +42,10 @@ void maildir_sync_notify(struct maildir_sync_context *ctx); void maildir_sync_set_new_msgs_count(struct maildir_index_sync_context *ctx, unsigned int count); +int maildir_sync_lookup(struct maildir_mailbox *mbox, uint32_t uid, + enum maildir_uidlist_rec_flag *flags_r, + const char **fname_r); + int maildir_list_index_has_changed(struct mailbox *box, struct mail_index_view *list_view, uint32_t seq); diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index 3e69b3eebb..f113af64a1 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -36,7 +36,6 @@ #include "nfs-workarounds.h" #include "eacces-error.h" #include "maildir-storage.h" -#include "maildir-sync.h" #include "maildir-filename.h" #include "maildir-uidlist.h" @@ -232,6 +231,11 @@ bool maildir_uidlist_is_read(struct maildir_uidlist *uidlist) return uidlist->initial_read; } +bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist) +{ + return uidlist->fd != -1; +} + void maildir_uidlist_unlock(struct maildir_uidlist *uidlist) { i_assert(uidlist->lock_count > 0); @@ -1027,35 +1031,6 @@ maildir_uidlist_lookup_rec(struct maildir_uidlist *uidlist, uint32_t uid, int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid, enum maildir_uidlist_rec_flag *flags_r, const char **fname_r) -{ - int ret; - - ret = maildir_uidlist_lookup_nosync(uidlist, uid, flags_r, fname_r); - if (ret <= 0) { - if (ret < 0) - return -1; - if (uidlist->fd != -1 || uidlist->mbox == NULL) { - /* refresh uidlist and check again in case it was added - after the last mailbox sync */ - if (maildir_uidlist_refresh(uidlist) < 0) - return -1; - } else { - /* the uidlist doesn't exist. */ - if (maildir_storage_sync_force(uidlist->mbox, uid) < 0) - return -1; - } - - /* try again */ - ret = maildir_uidlist_lookup_nosync(uidlist, uid, - flags_r, fname_r); - } - - return ret; -} - -int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid, - enum maildir_uidlist_rec_flag *flags_r, - const char **fname_r) { struct maildir_uidlist_rec *rec; int ret; diff --git a/src/lib-storage/index/maildir/maildir-uidlist.h b/src/lib-storage/index/maildir/maildir-uidlist.h index 614a5e2822..19d66b914e 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.h +++ b/src/lib-storage/index/maildir/maildir-uidlist.h @@ -56,6 +56,8 @@ int maildir_uidlist_lock_touch(struct maildir_uidlist *uidlist); void maildir_uidlist_unlock(struct maildir_uidlist *uidlist); bool maildir_uidlist_is_locked(struct maildir_uidlist *uidlist); bool maildir_uidlist_is_read(struct maildir_uidlist *uidlist); +/* Returns TRUE if uidlist file is currently open */ +bool maildir_uidlist_is_open(struct maildir_uidlist *uidlist); struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox); void maildir_uidlist_deinit(struct maildir_uidlist **uidlist); @@ -73,9 +75,6 @@ int maildir_uidlist_refresh_fast_init(struct maildir_uidlist *uidlist); int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid, enum maildir_uidlist_rec_flag *flags_r, const char **fname_r); -int maildir_uidlist_lookup_nosync(struct maildir_uidlist *uidlist, uint32_t uid, - enum maildir_uidlist_rec_flag *flags_r, - const char **fname_r); /* Returns extension's value or NULL if it doesn't exist. */ const char * maildir_uidlist_lookup_ext(struct maildir_uidlist *uidlist, uint32_t uid, diff --git a/src/lib-storage/index/maildir/maildir-util.c b/src/lib-storage/index/maildir/maildir-util.c index a17e41a616..685d95c8b9 100644 --- a/src/lib-storage/index/maildir/maildir-util.c +++ b/src/lib-storage/index/maildir/maildir-util.c @@ -61,7 +61,7 @@ static int maildir_file_do_try(struct maildir_mailbox *mbox, uint32_t uid, bool have_flags; int ret; - ret = maildir_uidlist_lookup(mbox->uidlist, uid, &flags, &fname); + ret = maildir_sync_lookup(mbox, uid, &flags, &fname); if (ret <= 0) return ret == 0 ? -2 : -1;