]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Add MAIL_INDEX_OPEN_FLAG_NO_DIRTY
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 8 Feb 2017 10:03:30 +0000 (12:03 +0200)
committerGitLab <gitlab@git.dovecot.net>
Mon, 13 Feb 2017 17:37:39 +0000 (19:37 +0200)
This way mailbox format backends that don't need dirty flags can use them
for other purposes.

src/lib-index/mail-index-sync-update.c
src/lib-index/mail-index-sync.c
src/lib-index/mail-index.h

index 0df38fb0b3f488b2698621251c8d7167b1a1ad8b..2edd4fee257770473047cd1954f76cd166792f5e 100644 (file)
@@ -422,7 +422,8 @@ static int sync_append(const struct mail_index_record *rec,
        map->hdr.messages_count++;
        map->hdr.next_uid = rec->uid+1;
 
-       if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
+       if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 &&
+           (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
                map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY;
 
        mail_index_header_update_lowwaters(ctx, rec->uid, new_flags);
@@ -447,7 +448,8 @@ static int sync_flag_update(const struct mail_transaction_flag_update *u,
                                               seq1, seq2);
        }
 
-       if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
+       if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 &&
+           (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
                view->map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY;
 
         flag_mask = ~u->remove_flags;
@@ -856,7 +858,8 @@ static void mail_index_sync_update_hdr_dirty_flag(struct mail_index_map *map)
        const struct mail_index_record *rec;
        uint32_t seq;
 
-       if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0)
+       if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 ||
+           (map->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) != 0)
                return;
 
        /* do we have dirty flags anymore? */
index 9ac2453923e387a3428f68a8ef715357b861bac8..692ae58666d758ae49b75619e547c461e052f4f6 100644 (file)
@@ -175,7 +175,8 @@ mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx)
        int ret;
 
        if ((ctx->view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
-           (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) {
+           (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+           (ctx->view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) {
                /* show dirty flags as flag updates */
                mail_index_sync_add_dirty_updates(ctx);
        }
@@ -253,7 +254,8 @@ mail_index_need_sync(struct mail_index *index, enum mail_index_sync_flags flags,
                return TRUE;
 
        if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
-           (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0)
+           (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+           (index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
                return TRUE;
 
        if (log_file_seq == (uint32_t)-1) {
@@ -533,7 +535,8 @@ static bool mail_index_sync_view_have_any(struct mail_index_view *view,
                return TRUE;
 
        if ((view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
-           (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0)
+           (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+           (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
                return TRUE;
 
        mail_transaction_log_get_head(view->index->log, &log_seq, &log_offset);
index 41106abf8a2e68a0ed6353a8e9c7519f7c40bf67..1dde6c5f3e9c2f7c540ab17fced134f566a990c4 100644 (file)
@@ -37,6 +37,9 @@ enum mail_index_open_flags {
        MAIL_INDEX_OPEN_FLAG_SAVEONLY           = 0x400,
        /* Enable debug logging */
        MAIL_INDEX_OPEN_FLAG_DEBUG              = 0x800,
+       /* MAIL_INDEX_MAIL_FLAG_DIRTY can be used as a backend-specific flag.
+          All special handling of the flag is disabled by this. */
+       MAIL_INDEX_OPEN_FLAG_NO_DIRTY           = 0x1000,
 };
 
 enum mail_index_header_compat_flags {
@@ -55,7 +58,9 @@ enum mail_index_header_flag {
 enum mail_index_mail_flags {
        /* For private use by backend. Replacing flags doesn't change this. */
        MAIL_INDEX_MAIL_FLAG_BACKEND            = 0x40,
-       /* Message flags haven't been written to backend */
+       /* Message flags haven't been written to backend. If
+          MAIL_INDEX_OPEN_FLAG_NO_DIRTY is set, this is treated as a
+          backend-specific flag with no special internal handling. */
        MAIL_INDEX_MAIL_FLAG_DIRTY              = 0x80,
        /* Force updating this message's modseq via a flag update record */
        MAIL_INDEX_MAIL_FLAG_UPDATE_MODSEQ      = 0x100