]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Avoid hanging when running into server problems.
authorTimo Sirainen <tss@iki.fi>
Thu, 20 Mar 2014 15:00:31 +0000 (17:00 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 20 Mar 2014 15:00:31 +0000 (17:00 +0200)
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.

src/lib-storage/index/imapc/imapc-mail-fetch.c
src/lib-storage/index/imapc/imapc-mail.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/imapc/imapc-storage.h

index 8e3db34a7855eb670a9786bb0186dc6a92060d75..db6158ceac1906aa9592a2b16646be6385d78892 100644 (file)
@@ -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;
 }
 
index 60fc022425a97e447f1bb83c741d3307dedf92aa..153bad407ac26d07c4c4a1cb19449c964dba6a45 100644 (file)
@@ -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);
 
index 5879f7477152b821b1ff122b00e295a8562c0f44..8bf578d58ce252c425d48f7599b0625cb7bdd4fc 100644 (file)
@@ -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);
index a91c483a9b73c1faffaf0ca0d9544b86429f7e3d..c4b6963e190fb7a388af61fa9080397e0edb1ba3 100644 (file)
@@ -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);