dovecot-2.1: mailbox list indexes: Error handling fixes.

dovecot at dovecot.org dovecot at dovecot.org
Sun Oct 2 17:40:02 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/75679aca405a
changeset: 13589:75679aca405a
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Oct 02 17:48:23 2011 +0300
description:
mailbox list indexes: Error handling fixes.

diffstat:

 src/lib-storage/list/mailbox-list-index-status.c |  12 ++++++++----
 src/lib-storage/list/mailbox-list-index-sync.c   |  19 ++++++++++---------
 src/lib-storage/list/mailbox-list-index.c        |  18 ++++++++++++++----
 src/lib-storage/list/mailbox-list-index.h        |   5 +++--
 4 files changed, 35 insertions(+), 19 deletions(-)

diffs (157 lines):

diff -r 940ddec22822 -r 75679aca405a src/lib-storage/list/mailbox-list-index-status.c
--- a/src/lib-storage/list/mailbox-list-index-status.c	Sun Oct 02 17:34:49 2011 +0300
+++ b/src/lib-storage/list/mailbox-list-index-status.c	Sun Oct 02 17:48:23 2011 +0300
@@ -21,8 +21,8 @@
 				  &mail_storage_module_register);
 
 static int
-index_list_mailbox_open_view(struct mailbox *box,
-			     struct mail_index_view **view_r, uint32_t *seq_r)
+index_list_open_view(struct mailbox *box, struct mail_index_view **view_r,
+		     uint32_t *seq_r)
 {
 	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list);
 	struct mailbox_list_index_node *node;
@@ -126,7 +126,7 @@
 
 	memset(status_r, 0, sizeof(*status_r));
 
-	ret = index_list_mailbox_open_view(box, &view, &seq);
+	ret = index_list_open_view(box, &view, &seq);
 	if (ret <= 0)
 		return ret;
 
@@ -235,7 +235,11 @@
 	if (box->v.list_index_update_sync != NULL)
 		box->v.list_index_update_sync(box, trans, seq);
 
-	return mail_index_transaction_commit_full(&trans, &result);
+	if (mail_index_transaction_commit_full(&trans, &result) < 0) {
+		mailbox_list_index_set_index_error(box->list);
+		return -1;
+	}
+	return 0;
 }
 
 static void
diff -r 940ddec22822 -r 75679aca405a src/lib-storage/list/mailbox-list-index-sync.c
--- a/src/lib-storage/list/mailbox-list-index-sync.c	Sun Oct 02 17:34:49 2011 +0300
+++ b/src/lib-storage/list/mailbox-list-index-sync.c	Sun Oct 02 17:48:23 2011 +0300
@@ -227,7 +227,6 @@
 	const char *patterns[2];
 	enum mailbox_list_index_flags flags;
 	uint32_t seq, orig_highest_name_id;
-	int ret = 0;
 
 	mailbox_list_index_reset(ilist);
 
@@ -236,10 +235,11 @@
 	sync_ctx.sep[0] = mailbox_list_get_hierarchy_sep(list);
 	if (mail_index_sync_begin(ilist->index, &sync_ctx.sync_ctx,
 				  &sync_ctx.view, &sync_ctx.trans,
-				  MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES) < 0)
+				  MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES) < 0) {
+		mailbox_list_index_set_index_error(list);
 		return -1;
-
-	if (mailbox_list_index_read(ilist, sync_ctx.view, TRUE) < 0) {
+	}
+	if (mailbox_list_index_parse(ilist, sync_ctx.view, TRUE) < 0) {
 		mail_index_sync_rollback(&sync_ctx.sync_ctx);
 		return -1;
 	}
@@ -280,10 +280,7 @@
 		mail_index_update_flags(sync_ctx.trans, seq,
 					MODIFY_REPLACE, (enum mail_flags)flags);
 	}
