Mercurial > dovecot > core-2.2
changeset 9254:0e407ad46307 HEAD
More cleanups to transaction log writing code.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 09 May 2009 15:18:46 -0400 |
parents | e144fa1dd2ce |
children | 7919f307a5cd |
files | src/lib-index/mail-index-transaction-export.c src/lib-index/mail-transaction-log-append.c src/lib-index/mail-transaction-log.h |
diffstat | 3 files changed, 70 insertions(+), 63 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-export.c Sat May 09 15:04:22 2009 -0400 +++ b/src/lib-index/mail-index-transaction-export.c Sat May 09 15:18:46 2009 -0400 @@ -12,39 +12,11 @@ struct mail_transaction_log_append_ctx *append_ctx; }; -static void log_append_buffer(struct mail_index_export_context *ctx, - const buffer_t *buf, const buffer_t *hdr_buf, - enum mail_transaction_type type) +static void +log_append_buffer(struct mail_index_export_context *ctx, + const buffer_t *buf, enum mail_transaction_type type) { - buffer_t *output = ctx->append_ctx->output; - struct mail_transaction_header hdr; - - i_assert((type & MAIL_TRANSACTION_TYPE_MASK) != 0); - i_assert((buf->used % 4) == 0); - i_assert(hdr_buf == NULL || (hdr_buf->used % 4) == 0); - - if (buf->used == 0) - return; - - memset(&hdr, 0, sizeof(hdr)); - hdr.type = type; - if (type == MAIL_TRANSACTION_EXPUNGE) - hdr.type |= MAIL_TRANSACTION_EXPUNGE_PROT; - if ((ctx->trans->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0) - hdr.type |= MAIL_TRANSACTION_EXTERNAL; - hdr.size = sizeof(hdr) + buf->used + - (hdr_buf == NULL ? 0 : hdr_buf->used); - hdr.size = mail_index_uint32_to_offset(hdr.size); - - buffer_append(output, &hdr, sizeof(hdr)); - if (hdr_buf != NULL) - buffer_append(output, hdr_buf->data, hdr_buf->used); - buffer_append(output, buf->data, buf->used); - - if (mail_transaction_header_has_modseq(buf->data, - CONST_PTR_OFFSET(buf->data, sizeof(hdr)), - ctx->append_ctx->new_highest_modseq)) - ctx->append_ctx->new_highest_modseq++; + mail_transaction_log_append_add(ctx->append_ctx, type, buf); } static const buffer_t * @@ -147,7 +119,7 @@ ctx->append_ctx->new_highest_modseq = 1; } - log_append_buffer(ctx, buf, NULL, MAIL_TRANSACTION_EXT_INTRO); + log_append_buffer(ctx, buf, MAIL_TRANSACTION_EXT_INTRO); } static void @@ -183,7 +155,7 @@ } if (buf->used % 4 != 0) buffer_append_zero(buf, 4 - buf->used % 4); - log_append_buffer(ctx, buf, NULL, MAIL_TRANSACTION_EXT_HDR_UPDATE); + log_append_buffer(ctx, buf, MAIL_TRANSACTION_EXT_HDR_UPDATE); } static void @@ -260,7 +232,7 @@ if (ext_reset.new_reset_id != 0) { i_assert(ext_id < reset_id_count && ext_reset.new_reset_id == reset_ids[ext_id]); - log_append_buffer(ctx, reset_buf, NULL, + log_append_buffer(ctx, reset_buf, MAIL_TRANSACTION_EXT_RESET); } if (ext_id < hdrs_count && hdrs[ext_id].alloc_size > 0) { @@ -297,13 +269,13 @@ reset_id = ext_id < reset_id_count ? reset_ids[ext_id] : 0; log_append_ext_intro(ctx, ext_id, reset_id); - log_append_buffer(ctx, updates[ext_id].arr.buffer, NULL, type); + log_append_buffer(ctx, updates[ext_id].arr.buffer, type); } } static void log_append_keyword_update(struct mail_index_export_context *ctx, - buffer_t *hdr_buf, enum modify_type modify_type, + buffer_t *tmp_buf, enum modify_type modify_type, const char *keyword, const buffer_t *buffer) { struct mail_transaction_keyword_update kt_hdr; @@ -312,14 +284,14 @@ kt_hdr.modify_type = modify_type; kt_hdr.name_size = strlen(keyword); - buffer_set_used_size(hdr_buf, 0); - buffer_append(hdr_buf, &kt_hdr, sizeof(kt_hdr)); - buffer_append(hdr_buf, keyword, kt_hdr.name_size); - if ((hdr_buf->used % 4) != 0) - buffer_append_zero(hdr_buf, 4 - (hdr_buf->used % 4)); + buffer_set_used_size(tmp_buf, 0); + buffer_append(tmp_buf, &kt_hdr, sizeof(kt_hdr)); + buffer_append(tmp_buf, keyword, kt_hdr.name_size); + if ((tmp_buf->used % 4) != 0) + buffer_append_zero(tmp_buf, 4 - (tmp_buf->used % 4)); + buffer_append(tmp_buf, buffer->data, buffer->used); - log_append_buffer(ctx, buffer, hdr_buf, - MAIL_TRANSACTION_KEYWORD_UPDATE); + log_append_buffer(ctx, tmp_buf, MAIL_TRANSACTION_KEYWORD_UPDATE); } static enum mail_index_sync_type @@ -327,11 +299,11 @@ { const struct mail_index_transaction_keyword_update *updates; const char *const *keywords; - buffer_t *hdr_buf; + buffer_t *tmp_buf; enum mail_index_sync_type change_mask = 0; unsigned int i, count, keywords_count; - hdr_buf = buffer_create_dynamic(pool_datastack_create(), 64); + tmp_buf = buffer_create_dynamic(pool_datastack_create(), 64); keywords = array_get_modifiable(&ctx->trans->view->index->keywords, &keywords_count); @@ -341,13 +313,13 @@ for (i = 0; i < count; i++) { if (array_is_created(&updates[i].add_seq)) { change_mask |= MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD; - log_append_keyword_update(ctx, hdr_buf, + log_append_keyword_update(ctx, tmp_buf, MODIFY_ADD, keywords[i], updates[i].add_seq.arr.buffer); } if (array_is_created(&updates[i].remove_seq)) { change_mask |= MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE; - log_append_keyword_update(ctx, hdr_buf, + log_append_keyword_update(ctx, tmp_buf, MODIFY_REMOVE, keywords[i], updates[i].remove_seq.arr.buffer); } @@ -370,18 +342,17 @@ mail_transaction_log_append_ext_intros(&ctx); if (t->pre_hdr_changed) { - log_append_buffer(&ctx, - log_get_hdr_update_buffer(t, TRUE), - NULL, MAIL_TRANSACTION_HEADER_UPDATE); + log_append_buffer(&ctx, log_get_hdr_update_buffer(t, TRUE), + MAIL_TRANSACTION_HEADER_UPDATE); } if (array_is_created(&t->appends)) { change_mask |= MAIL_INDEX_SYNC_TYPE_APPEND; - log_append_buffer(&ctx, t->appends.arr.buffer, NULL, + log_append_buffer(&ctx, t->appends.arr.buffer, MAIL_TRANSACTION_APPEND); } if (array_is_created(&t->updates)) { change_mask |= MAIL_INDEX_SYNC_TYPE_FLAGS; - log_append_buffer(&ctx, t->updates.arr.buffer, NULL, + log_append_buffer(&ctx, t->updates.arr.buffer, MAIL_TRANSACTION_FLAG_UPDATE); } @@ -398,7 +369,7 @@ if (array_is_created(&t->keyword_resets)) { change_mask |= MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET; log_append_buffer(&ctx, t->keyword_resets.arr.buffer, - NULL, MAIL_TRANSACTION_KEYWORD_RESET); + MAIL_TRANSACTION_KEYWORD_RESET); } if (array_is_created(&t->keyword_updates)) change_mask |= log_append_keyword_updates(&ctx); @@ -408,13 +379,13 @@ checking fsync_mask */ if ((t->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0) change_mask |= MAIL_INDEX_SYNC_TYPE_EXPUNGE; - log_append_buffer(&ctx, t->expunges.arr.buffer, NULL, + log_append_buffer(&ctx, t->expunges.arr.buffer, MAIL_TRANSACTION_EXPUNGE); } if (t->post_hdr_changed) { log_append_buffer(&ctx, log_get_hdr_update_buffer(t, FALSE), - NULL, MAIL_TRANSACTION_HEADER_UPDATE); + MAIL_TRANSACTION_HEADER_UPDATE); } /* Update the tail offsets only when committing the sync transaction.
--- a/src/lib-index/mail-transaction-log-append.c Sat May 09 15:04:22 2009 -0400 +++ b/src/lib-index/mail-transaction-log-append.c Sat May 09 15:18:46 2009 -0400 @@ -6,6 +6,36 @@ #include "mail-index-private.h" #include "mail-transaction-log-private.h" +void mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx, + enum mail_transaction_type type, + const buffer_t *buf) +{ + struct mail_transaction_header hdr; + + i_assert((type & MAIL_TRANSACTION_TYPE_MASK) != 0); + i_assert((buf->used % 4) == 0); + + if (buf->used == 0) + return; + + memset(&hdr, 0, sizeof(hdr)); + hdr.type = type; + if (type == MAIL_TRANSACTION_EXPUNGE) + hdr.type |= MAIL_TRANSACTION_EXPUNGE_PROT; + if (ctx->external) + hdr.type |= MAIL_TRANSACTION_EXTERNAL; + hdr.size = sizeof(hdr) + buf->used; + hdr.size = mail_index_uint32_to_offset(hdr.size); + + buffer_append(ctx->output, &hdr, sizeof(hdr)); + buffer_append(ctx->output, buf->data, buf->used); + + if (mail_transaction_header_has_modseq(buf->data, + CONST_PTR_OFFSET(buf->data, sizeof(hdr)), + ctx->new_highest_modseq)) + ctx->new_highest_modseq++; +} + static int log_buffer_move_to_memory(struct mail_transaction_log_append_ctx *ctx) { @@ -102,6 +132,7 @@ struct mail_transaction_log_file *file = ctx->log->head; struct mail_transaction_header_update *u; struct mail_transaction_header *hdr; + buffer_t *buf; uint32_t offset; if (file->max_tail_offset == file->sync_offset) { @@ -119,15 +150,15 @@ return; i_assert(offset > file->saved_tail_offset); - hdr = buffer_append_space_unsafe(ctx->output, sizeof(*hdr)); - hdr->type = MAIL_TRANSACTION_HEADER_UPDATE | MAIL_TRANSACTION_EXTERNAL; - hdr->size = sizeof(*hdr) + sizeof(*u) + sizeof(uint32_t); - hdr->size = mail_index_uint32_to_offset(hdr->size); - - u = buffer_append_space_unsafe(ctx->output, sizeof(*u)); + buf = buffer_create_static_hard(pool_datastack_create(), + sizeof(*u) + sizeof(offset)); + u = buffer_append_space_unsafe(buf, sizeof(*u)); u->offset = offsetof(struct mail_index_header, log_file_tail_offset); u->size = sizeof(offset); - buffer_append(ctx->output, &offset, sizeof(offset)); + buffer_append(buf, &offset, sizeof(offset)); + + mail_transaction_log_append_add(ctx, MAIL_TRANSACTION_HEADER_UPDATE, + buf); } static int @@ -172,6 +203,7 @@ ctx = i_new(struct mail_transaction_log_append_ctx, 1); ctx->log = index->log; ctx->output = buffer_create_dynamic(default_pool, 1024); + ctx->external = (t->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0; *ctx_r = ctx; return 0;
--- a/src/lib-index/mail-transaction-log.h Sat May 09 15:04:22 2009 -0400 +++ b/src/lib-index/mail-transaction-log.h Sat May 09 15:18:46 2009 -0400 @@ -136,6 +136,7 @@ buffer_t *output; uint64_t new_highest_modseq; + unsigned int external:1; unsigned int append_sync_offset:1; unsigned int sync_includes_this:1; unsigned int want_fsync:1; @@ -225,6 +226,9 @@ int mail_transaction_log_append_begin(struct mail_index_transaction *t, struct mail_transaction_log_append_ctx **ctx_r); +void mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx, + enum mail_transaction_type type, + const buffer_t *buf); int mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **ctx); /* Lock transaction log for index synchronization. Log cannot be read or