]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mdbox: Make sure map transaction won't succeed after mdbox_map_atomic_set_failed()
authorTimo Sirainen <tss@iki.fi>
Mon, 4 Jun 2012 10:59:40 +0000 (13:59 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 4 Jun 2012 10:59:40 +0000 (13:59 +0300)
src/lib-storage/index/dbox-multi/mdbox-map-private.h
src/lib-storage/index/dbox-multi/mdbox-map.c

index 29aaa59ccb1d37533b0a7656cb5c30ea4a3f69af..6ac13e099545002927392c06a6b792b77d71f273 100644 (file)
@@ -57,6 +57,7 @@ struct mdbox_map_atomic_context {
        unsigned int map_refreshed:1;
        unsigned int locked:1;
        unsigned int success:1;
+       unsigned int failed:1;
 };
 
 int mdbox_map_view_lookup_rec(struct mdbox_map *map,
index 1d7dc7841b42729a8e50e6297f68317c7e40cba5..edca35d42a969e33ed249f50452cbb61c5ff95d2 100644 (file)
@@ -519,11 +519,13 @@ bool mdbox_map_atomic_is_locked(struct mdbox_map_atomic_context *atomic)
 void mdbox_map_atomic_set_failed(struct mdbox_map_atomic_context *atomic)
 {
        atomic->success = FALSE;
+       atomic->failed = TRUE;
 }
 
 void mdbox_map_atomic_set_success(struct mdbox_map_atomic_context *atomic)
 {
-       atomic->success = TRUE;
+       if (!atomic->failed)
+               atomic->success = TRUE;
 }
 
 int mdbox_map_atomic_finish(struct mdbox_map_atomic_context **_atomic)
@@ -595,7 +597,7 @@ int mdbox_map_transaction_commit(struct mdbox_map_transaction_context *ctx)
                mail_index_reset_error(ctx->atomic->map->index);
                return -1;
        }
-       ctx->atomic->success = TRUE;
+       mdbox_map_atomic_set_success(ctx->atomic);
        return 0;
 }
 
@@ -1379,7 +1381,7 @@ int mdbox_map_append_commit(struct mdbox_map_append_context *ctx)
                if (dbox_file_append_commit(&file_appends[i]) < 0)
                        return -1;
        }
-       ctx->atomic->success = TRUE;
+       mdbox_map_atomic_set_success(ctx->atomic);
        return 0;
 }