Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5643:453128e12b11 HEAD
mail_index_sync_begin() returns now transaction directly so the syncing code
doesn't need to create it. It's also automatically committed/rollbacked.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 22 May 2007 18:33:43 +0300 |
parents | 7274df228c04 |
children | 648237c9ae76 |
files | src/lib-index/mail-index-sync-private.h src/lib-index/mail-index-sync.c src/lib-index/mail-index.h src/lib-index/mailbox-list-index-sync.c src/lib-storage/index/cydir/cydir-sync.c src/lib-storage/index/cydir/cydir-sync.h src/lib-storage/index/dbox/dbox-save.c src/lib-storage/index/dbox/dbox-sync.c src/lib-storage/index/maildir/maildir-sync.c src/lib-storage/index/mbox/mbox-sync.c src/lib-storage/list/index-mailbox-list-sync.c |
diffstat | 11 files changed, 62 insertions(+), 118 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync-private.h Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-index/mail-index-sync-private.h Tue May 22 18:33:43 2007 +0300 @@ -11,7 +11,7 @@ struct mail_index_sync_ctx { struct mail_index *index; struct mail_index_view *view; - struct mail_index_transaction *trans; + struct mail_index_transaction *sync_trans, *ext_trans; const struct mail_transaction_header *hdr; const void *data;
--- a/src/lib-index/mail-index-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-index/mail-index-sync.c Tue May 22 18:33:43 2007 +0300 @@ -20,7 +20,7 @@ for (i = 0; i < size; i++) { for (uid = e[i].uid1; uid <= e[i].uid2; uid++) - mail_index_expunge(ctx->trans, uid); + mail_index_expunge(ctx->sync_trans, uid); } } @@ -31,13 +31,13 @@ for (i = 0; i < size; i++) { if (u[i].add_flags != 0) { - mail_index_update_flags_range(ctx->trans, + mail_index_update_flags_range(ctx->sync_trans, u[i].uid1, u[i].uid2, MODIFY_ADD, u[i].add_flags); } if (u[i].remove_flags != 0) { - mail_index_update_flags_range(ctx->trans, + mail_index_update_flags_range(ctx->sync_trans, u[i].uid1, u[i].uid2, MODIFY_REMOVE, u[i].remove_flags); @@ -62,13 +62,13 @@ t_push(); keyword_names[0] = t_strndup(u + 1, u->name_size); keyword_names[1] = NULL; - keywords = mail_index_keywords_create(ctx->trans, keyword_names); + keywords = mail_index_keywords_create(ctx->sync_trans, keyword_names); size = (ctx->hdr->size - uidset_offset) / sizeof(uint32_t); for (i = 0; i < size; i += 2) { /* FIXME: mail_index_update_keywords_range() */ for (uid = uids[i]; uid <= uids[i+1]; uid++) { - mail_index_update_keywords(ctx->trans, uid, + mail_index_update_keywords(ctx->sync_trans, uid, u->modify_type, keywords); } } @@ -84,10 +84,10 @@ struct mail_keywords *keywords; uint32_t uid; - keywords = mail_index_keywords_create(ctx->trans, NULL); + keywords = mail_index_keywords_create(ctx->sync_trans, NULL); for (i = 0; i < size; i++) { for (uid = u[i].uid1; uid <= u[i].uid2; uid++) { - mail_index_update_keywords(ctx->trans, uid, + mail_index_update_keywords(ctx->sync_trans, uid, MODIFY_REPLACE, keywords); } } @@ -145,7 +145,7 @@ if ((rec->flags & MAIL_INDEX_MAIL_FLAG_DIRTY) == 0) continue; - mail_index_update_flags(ctx->trans, rec->uid, + mail_index_update_flags(ctx->sync_trans, rec->uid, MODIFY_REPLACE, rec->flags); } return 0; @@ -164,7 +164,7 @@ if ((rec->flags & MAIL_RECENT) != 0) { seen_recent = TRUE; - mail_index_update_flags(ctx->trans, rec->uid, + mail_index_update_flags(ctx->sync_trans, rec->uid, MODIFY_REMOVE, MAIL_RECENT); } } @@ -182,6 +182,7 @@ mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx, bool *seen_external_r) { + struct mail_index_transaction *sync_trans = ctx->sync_trans; struct mail_index_sync_list *synclist; const struct mail_index_transaction_keyword_update *keyword_updates; unsigned int i, keyword_count; @@ -213,28 +214,28 @@ /* create an array containing all expunge, flag and keyword update arrays so we can easily go through all of the changes. */ - keyword_count = !array_is_created(&ctx->trans->keyword_updates) ? 0 : - array_count(&ctx->trans->keyword_updates); + keyword_count = !array_is_created(&sync_trans->keyword_updates) ? 0 : + array_count(&sync_trans->keyword_updates); i_array_init(&ctx->sync_list, keyword_count + 2); - if (array_is_created(&ctx->trans->expunges)) { + if (array_is_created(&sync_trans->expunges)) { synclist = array_append_space(&ctx->sync_list); - synclist->array = (void *)&ctx->trans->expunges; + synclist->array = (void *)&sync_trans->expunges; } - if (array_is_created(&ctx->trans->updates)) { + if (array_is_created(&sync_trans->updates)) { synclist = array_append_space(&ctx->sync_list); - synclist->array = (void *)&ctx->trans->updates; + synclist->array = (void *)&sync_trans->updates; } /* we must return resets before keyword additions or they get lost */ - if (array_is_created(&ctx->trans->keyword_resets)) { + if (array_is_created(&sync_trans->keyword_resets)) { synclist = array_append_space(&ctx->sync_list); - synclist->array = (void *)&ctx->trans->keyword_resets; + synclist->array = (void *)&sync_trans->keyword_resets; } keyword_updates = keyword_count == 0 ? NULL : - array_idx(&ctx->trans->keyword_updates, 0); + array_idx(&sync_trans->keyword_updates, 0); for (i = 0; i < keyword_count; i++) { if (array_is_created(&keyword_updates[i].add_seq)) { synclist = array_append_space(&ctx->sync_list); @@ -334,11 +335,12 @@ int mail_index_sync_begin(struct mail_index *index, struct mail_index_sync_ctx **ctx_r, struct mail_index_view **view_r, + struct mail_index_transaction **trans_r, uint32_t log_file_seq, uoff_t log_file_offset, bool sync_recent, bool sync_dirty) { struct mail_index_sync_ctx *ctx; - struct mail_index_view *dummy_view; + struct mail_index_view *sync_view; uint32_t seq; uoff_t offset; unsigned int lock_id = 0; @@ -406,10 +408,11 @@ ctx->sync_dirty = sync_dirty; ctx->view = mail_index_view_open(index); + ctx->ext_trans = mail_index_transaction_begin(ctx->view, FALSE, TRUE); - dummy_view = mail_index_dummy_view_open(index); - ctx->trans = mail_index_transaction_begin(dummy_view, FALSE, TRUE); - mail_index_view_close(&dummy_view); + sync_view = mail_index_dummy_view_open(index); + ctx->sync_trans = mail_index_transaction_begin(sync_view, FALSE, TRUE); + mail_index_view_close(&sync_view); if (mail_index_sync_set_log_view(ctx->view, index->hdr->log_file_seq, @@ -455,6 +458,7 @@ ctx->view->index_sync_view = TRUE; *ctx_r = ctx; *view_r = ctx->view; + *trans_r = ctx->ext_trans; return 1; } @@ -525,6 +529,7 @@ int mail_index_sync_next(struct mail_index_sync_ctx *ctx, struct mail_index_sync_rec *sync_rec) { + struct mail_index_transaction *sync_trans = ctx->sync_trans; struct mail_index_sync_list *sync_list; const struct uid_range *uid_range = NULL; unsigned int i, count, next_i; @@ -570,13 +575,13 @@ uid_range = array_idx(sync_list[i].array, sync_list[i].idx); } - if (sync_list[i].array == (void *)&ctx->trans->expunges) { + if (sync_list[i].array == (void *)&sync_trans->expunges) { mail_index_sync_get_expunge(sync_rec, (const struct mail_transaction_expunge *)uid_range); - } else if (sync_list[i].array == (void *)&ctx->trans->updates) { + } else if (sync_list[i].array == (void *)&sync_trans->updates) { mail_index_sync_get_update(sync_rec, (const struct mail_transaction_flag_update *)uid_range); - } else if (sync_list[i].array == (void *)&ctx->trans->keyword_resets) { + } else if (sync_list[i].array == (void *)&sync_trans->keyword_resets) { mail_index_sync_get_keyword_reset(sync_rec, uid_range); } else { mail_index_sync_get_keyword_update(sync_rec, uid_range, @@ -630,7 +635,7 @@ mail_transaction_log_sync_unlock(ctx->index->log); mail_index_view_close(&ctx->view); - mail_index_transaction_rollback(&ctx->trans); + mail_index_transaction_rollback(&ctx->sync_trans); if (array_is_created(&ctx->sync_list)) array_free(&ctx->sync_list); i_free(ctx); @@ -645,6 +650,9 @@ uoff_t offset; int ret = 0; + if (mail_index_transaction_commit(&ctx->ext_trans, &seq, &offset) < 0) + ret = -1; + if (mail_transaction_log_view_is_corrupted(ctx->view->log_view)) ret = -1; @@ -691,6 +699,7 @@ void mail_index_sync_rollback(struct mail_index_sync_ctx **ctx) { + mail_index_transaction_rollback(&(*ctx)->ext_trans); mail_index_sync_end(ctx); }
--- a/src/lib-index/mail-index.h Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-index/mail-index.h Tue May 22 18:33:43 2007 +0300 @@ -216,12 +216,12 @@ Returned sequence numbers describe the mailbox state at the beginning of synchronization, ie. expunges don't affect them. - You may create a new transaction for the returned view. That transaction - acts as "external mailbox changes" transaction. Any changes done there are - expected to describe mailbox's current state. */ + Changes done to the returned transaction are expected to describe the + mailbox's current state. */ int mail_index_sync_begin(struct mail_index *index, struct mail_index_sync_ctx **ctx_r, struct mail_index_view **view_r, + struct mail_index_transaction **trans_r, uint32_t log_file_seq, uoff_t log_file_offset, bool sync_recent, bool sync_dirty); /* Returns -1 if error, 0 if sync is finished, 1 if record was filled. */
--- a/src/lib-index/mailbox-list-index-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-index/mailbox-list-index-sync.c Tue May 22 18:33:43 2007 +0300 @@ -332,7 +332,7 @@ struct mail_index_sync_rec sync_rec; if (mail_index_sync_begin(ctx->index->mail_index, &ctx->mail_sync_ctx, - &ctx->mail_view, (uint32_t)-1, 0, + &ctx->mail_view, &ctx->trans, (uint32_t)-1, 0, FALSE, FALSE) < 0) return -1; @@ -357,7 +357,6 @@ } } - ctx->trans = mail_index_transaction_begin(ctx->mail_view, FALSE, TRUE); if (hdr->uid_validity == 0) { mail_index_update_header(ctx->trans, offsetof(struct mail_index_header, uid_validity), @@ -856,18 +855,6 @@ &used_space, sizeof(used_space), FALSE); } - if (ctx->trans != NULL) { - if (ret < 0) - mail_index_transaction_rollback(&ctx->trans); - else { - uint32_t seq; - uoff_t offset; - - if (mail_index_transaction_commit(&ctx->trans, - &seq, &offset) < 0) - ret = -1; - } - } if (ctx->mail_sync_ctx != NULL) { if (ret < 0) mail_index_sync_rollback(&ctx->mail_sync_ctx);
--- a/src/lib-storage/index/cydir/cydir-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/cydir/cydir-sync.c Tue May 22 18:33:43 2007 +0300 @@ -8,20 +8,11 @@ static int cydir_sync_set_uidvalidity(struct cydir_sync_context *ctx) { - struct mail_index_transaction *trans; uint32_t uid_validity = ioloop_time; - uint32_t seq; - uoff_t offset; - trans = mail_index_transaction_begin(ctx->sync_view, FALSE, TRUE); - mail_index_update_header(trans, + mail_index_update_header(ctx->trans, offsetof(struct mail_index_header, uid_validity), &uid_validity, sizeof(uid_validity), TRUE); - - if (mail_index_transaction_commit(&trans, &seq, &offset) < 0) { - mail_storage_set_index_error(&ctx->mbox->ibox); - return -1; - } return 0; } @@ -130,7 +121,8 @@ ctx = i_new(struct cydir_sync_context, 1); ctx->mbox = mbox; ret = mail_index_sync_begin(mbox->ibox.index, &ctx->index_sync_ctx, - &ctx->sync_view, (uint32_t)-1, (uoff_t)-1, + &ctx->sync_view, &ctx->trans, + (uint32_t)-1, (uoff_t)-1, !mbox->ibox.keep_recent, TRUE); if (ret <= 0) { if (ret < 0)
--- a/src/lib-storage/index/cydir/cydir-sync.h Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/cydir/cydir-sync.h Tue May 22 18:33:43 2007 +0300 @@ -8,6 +8,7 @@ struct cydir_mailbox *mbox; struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *sync_view; + struct mail_index_transaction *trans; string_t *path; unsigned int path_dir_prefix_len;
--- a/src/lib-storage/index/dbox/dbox-save.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/dbox/dbox-save.c Tue May 22 18:33:43 2007 +0300 @@ -372,7 +372,7 @@ /* lock index lock before dropping uidlist lock in _append_commit() */ if (mail_index_sync_begin(ctx->mbox->ibox.index, &ctx->index_sync_ctx, - &view, (uint32_t)-1, (uoff_t)-1, + &view, &ctx->trans, (uint32_t)-1, (uoff_t)-1, FALSE, FALSE) < 0) { ctx->failed = TRUE; dbox_transaction_save_rollback(ctx);
--- a/src/lib-storage/index/dbox/dbox-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/dbox/dbox-sync.c Tue May 22 18:33:43 2007 +0300 @@ -496,7 +496,8 @@ return -1; ret = mail_index_sync_begin(mbox->ibox.index, &ctx->index_sync_ctx, - &ctx->sync_view, (uint32_t)-1, (uoff_t)-1, + &ctx->sync_view, &ctx->trans, + (uint32_t)-1, (uoff_t)-1, !mbox->ibox.keep_recent, TRUE); if (ret <= 0) { if (ret < 0) @@ -505,8 +506,6 @@ return ret; } - ctx->trans = mail_index_transaction_begin(ctx->sync_view, FALSE, TRUE); - hdr = mail_index_get_header(ctx->sync_view); if ((uint32_t)mtime != hdr->sync_stamp) { /* indexes aren't synced. we'll do a full sync. */ @@ -518,8 +517,7 @@ static int dbox_sync_finish(struct dbox_sync_context *ctx, bool force) { const struct mail_index_header *hdr; - uint32_t seq, uid_validity, next_uid; - uoff_t offset; + uint32_t uid_validity, next_uid; time_t mtime; int ret; @@ -564,12 +562,6 @@ &sync_stamp, sizeof(sync_stamp), TRUE); } - if (mail_index_transaction_commit(&ctx->trans, &seq, &offset) < 0) { - mail_storage_set_index_error(&ctx->mbox->ibox); - mail_index_sync_rollback(&ctx->index_sync_ctx); - return -1; - } - if (force) { mail_index_sync_rollback(&ctx->index_sync_ctx); } else {
--- a/src/lib-storage/index/maildir/maildir-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/maildir/maildir-sync.c Tue May 22 18:33:43 2007 +0300 @@ -1001,8 +1001,9 @@ struct maildir_index_sync_context *ctx; struct mail_index_sync_ctx *sync_ctx; struct mail_index_view *view; + struct mail_index_transaction *trans; - if (mail_index_sync_begin(mbox->ibox.index, &sync_ctx, &view, + if (mail_index_sync_begin(mbox->ibox.index, &sync_ctx, &view, &trans, (uint32_t)-1, (uoff_t)-1, FALSE, FALSE) <= 0) { mail_storage_set_index_error(&mbox->ibox); @@ -1013,6 +1014,7 @@ ctx->mbox = mbox; ctx->sync_ctx = sync_ctx; ctx->view = view; + ctx->trans = trans; ctx->keywords_sync_ctx = maildir_keywords_sync_init(mbox->keywords, mbox->ibox.index); *ctx_r = ctx; @@ -1024,26 +1026,10 @@ { struct maildir_index_sync_context *sync_ctx = *_sync_ctx; struct maildir_mailbox *mbox = sync_ctx->mbox; - uint32_t seq; - uoff_t offset; int ret = failed ? -1 : 0; *_sync_ctx = NULL; - if (sync_ctx->trans != NULL) { - if (ret < 0 || cancel) - mail_index_transaction_rollback(&sync_ctx->trans); - else { - if (mail_index_transaction_commit(&sync_ctx->trans, - &seq, &offset) < 0) { - mail_storage_set_index_error(&mbox->ibox); - ret = -1; - } else if (seq != 0) { - mbox->ibox.commit_log_file_seq = seq; - mbox->ibox.commit_log_file_offset = offset; - } - } - } if (ret < 0 || cancel) mail_index_sync_rollback(&sync_ctx->sync_ctx); else { @@ -1075,7 +1061,7 @@ struct maildir_mailbox *mbox = sync_ctx->mbox; struct mail_index_view *view = sync_ctx->view; struct maildir_uidlist_iter_ctx *iter; - struct mail_index_transaction *trans; + struct mail_index_transaction *trans = sync_ctx->trans; const struct mail_index_header *hdr; const struct mail_index_record *rec; uint32_t seq, uid, prev_uid; @@ -1105,9 +1091,6 @@ return -1; } - sync_ctx->trans = trans = - mail_index_transaction_begin(sync_ctx->view, FALSE, TRUE); - seq = prev_uid = 0; t_array_init(&keywords, MAILDIR_MAX_KEYWORDS); t_array_init(&idx_keywords, MAILDIR_MAX_KEYWORDS);
--- a/src/lib-storage/index/mbox/mbox-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync.c Tue May 22 18:33:43 2007 +0300 @@ -1544,6 +1544,7 @@ memset(&sync_ctx->sync_rec, 0, sizeof(sync_ctx->sync_rec)); mail_index_sync_reset(sync_ctx->index_sync_ctx); + mail_index_transction_reset(sync_ctx->t); sync_ctx->prev_msg_uid = 0; sync_ctx->next_uid = sync_ctx->hdr->next_uid; @@ -1612,10 +1613,6 @@ also if we ran out of UIDs. */ i_assert(sync_ctx->mbox->mbox_sync_dirty); mbox_sync_restart(sync_ctx); - - mail_index_transaction_rollback(&sync_ctx->t); - sync_ctx->t = mail_index_transaction_begin(sync_ctx->sync_view, - FALSE, TRUE); partial = FALSE; } @@ -1675,8 +1672,6 @@ static void mbox_sync_context_free(struct mbox_sync_context *sync_ctx) { - if (sync_ctx->t != NULL) - mail_index_transaction_rollback(&sync_ctx->t); if (sync_ctx->index_sync_ctx != NULL) mail_index_sync_rollback(&sync_ctx->index_sync_ctx); pool_unref(sync_ctx->mail_keyword_pool); @@ -1691,6 +1686,7 @@ { struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *sync_view; + struct mail_index_transaction *trans; struct mbox_sync_context sync_ctx; uint32_t seq; uoff_t offset; @@ -1758,7 +1754,7 @@ } ret = mail_index_sync_begin(mbox->ibox.index, &index_sync_ctx, - &sync_view, seq, offset, + &sync_view, &trans, seq, offset, !mbox->ibox.keep_recent, (flags & MBOX_SYNC_REWRITE) != 0); if (ret <= 0) { @@ -1793,7 +1789,7 @@ sync_ctx.index_sync_ctx = index_sync_ctx; sync_ctx.sync_view = sync_view; - sync_ctx.t = mail_index_transaction_begin(sync_view, FALSE, TRUE); + sync_ctx.t = trans; sync_ctx.mail_keyword_pool = pool_alloconly_create("mbox keywords", 256); sync_ctx.saved_keywords_pool = @@ -1816,16 +1812,6 @@ if (mbox_sync_read_index_syncs(&sync_ctx, 1, &expunged) < 0) return -1; if (sync_ctx.sync_rec.uid1 == 0) { - if (mail_index_transaction_commit(&sync_ctx.t, - &seq, &offset) < 0) { - mail_storage_set_index_error(&mbox->ibox); - mbox_sync_context_free(&sync_ctx); - if (lock_id != 0) - (void)mbox_unlock(mbox, lock_id); - return -1; - } - sync_ctx.t = NULL; - sync_ctx.index_sync_ctx = NULL; mbox_sync_context_free(&sync_ctx); goto __nothing_to_do; @@ -1854,9 +1840,8 @@ ret = mbox_sync_do(&sync_ctx, flags); if (ret < 0) - mail_index_transaction_rollback(&sync_ctx.t); - else if (mail_index_transaction_commit(&sync_ctx.t, - &seq, &offset) < 0) { + mail_index_sync_rollback(&index_sync_ctx); + else if (mail_index_sync_commit(&index_sync_ctx) < 0) { mail_storage_set_index_error(&mbox->ibox); ret = -1; } else { @@ -1864,13 +1849,6 @@ mbox->ibox.commit_log_file_offset = 0; } sync_ctx.t = NULL; - - if (ret < 0) - mail_index_sync_rollback(&index_sync_ctx); - else if (mail_index_sync_commit(&index_sync_ctx) < 0) { - mail_storage_set_index_error(&mbox->ibox); - ret = -1; - } sync_ctx.index_sync_ctx = NULL; if (sync_ctx.base_uid_last != sync_ctx.next_uid-1 &&
--- a/src/lib-storage/list/index-mailbox-list-sync.c Tue May 22 18:31:35 2007 +0300 +++ b/src/lib-storage/list/index-mailbox-list-sync.c Tue May 22 18:33:43 2007 +0300 @@ -60,14 +60,16 @@ struct index_list_mailbox *ibox = INDEX_LIST_STORAGE_CONTEXT(box); struct mail_index_sync_ctx *mail_sync_ctx; struct mail_index_view *view; + struct mail_index_transaction *trans; struct mail_index_sync_rec sync_rec; int ret; if (ibox->log_seq == 0) return 0; - ret = mail_index_sync_begin(ilist->mail_index, &mail_sync_ctx, - &view, ibox->log_seq, ibox->log_offset, + ret = mail_index_sync_begin(ilist->mail_index, + &mail_sync_ctx, &view, &trans, + ibox->log_seq, ibox->log_offset, FALSE, FALSE); if (ret <= 0) return ret;