dovecot-2.1: lib-index: Fixed MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UP...
dovecot at dovecot.org
dovecot at dovecot.org
Thu May 3 23:26:55 EEST 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/5d45870e2e4a
changeset: 14496: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