dovecot-2.2: lib-storage: Added support for "private modseqs" fo...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jan 4 01:13:16 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/69371578720f
changeset: 15495:69371578720f
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jan 04 01:12:24 2013 +0200
description:
lib-storage: Added support for "private modseqs" for INDEXPVT index.
Used by dsync (next commit).

diffstat:

 src/lib-storage/fail-mail.c                       |   2 +
 src/lib-storage/index/cydir/cydir-mail.c          |   2 +
 src/lib-storage/index/dbox-multi/mdbox-mail.c     |   2 +
 src/lib-storage/index/dbox-multi/mdbox-storage.c  |   6 +-
 src/lib-storage/index/dbox-single/sdbox-mail.c    |   2 +
 src/lib-storage/index/dbox-single/sdbox-storage.c |   6 +-
 src/lib-storage/index/imapc/imapc-mail.c          |   2 +
 src/lib-storage/index/index-mail.c                |  25 ++++++++++
 src/lib-storage/index/index-mail.h                |   4 +-
 src/lib-storage/index/index-status.c              |   8 +++
 src/lib-storage/index/index-storage.c             |  53 ++++++++++++++++++++--
 src/lib-storage/index/index-storage.h             |   2 +-
 src/lib-storage/index/index-sync-pvt.c            |  49 +--------------------
 src/lib-storage/index/maildir/maildir-mail.c      |   2 +
 src/lib-storage/index/mbox/mbox-mail.c            |   2 +
 src/lib-storage/index/pop3c/pop3c-mail.c          |   2 +
 src/lib-storage/index/raw/raw-mail.c              |   2 +
 src/lib-storage/mail-storage-private.h            |   5 ++
 src/lib-storage/mail-storage.c                    |  43 ++++++++++++++++++
 src/lib-storage/mail-storage.h                    |  11 ++++-
 src/lib-storage/mail.c                            |  14 ++++++
 src/plugins/virtual/virtual-mail.c                |   2 +
 22 files changed, 184 insertions(+), 62 deletions(-)

diffs (truncated from 640 to 300 lines):

diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/fail-mail.c
--- a/src/lib-storage/fail-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/fail-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -244,6 +244,7 @@
 	fail_mail_get_keywords,
 	fail_mail_get_keyword_indexes,
 	fail_mail_get_modseq,
+	fail_mail_get_modseq,
 	fail_mail_get_parts,
 	fail_mail_get_date,
 	fail_mail_get_received_date,
@@ -260,6 +261,7 @@
 	fail_mail_update_flags,
 	fail_mail_update_keywords,
 	fail_mail_update_modseq,
+	fail_mail_update_modseq,
 	NULL,
 	fail_mail_expunge,
 	fail_mail_set_cache_corrupted,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/cydir/cydir-mail.c
--- a/src/lib-storage/index/cydir/cydir-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -140,6 +140,7 @@
 	index_mail_get_keywords,
 	index_mail_get_keyword_indexes,
 	index_mail_get_modseq,
+	index_mail_get_pvt_modseq,
 	index_mail_get_parts,
 	index_mail_get_date,
 	cydir_mail_get_received_date,
@@ -156,6 +157,7 @@
 	index_mail_update_flags,
 	index_mail_update_keywords,
 	index_mail_update_modseq,
+	index_mail_update_pvt_modseq,
 	NULL,
 	index_mail_expunge,
 	index_mail_set_cache_corrupted,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/dbox-multi/mdbox-mail.c
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -198,6 +198,7 @@
 	index_mail_get_keywords,
 	index_mail_get_keyword_indexes,
 	index_mail_get_modseq,
+	index_mail_get_pvt_modseq,
 	index_mail_get_parts,
 	index_mail_get_date,
 	dbox_mail_get_received_date,
@@ -214,6 +215,7 @@
 	mdbox_mail_update_flags,
 	index_mail_update_keywords,
 	index_mail_update_modseq,
+	index_mail_update_pvt_modseq,
 	NULL,
 	index_mail_expunge,
 	index_mail_set_cache_corrupted,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/dbox-multi/mdbox-storage.c
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c	Fri Jan 04 01:12:24 2013 +0200
@@ -402,9 +402,9 @@
 		if (mailbox_open(box) < 0)
 			return -1;
 	}
