From: Timo Sirainen Date: Thu, 20 Mar 2014 15:00:31 +0000 (+0200) Subject: imapc: Avoid hanging when running into server problems. X-Git-Tag: 2.2.13.rc1~197 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fda7b3649d2ccdb4a95f5bf09eb8cf5435d57261;p=thirdparty%2Fdovecot%2Fcore.git imapc: Avoid hanging when running into server problems. imapc_mail_fetch_flush() caused imail->fetch_count to drop to 0, but imapc_mailbox_run() still started imapc_client_run() which was doing nothing. --- diff --git a/src/lib-storage/index/imapc/imapc-mail-fetch.c b/src/lib-storage/index/imapc/imapc-mail-fetch.c index 8e3db34a78..db6158ceac 100644 --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c @@ -365,10 +365,11 @@ int imapc_mail_fetch(struct mail *_mail, enum mail_fetch_field fields, /* we'll continue waiting until we've got all the fields we wanted, or until all FETCH replies have been received (i.e. some FETCHes failed) */ + imapc_mail_fetch_flush(mbox); while (imail->fetch_count > 0 && (!imapc_mail_have_fields(imail, fields) || !imail->header_list_fetched)) - imapc_mailbox_run(mbox); + imapc_mailbox_run_nofetch(mbox); return 0; } diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index 60fc022425..153bad407a 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -357,8 +357,11 @@ static void imapc_mail_close(struct mail *_mail) struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box; struct imapc_mail_cache *cache = &mbox->prev_mail_cache; - while (mail->fetch_count > 0) - imapc_mailbox_run(mbox); + if (mail->fetch_count > 0) { + imapc_mail_fetch_flush(mbox); + while (mail->fetch_count > 0) + imapc_mailbox_run_nofetch(mbox); + } index_mail_close(_mail); diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 5879f74771..8bf578d58c 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -116,6 +116,11 @@ void imapc_simple_run(struct imapc_simple_context *sctx) void imapc_mailbox_run(struct imapc_mailbox *mbox) { imapc_mail_fetch_flush(mbox); + imapc_mailbox_run_nofetch(mbox); +} + +void imapc_mailbox_run_nofetch(struct imapc_mailbox *mbox) +{ do { imapc_client_run(mbox->storage->client->client); } while (mbox->storage->reopen_count > 0); diff --git a/src/lib-storage/index/imapc/imapc-storage.h b/src/lib-storage/index/imapc/imapc-storage.h index a91c483a9b..c4b6963e19 100644 --- a/src/lib-storage/index/imapc/imapc-storage.h +++ b/src/lib-storage/index/imapc/imapc-storage.h @@ -153,6 +153,7 @@ void imapc_transaction_save_commit_post(struct mail_save_context *ctx, void imapc_transaction_save_rollback(struct mail_save_context *ctx); void imapc_mailbox_run(struct imapc_mailbox *mbox); +void imapc_mailbox_run_nofetch(struct imapc_mailbox *mbox); void imapc_mail_cache_free(struct imapc_mail_cache *cache); int imapc_mailbox_select(struct imapc_mailbox *mbox);