dovecot-2.2: imapc: Avoid hanging when running into server probl...

dovecot at dovecot.org dovecot at dovecot.org
Thu Mar 20 15:01:05 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/af7a606dc15c
changeset: 17166:af7a606dc15c
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Mar 20 17:00:31 2014 +0200
description:
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.

diffstat:

 src/lib-storage/index/imapc/imapc-mail-fetch.c |  3 ++-
 src/lib-storage/index/imapc/imapc-mail.c       |  7 +++++--
 src/lib-storage/index/imapc/imapc-storage.c    |  5 +++++
 src/lib-storage/index/imapc/imapc-storage.h    |  1 +
 4 files changed, 13 insertions(+), 3 deletions(-)

diffs (59 lines):

diff -r 610c79565959 -r af7a606dc15c src/lib-storage/index/imapc/imapc-mail-fetch.c
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Thu Mar 20 16:15:24 2014 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Thu Mar 20 17:00:31 2014 +0200
@@ -365,10 +365,11 @@
 	/* 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 -r 610c79565959 -r af7a606dc15c src/lib-storage/index/imapc/imapc-mail.c
--- a/src/lib-storage/index/imapc/imapc-mail.c	Thu Mar 20 16:15:24 2014 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Thu Mar 20 17:00:31 2014 +0200
@@ -357,8 +357,11 @@
 	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 -r 610c79565959 -r af7a606dc15c src/lib-storage/index/imapc/imapc-storage.c
--- a/src/lib-storage/index/imapc/imapc-storage.c	Thu Mar 20 16:15:24 2014 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Thu Mar 20 17:00:31 2014 +0200
@@ -116,6 +116,11 @@
 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 -r 610c79565959 -r af7a606dc15c src/lib-storage/index/imapc/imapc-storage.h
--- a/src/lib-storage/index/imapc/imapc-storage.h	Thu Mar 20 16:15:24 2014 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.h	Thu Mar 20 17:00:31 2014 +0200
@@ -153,6 +153,7 @@
 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);
 


More information about the dovecot-cvs mailing list