-	if (update->cache_updates != NULL)
-		index_storage_mailbox_update_cache(box, update);
-	return mdbox_write_index_header(box, update, NULL);
+	if (mdbox_write_index_header(box, update, NULL) < 0)
+		return -1;
+	return index_storage_mailbox_update_common(box, update);
 }
 
 struct mail_storage mdbox_storage = {
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/dbox-single/sdbox-mail.c
--- a/src/lib-storage/index/dbox-single/sdbox-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -106,6 +106,7 @@
 	index_mail_get_keywords,
 	index_mail_get_keyword_indexes,
 	index_mail_get_modseq,
+	index_mail_get_pvt_modseq,
 	index_mail_get_parts,
 	index_mail_get_date,
 	dbox_mail_get_received_date,
@@ -122,6 +123,7 @@
 	index_mail_update_flags,
 	index_mail_update_keywords,
 	index_mail_update_modseq,
+	index_mail_update_pvt_modseq,
 	NULL,
 	index_mail_expunge,
 	index_mail_set_cache_corrupted,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/dbox-single/sdbox-storage.c
--- a/src/lib-storage/index/dbox-single/sdbox-storage.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-storage.c	Fri Jan 04 01:12:24 2013 +0200
@@ -382,9 +382,9 @@
 		if (mailbox_open(box) < 0)
 			return -1;
 	}
-	if (update->cache_updates != NULL)
-		index_storage_mailbox_update_cache(box, update);
-	return sdbox_mailbox_create_indexes(box, update, NULL);
+	if (sdbox_mailbox_create_indexes(box, update, NULL) < 0)
+		return -1;
+	return index_storage_mailbox_update_common(box, update);
 }
 
 struct mail_storage sdbox_storage = {
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/imapc/imapc-mail.c
--- a/src/lib-storage/index/imapc/imapc-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -413,6 +413,7 @@
 	index_mail_get_keywords,
 	index_mail_get_keyword_indexes,
 	index_mail_get_modseq,
+	index_mail_get_pvt_modseq,
 	index_mail_get_parts,
 	index_mail_get_date,
 	imapc_mail_get_received_date,
@@ -429,6 +430,7 @@
 	index_mail_update_flags,
 	index_mail_update_keywords,
 	index_mail_update_modseq,
+	index_mail_update_pvt_modseq,
 	NULL,
 	index_mail_expunge,
 	index_mail_set_cache_corrupted,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/index-mail.c
--- a/src/lib-storage/index/index-mail.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/index-mail.c	Fri Jan 04 01:12:24 2013 +0200
@@ -195,6 +195,24 @@
 	return mail->data.modseq;
 }
 
+uint64_t index_mail_get_pvt_modseq(struct mail *_mail)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+
+	if (mail->data.pvt_modseq != 0)
+		return mail->data.pvt_modseq;
+
+	if (mailbox_open_index_pvt(_mail->box) <= 0)
+		return 0;
+	index_transaction_init_pvt(_mail->transaction);
+
+	mail_index_modseq_enable(_mail->box->index_pvt);
+	mail->data.pvt_modseq =
+		mail_index_modseq_lookup(_mail->transaction->view_pvt,
+					 _mail->seq);
+	return mail->data.pvt_modseq;
+}
+
 const char *const *index_mail_get_keywords(struct mail *_mail)
 {
 	struct index_mail *mail = (struct index_mail *)_mail;
@@ -1749,6 +1767,13 @@
 				 min_modseq);
 }
 
+void index_mail_update_pvt_modseq(struct mail *mail, uint64_t min_pvt_modseq)
+{
+	index_transaction_init_pvt(mail->transaction);
+	mail_index_update_modseq(mail->transaction->itrans_pvt, mail->seq,
+				 min_pvt_modseq);
+}
+
 void index_mail_expunge(struct mail *mail)
 {
 	const char *value;
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/index-mail.h
--- a/src/lib-storage/index/index-mail.h	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/index-mail.h	Fri Jan 04 01:12:24 2013 +0200
@@ -85,7 +85,7 @@
 
 	uint32_t seq;
 	uint32_t cache_flags;
-	uint64_t modseq;
+	uint64_t modseq, pvt_modseq;
 	enum index_mail_access_part access_part;
 	/* dont_cache_fields overrides cache_fields */
 	enum mail_fetch_field cache_fetch_fields, dont_cache_fetch_fields;
@@ -193,6 +193,7 @@
 
 enum mail_flags index_mail_get_flags(struct mail *_mail);
 uint64_t index_mail_get_modseq(struct mail *_mail);
+uint64_t index_mail_get_pvt_modseq(struct mail *_mail);
 const char *const *index_mail_get_keywords(struct mail *_mail);
 const ARRAY_TYPE(keyword_indexes) *
 index_mail_get_keyword_indexes(struct mail *_mail);
@@ -220,6 +221,7 @@
 void index_mail_update_keywords(struct mail *mail, enum modify_type modify_type,
 				struct mail_keywords *keywords);
 void index_mail_update_modseq(struct mail *mail, uint64_t min_modseq);
+void index_mail_update_pvt_modseq(struct mail *mail, uint64_t min_pvt_modseq);
 void index_mail_expunge(struct mail *mail);
 void index_mail_precache(struct mail *mail);
 void index_mail_set_cache_corrupted(struct mail *mail,
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/index-status.c
--- a/src/lib-storage/index/index-status.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/index-status.c	Fri Jan 04 01:12:24 2013 +0200
@@ -144,6 +144,14 @@
 			status_r->highest_modseq = 1;
 		}
 	}
