dovecot: Added MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT flag.
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 3 21:39:37 EET 2007
details: http://hg.dovecot.org/dovecot/rev/a4f475d415d6
changeset: 6675:a4f475d415d6
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 03 21:39:10 2007 +0200
description:
Added MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT flag.
diffstat:
2 files changed, 40 insertions(+), 19 deletions(-)
src/lib-index/mail-index-view-sync.c | 53 ++++++++++++++++++++++------------
src/lib-index/mail-index.h | 6 +++
diffs (129 lines):
diff -r 2637fb191e5e -r a4f475d415d6 src/lib-index/mail-index-view-sync.c
--- a/src/lib-index/mail-index-view-sync.c Sat Nov 03 20:35:59 2007 +0200
+++ b/src/lib-index/mail-index-view-sync.c Sat Nov 03 21:39:10 2007 +0200
@@ -92,17 +92,22 @@ mail_transaction_log_sort_expunges(ARRAY
static int
view_sync_set_log_view_range(struct mail_index_view *view, bool sync_expunges,
- bool *reset_r)
+ bool quick_sync, bool *reset_r)
{
const struct mail_index_header *hdr = &view->index->map->hdr;
uint32_t start_seq, end_seq;
uoff_t start_offset, end_offset;
int ret;
- start_seq = view->log_file_expunge_seq;
- start_offset = view->log_file_expunge_offset;
end_seq = hdr->log_file_seq;
end_offset = hdr->log_file_head_offset;
+ if (quick_sync) {
+ start_seq = end_seq;
+ start_offset = end_offset;
+ } else {
+ start_seq = view->log_file_expunge_seq;
+ start_offset = view->log_file_expunge_offset;
+ }
for (;;) {
/* the view begins from the first non-synced transaction */
@@ -154,7 +159,7 @@ view_sync_get_expunges(struct mail_index
bool reset;
int ret;
- if (view_sync_set_log_view_range(view, TRUE, &reset) < 0)
+ if (view_sync_set_log_view_range(view, TRUE, FALSE, &reset) < 0)
return -1;
/* get a list of expunge transactions. there may be some that we have
@@ -264,26 +269,36 @@ int mail_index_view_sync_begin(struct ma
struct mail_index_map *map;
ARRAY_TYPE(seq_range) expunges = ARRAY_INIT;
unsigned int expunge_count = 0;
- bool reset, sync_expunges;
+ bool reset, sync_expunges, quick_sync;
i_assert(!view->syncing);
i_assert(view->transactions == 0);
+ quick_sync = (flags & MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT) != 0;
if (mail_index_view_is_inconsistent(view)) {
- mail_index_set_error(view->index, "%s view is inconsistent",
- view->index->filepath);
- return -1;
+ if ((flags & MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT) == 0) {
+ mail_index_set_error(view->index,
+ "%s view is inconsistent",
+ view->index->filepath);
+ return -1;
+ }
+ view->inconsistent = FALSE;
}
sync_expunges = (flags & MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES) == 0;
if (sync_expunges) {
- /* get list of all expunges first */
- if (view_sync_get_expunges(view, &expunges,
- &expunge_count) < 0)
- return -1;
- }
-
- if (view_sync_set_log_view_range(view, sync_expunges, &reset) < 0) {
+ if (quick_sync)
+ i_array_init(&expunges, 1);
+ else {
+ /* get list of all expunges first */
+ if (view_sync_get_expunges(view, &expunges,
+ &expunge_count) < 0)
+ return -1;
+ }
+ }
+
+ if (view_sync_set_log_view_range(view, sync_expunges, quick_sync,
+ &reset) < 0) {
if (array_is_created(&expunges))
array_free(&expunges);
return -1;
@@ -298,7 +313,8 @@ int mail_index_view_sync_begin(struct ma
mail_index_sync_map_init(&ctx->sync_map_ctx, view,
MAIL_INDEX_SYNC_HANDLER_VIEW);
- if (reset && view->map->hdr.messages_count > 0) {
+ if (reset && view->map->hdr.messages_count > 0 &&
+ (flags & MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT) == 0) {
view->inconsistent = TRUE;
mail_index_set_error(view->index,
"%s reset, view is now inconsistent",
@@ -625,13 +641,14 @@ int mail_index_view_sync_commit(struct m
{
struct mail_index_view_sync_ctx *ctx = *_ctx;
struct mail_index_view *view = ctx->view;
- int ret = ctx->failed || view->inconsistent ? -1 : 0;
+ int ret = ctx->failed ? -1 : 0;
i_assert(view->syncing);
*_ctx = NULL;
- if (!ctx->last_read) {
+ if ((!ctx->last_read || view->inconsistent) &&
+ (ctx->flags & MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT) == 0) {
/* we didn't sync everything */
view->inconsistent = TRUE;
ret = -1;
diff -r 2637fb191e5e -r a4f475d415d6 src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h Sat Nov 03 20:35:59 2007 +0200
+++ b/src/lib-index/mail-index.h Sat Nov 03 21:39:10 2007 +0200
@@ -130,7 +130,11 @@ enum mail_index_sync_flags {
enum mail_index_view_sync_flags {
/* Don't sync expunges */
- MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES = 0x01
+ MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES = 0x01,
+ /* Make sure view isn't inconsistent after syncing. This also means
+ that you don't care about view_sync_next()'s output, so it won't
+ return anything. */
+ MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT = 0x02
};
struct mail_index_sync_rec {
More information about the dovecot-cvs
mailing list