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