+	if ((items & STATUS_HIGHESTPVTMODSEQ) != 0 && box->view_pvt != NULL) {
+		status_r->highest_pvt_modseq =
+			mail_index_modseq_get_highest(box->view_pvt);
+		if (status_r->highest_pvt_modseq == 0) {
+			/* modseqs not enabled yet, but we can't return 0 */
+			status_r->highest_pvt_modseq = 1;
+		}
+	}
 
 	if ((items & STATUS_FIRST_UNSEEN_SEQ) != 0) {
 		if (box->view_pvt == NULL ||
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Thu Jan 03 22:53:18 2013 +0200
+++ b/src/lib-storage/index/index-storage.c	Fri Jan 04 01:12:24 2013 +0200
@@ -366,8 +366,9 @@
 		mail_index_alloc_cache_unref(&box->index);
 }
 
-void index_storage_mailbox_update_cache(struct mailbox *box,
-					const struct mailbox_update *update)
+static void
+index_storage_mailbox_update_cache(struct mailbox *box,
+				   const struct mailbox_update *update)
 {
 	const struct mailbox_cache_field *updates = update->cache_updates;
 	ARRAY(struct mail_cache_field) new_fields;
@@ -411,6 +412,49 @@
 	}
 }
 
+static int
+index_storage_mailbox_update_pvt(struct mailbox *box,
+				 const struct mailbox_update *update)
+{
+	struct mail_index_transaction *trans;
+	struct mail_index_view *view;
+	int ret;
+
+	if ((ret = mailbox_open_index_pvt(box)) <= 0)
+		return ret;
+
+	mail_index_refresh(box->index_pvt);
+	view = mail_index_view_open(box->index_pvt);
+	trans = mail_index_transaction_begin(view,
+					MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL);
+	if (update->min_highest_modseq != 0 &&
+	    mail_index_modseq_get_highest(view) < update->min_highest_pvt_modseq) {
+		mail_index_modseq_enable(box->index_pvt);
+		mail_index_update_highest_modseq(trans,
+						 update->min_highest_pvt_modseq);
+	}
+
+	if ((ret = mail_index_transaction_commit(&trans)) < 0)
+		mailbox_set_index_error(box);
+	mail_index_view_close(&view);
+	return ret;
+}
+
+int index_storage_mailbox_update_common(struct mailbox *box,
+					const struct mailbox_update *update)
+{
+	int ret = 0;
+
+	if (update->cache_updates != NULL)
+		index_storage_mailbox_update_cache(box, update);
+
+	if (update->min_highest_pvt_modseq != 0) {
+		if (index_storage_mailbox_update_pvt(box, update) < 0)
+			ret = -1;
+	}
+	return ret;
+}
+
 int index_storage_mailbox_update(struct mailbox *box,
 				 const struct mailbox_update *update)
 {
@@ -421,8 +465,6 @@
 
 	if (mailbox_open(box) < 0)
 		return -1;
-	if (update->cache_updates != NULL)
-		index_storage_mailbox_update_cache(box, update);
 
 	/* make sure we get the latest index info */
 	mail_index_refresh(box->index);
@@ -469,7 +511,8 @@
 	if ((ret = mail_index_transaction_commit(&trans)) < 0)
 		mailbox_set_index_error(box);
 	mail_index_view_close(&view);
-	return ret;
+	return ret < 0 ? -1 :
+		index_storage_mailbox_update_common(box, update);
 }
 
 int index_storage_mailbox_create(struct mailbox *box, bool directory)
diff -r b7d8027a8f74 -r 69371578720f src/lib-storage/index/index-storage.h


More information about the dovecot-cvs mailing list