dovecot-2.2: lib-index: Fixed MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UP...

dovecot at dovecot.org dovecot at dovecot.org
Sun May 20 03:26:35 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/5d45870e2e4a
changeset: 14532:5d45870e2e4a
user:      Timo Sirainen <tss at iki.fi>
date:      Thu May 03 23:26:44 2012 +0300
description:
lib-index: Fixed MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES with concurrent keyword changes.
If session 1 saw keywords="a", session 2 added keyword "b" and session 1
(without the client syncing session) replaced flags with "a", the "b"
keyword wasn't removed.

diffstat:

 src/lib-index/mail-index-transaction-private.h     |   4 ++++
 src/lib-index/mail-index-transaction-update.c      |   2 +-
 src/lib-index/mail-index-transaction.c             |  17 +++++++++++++++++
 src/lib-index/test-mail-index-transaction-update.c |   6 ++++++
 4 files changed, 28 insertions(+), 1 deletions(-)

diffs (83 lines):

diff -r d5bbb1d203c5 -r 5d45870e2e4a src/lib-index/mail-index-transaction-private.h
--- a/src/lib-index/mail-index-transaction-private.h	Fri Apr 27 16:47:30 2012 +0900
+++ b/src/lib-index/mail-index-transaction-private.h	Thu May 03 23:26:44 2012 +0300
@@ -35,6 +35,7 @@
 	enum mail_index_transaction_flags flags;
 	struct mail_index_transaction_vfuncs v;
 	struct mail_index_view *view;
+	struct mail_index_view *latest_view;
 
 	/* NOTE: If you add anything new, remember to update
 	   mail_index_transaction_reset_v() to reset it. */
@@ -121,6 +122,9 @@
 					   unsigned int left_idx,
 					   unsigned int right_idx,
 					   uint32_t seq);
+void mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t,
+						   uint32_t seq,
+						   ARRAY_TYPE(keyword_indexes) *keywords);
 
 bool mail_index_cancel_flag_updates(struct mail_index_transaction *t,
 				    uint32_t seq);
diff -r d5bbb1d203c5 -r 5d45870e2e4a src/lib-index/mail-index-transaction-update.c
--- a/src/lib-index/mail-index-transaction-update.c	Fri Apr 27 16:47:30 2012 +0900
+++ b/src/lib-index/mail-index-transaction-update.c	Thu May 03 23:26:44 2012 +0300
@@ -977,7 +977,7 @@
 
 	t_array_init(&existing, 32);
 	if (seq < t->first_new_seq)
-		mail_index_lookup_keywords(t->view, seq, &existing);
+		mail_index_transaction_lookup_latest_keywords(t, seq, &existing);
 	existing_idx = array_get(&existing, &existing_count);
 
 	if (modify_type == MODIFY_REPLACE && existing_count != keywords->count)
diff -r d5bbb1d203c5 -r 5d45870e2e4a src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c	Fri Apr 27 16:47:30 2012 +0900
+++ b/src/lib-index/mail-index-transaction.c	Thu May 03 23:26:44 2012 +0300
@@ -52,6 +52,8 @@
 
 	array_free(&t->module_contexts);
 	mail_index_view_transaction_unref(t->view);
+	if (t->latest_view != NULL)
+		mail_index_view_close(&t->latest_view);
 	mail_index_view_close(&t->view);
 	i_free(t);
 }
@@ -89,6 +91,21 @@
 	return next_uid;
 }
 
+void mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t,
+						   uint32_t seq,
+						   ARRAY_TYPE(keyword_indexes) *keywords)
+{
+	uint32_t uid, latest_seq;
+
+	if (t->latest_view == NULL) {
+		(void)mail_index_refresh(t->view->index);
+		t->latest_view = mail_index_view_open(t->view->index);
+	}
+	mail_index_lookup_uid(t->view, seq, &uid);
+	if (mail_index_lookup_seq(t->view, uid, &latest_seq))
+		mail_index_lookup_keywords(t->view, latest_seq, keywords);
+}
+
 static int
 mail_transaction_log_file_refresh(struct mail_index_transaction *t,
 				  struct mail_transaction_log_append_ctx *ctx)
diff -r d5bbb1d203c5 -r 5d45870e2e4a src/lib-index/test-mail-index-transaction-update.c
--- a/src/lib-index/test-mail-index-transaction-update.c	Fri Apr 27 16:47:30 2012 +0900
+++ b/src/lib-index/test-mail-index-transaction-update.c	Thu May 03 23:26:44 2012 +0300
@@ -43,6 +43,12 @@
 	return hdr.messages_count;
 }
 
+void mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t ATTR_UNUSED,
+						   uint32_t seq ATTR_UNUSED,
+						   ARRAY_TYPE(keyword_indexes) *keywords ATTR_UNUSED)
+{
+}
+
 static struct mail_index_transaction *
 mail_index_transaction_new(void)
 {


More information about the dovecot-cvs mailing list