-	if (ilist->module_ctx.super.iter_deinit(iter) < 0)
-		ret = -1;
-
-	if (ret < 0) {
+	if (ilist->module_ctx.super.iter_deinit(iter) < 0) {
 		mail_index_sync_rollback(&sync_ctx.sync_ctx);
 		return -1;
 	}
@@ -304,5 +301,9 @@
 			&new_hdr.refresh_flag, sizeof(new_hdr.refresh_flag));
 	}
 
-	return mail_index_sync_commit(&sync_ctx.sync_ctx);
+	if (mail_index_sync_commit(&sync_ctx.sync_ctx) < 0) {
+		mailbox_list_index_set_index_error(list);
+		return -1;
+	}
+	return 0;
 }
diff -r 940ddec22822 -r 75679aca405a src/lib-storage/list/mailbox-list-index.c
--- a/src/lib-storage/list/mailbox-list-index.c	Sun Oct 02 17:34:49 2011 +0300
+++ b/src/lib-storage/list/mailbox-list-index.c	Sun Oct 02 17:48:23 2011 +0300
@@ -9,6 +9,14 @@
 struct mailbox_list_index_module mailbox_list_index_module =
 	MODULE_CONTEXT_INIT(&mailbox_list_module_register);
 
+void mailbox_list_index_set_index_error(struct mailbox_list *list)
+{
+	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list);
+
+	mailbox_list_set_internal_error(list);
+	mail_index_reset_error(ilist->index);
+}
+
 void mailbox_list_index_reset(struct mailbox_list_index *ilist)
 {
 	hash_table_clear(ilist->mailbox_names, FALSE);
@@ -158,8 +166,8 @@
 	return 0;
 }
 
-int mailbox_list_index_read(struct mailbox_list_index *ilist,
-			    struct mail_index_view *view, bool force)
+int mailbox_list_index_parse(struct mailbox_list_index *ilist,
+			     struct mail_index_view *view, bool force)
 {
 	const struct mail_index_header *hdr;
 	int ret;
@@ -211,8 +219,10 @@
 		return 0;
 	}
 
-	if (mail_index_refresh(ilist->index) < 0)
+	if (mail_index_refresh(ilist->index) < 0) {
+		mailbox_list_index_set_index_error(list);
 		return -1;
+	}
 
 	view = mail_index_view_open(ilist->index);
 	if (ilist->mailbox_tree == NULL ||
@@ -220,7 +230,7 @@
 		/* refresh list of mailboxes */
 		ret = mailbox_list_index_sync(list);
 	} else {
-		ret = mailbox_list_index_read(ilist, view, FALSE);
+		ret = mailbox_list_index_parse(ilist, view, FALSE);
 	}
 	mail_index_view_close(&view);
 	return ret;
diff -r 940ddec22822 -r 75679aca405a src/lib-storage/list/mailbox-list-index.h
--- a/src/lib-storage/list/mailbox-list-index.h	Sun Oct 02 17:34:49 2011 +0300
+++ b/src/lib-storage/list/mailbox-list-index.h	Sun Oct 02 17:48:23 2011 +0300
@@ -99,6 +99,7 @@
 extern MODULE_CONTEXT_DEFINE(mailbox_list_index_module,
 			     &mailbox_list_module_register);
 
+void mailbox_list_index_set_index_error(struct mailbox_list *list);
 struct mailbox_list_index_node *
 mailbox_list_index_lookup(struct mailbox_list *list, const char *name);
 
@@ -109,8 +110,8 @@
 mailbox_list_index_node_find_sibling(struct mailbox_list_index_node *node,
 				     const char *name);
 void mailbox_list_index_reset(struct mailbox_list_index *ilist);
-int mailbox_list_index_read(struct mailbox_list_index *ilist,
-			    struct mail_index_view *view, bool force);
+int mailbox_list_index_parse(struct mailbox_list_index *ilist,
+			     struct mail_index_view *view, bool force);
 int mailbox_list_index_sync(struct mailbox_list *list);
 
 struct mailbox_list_iterate_context *


More information about the dovecot-cvs mailing list