dovecot-2.0: index-storage: Simplified the way transactions are ...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jul 31 05:10:21 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/ef135231b675
changeset: 9708:ef135231b675
user: Timo Sirainen <tss at iki.fi>
date: Thu Jul 30 22:10:11 2009 -0400
description:
index-storage: Simplified the way transactions are are created/finished.
Removed also mail_storage.class_init/deinit since they're no longer used
for anything.
diffstat:
36 files changed, 401 insertions(+), 899 deletions(-)
src/lib-storage/index/cydir/Makefile.am | 3
src/lib-storage/index/cydir/cydir-save.c | 68 ++++++-----
src/lib-storage/index/cydir/cydir-storage.c | 16 --
src/lib-storage/index/cydir/cydir-storage.h | 17 --
src/lib-storage/index/cydir/cydir-transaction.c | 93 ---------------
src/lib-storage/index/dbox/Makefile.am | 3
src/lib-storage/index/dbox/dbox-save.c | 72 ++++++-----
src/lib-storage/index/dbox/dbox-storage.c | 16 --
src/lib-storage/index/dbox/dbox-storage.h | 17 --
src/lib-storage/index/dbox/dbox-transaction.c | 93 ---------------
src/lib-storage/index/index-storage.h | 37 +++---
src/lib-storage/index/index-transaction.c | 106 ++++++++++-------
src/lib-storage/index/maildir/Makefile.am | 1
src/lib-storage/index/maildir/maildir-copy.c | 5
src/lib-storage/index/maildir/maildir-save.c | 88 ++++++--------
src/lib-storage/index/maildir/maildir-storage.c | 16 --
src/lib-storage/index/maildir/maildir-storage.h | 18 --
src/lib-storage/index/maildir/maildir-transaction.c | 88 --------------
src/lib-storage/index/mbox/Makefile.am | 3
src/lib-storage/index/mbox/mbox-save.c | 87 ++++++++------
src/lib-storage/index/mbox/mbox-storage.c | 75 +++++++++---
src/lib-storage/index/mbox/mbox-storage.h | 12 -
src/lib-storage/index/mbox/mbox-transaction.c | 115 -------------------
src/lib-storage/index/raw/Makefile.am | 3
src/lib-storage/index/raw/raw-storage.c | 12 -
src/lib-storage/index/raw/raw-storage.h | 3
src/lib-storage/index/raw/raw-transaction.c | 68 -----------
src/lib-storage/index/shared/shared-storage.c | 2
src/lib-storage/mail-storage-private.h | 5
src/lib-storage/mail-storage.c | 6
src/lib-storage/test-mail-storage.c | 2
src/plugins/virtual/virtual-save.c | 13 +-
src/plugins/virtual/virtual-storage.c | 18 --
src/plugins/virtual/virtual-storage.h | 5
src/plugins/virtual/virtual-transaction.c | 103 ++++++-----------
src/plugins/virtual/virtual-transaction.h | 11 -
diffs (truncated from 2129 to 300 lines):
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/cydir/Makefile.am
--- a/src/lib-storage/index/cydir/Makefile.am Thu Jul 30 22:08:44 2009 -0400
+++ b/src/lib-storage/index/cydir/Makefile.am Thu Jul 30 22:10:11 2009 -0400
@@ -12,8 +12,7 @@ libstorage_cydir_la_SOURCES = \
cydir-mail.c \
cydir-save.c \
cydir-sync.c \
- cydir-storage.c \
- cydir-transaction.c
+ cydir-storage.c
headers = \
cydir-storage.h \
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/cydir/cydir-save.c
--- a/src/lib-storage/index/cydir/cydir-save.c Thu Jul 30 22:08:44 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-save.c Thu Jul 30 22:10:11 2009 -0400
@@ -57,24 +57,25 @@ cydir_get_save_path(struct cydir_save_co
}
struct mail_save_context *
-cydir_save_alloc(struct mailbox_transaction_context *_t)
-{
- struct cydir_transaction_context *t =
- (struct cydir_transaction_context *)_t;
- struct cydir_mailbox *mbox = (struct cydir_mailbox *)_t->box;
- struct cydir_save_context *ctx = t->save_ctx;
-
- i_assert((_t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
-
- if (t->save_ctx != NULL)
- return &t->save_ctx->ctx;
-
- ctx = t->save_ctx = i_new(struct cydir_save_context, 1);
- ctx->ctx.transaction = &t->ictx.mailbox_ctx;
- ctx->mbox = mbox;
- ctx->trans = t->ictx.trans;
- ctx->tmp_basename = cydir_generate_tmp_filename();
- return &ctx->ctx;
+cydir_save_alloc(struct mailbox_transaction_context *t)
+{
+ struct index_transaction_context *it =
+ (struct index_transaction_context *)t;
+ struct cydir_mailbox *mbox = (struct cydir_mailbox *)t->box;
+ struct cydir_save_context *ctx =
+ (struct cydir_save_context *)t->save_ctx;
+
+ i_assert((t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
+
+ if (t->save_ctx == NULL) {
+ ctx = i_new(struct cydir_save_context, 1);
+ ctx->ctx.transaction = t;
+ ctx->mbox = mbox;
+ ctx->trans = it->trans;
+ ctx->tmp_basename = cydir_generate_tmp_filename();
+ t->save_ctx = &ctx->ctx;
+ }
+ return t->save_ctx;
}
int cydir_save_begin(struct mail_save_context *_ctx, struct istream *input)
@@ -232,9 +233,10 @@ void cydir_save_cancel(struct mail_save_
(void)cydir_save_finish(_ctx);
}
-int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
-{
- struct mailbox_transaction_context *_t = ctx->ctx.transaction;
+int cydir_transaction_save_commit_pre(struct mail_save_context *_ctx)
+{
+ struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
+ struct mailbox_transaction_context *_t = _ctx->transaction;
const struct mail_index_header *hdr;
struct seq_range_iter iter;
uint32_t uid;
@@ -246,7 +248,7 @@ int cydir_transaction_save_commit_pre(st
if (cydir_sync_begin(ctx->mbox, &ctx->sync_ctx, TRUE) < 0) {
ctx->failed = TRUE;
- cydir_transaction_save_rollback(ctx);
+ cydir_transaction_save_rollback(_ctx);
return -1;
}
@@ -280,7 +282,7 @@ int cydir_transaction_save_commit_pre(st
"rename(%s, %s) failed: %m",
str_c(src_path), str_c(dest_path));
ctx->failed = TRUE;
- cydir_transaction_save_rollback(ctx);
+ cydir_transaction_save_rollback(_ctx);
return -1;
}
}
@@ -290,16 +292,20 @@ int cydir_transaction_save_commit_pre(st
return 0;
}
-void cydir_transaction_save_commit_post(struct cydir_save_context *ctx)
-{
- ctx->ctx.transaction = NULL; /* transaction is already freed */
+void cydir_transaction_save_commit_post(struct mail_save_context *_ctx)
+{
+ struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
+
+ _ctx->transaction = NULL; /* transaction is already freed */
(void)cydir_sync_finish(&ctx->sync_ctx, TRUE);
- cydir_transaction_save_rollback(ctx);
-}
-
-void cydir_transaction_save_rollback(struct cydir_save_context *ctx)
-{
+ cydir_transaction_save_rollback(_ctx);
+}
+
+void cydir_transaction_save_rollback(struct mail_save_context *_ctx)
+{
+ struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
+
if (!ctx->finished)
cydir_save_cancel(&ctx->ctx);
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c Thu Jul 30 22:08:44 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c Thu Jul 30 22:10:11 2009 -0400
@@ -85,6 +85,10 @@ cydir_mailbox_alloc(struct mail_storage
mbox->ibox.box.storage = storage;
mbox->ibox.box.list = list;
mbox->ibox.mail_vfuncs = &cydir_mail_vfuncs;
+
+ mbox->ibox.save_commit_pre = cydir_transaction_save_commit_pre;
+ mbox->ibox.save_commit_post = cydir_transaction_save_commit_post;
+ mbox->ibox.save_rollback = cydir_transaction_save_rollback;
index_storage_mailbox_alloc(&mbox->ibox, name, input, flags,
CYDIR_INDEX_PREFIX);
@@ -332,16 +336,6 @@ static int cydir_list_iter_is_mailbox(st
return ret;
}
-static void cydir_class_init(void)
-{
- cydir_transaction_class_init();
-}
-
-static void cydir_class_deinit(void)
-{
- cydir_transaction_class_deinit();
-}
-
static void cydir_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
struct mailbox_list *list)
{
@@ -362,8 +356,6 @@ struct mail_storage cydir_storage = {
{
NULL,
- cydir_class_init,
- cydir_class_deinit,
cydir_storage_alloc,
NULL,
index_storage_destroy,
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/cydir/cydir-storage.h
--- a/src/lib-storage/index/cydir/cydir-storage.h Thu Jul 30 22:08:44 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.h Thu Jul 30 22:10:11 2009 -0400
@@ -18,18 +18,7 @@ struct cydir_mailbox {
struct cydir_storage *storage;
};
-struct cydir_transaction_context {
- struct index_transaction_context ictx;
- union mail_index_transaction_module_context module_ctx;
-
- uint32_t first_saved_mail_seq;
- struct cydir_save_context *save_ctx;
-};
-
extern struct mail_vfuncs cydir_mail_vfuncs;
-
-void cydir_transaction_class_init(void);
-void cydir_transaction_class_deinit(void);
struct mail_save_context *
cydir_save_alloc(struct mailbox_transaction_context *_t);
@@ -38,8 +27,8 @@ int cydir_save_finish(struct mail_save_c
int cydir_save_finish(struct mail_save_context *ctx);
void cydir_save_cancel(struct mail_save_context *ctx);
-int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx);
-void cydir_transaction_save_commit_post(struct cydir_save_context *ctx);
-void cydir_transaction_save_rollback(struct cydir_save_context *ctx);
+int cydir_transaction_save_commit_pre(struct mail_save_context *ctx);
+void cydir_transaction_save_commit_post(struct mail_save_context *ctx);
+void cydir_transaction_save_rollback(struct mail_save_context *ctx);
#endif
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/cydir/cydir-transaction.c
--- a/src/lib-storage/index/cydir/cydir-transaction.c Thu Jul 30 22:08:44 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
-
-#include "lib.h"
-#include "array.h"
-#include "cydir-storage.h"
-#include "cydir-sync.h"
-
-static void (*next_hook_mail_index_transaction_created)
- (struct mail_index_transaction *t) = NULL;
-
-static int cydir_transaction_commit(struct mail_index_transaction *t,
- uint32_t *log_file_seq_r,
- uoff_t *log_file_offset_r)
-{
- struct cydir_transaction_context *dt = MAIL_STORAGE_CONTEXT(t);
- struct cydir_save_context *save_ctx;
- int ret = 0;
-
- if (dt->save_ctx != NULL) {
- if (cydir_transaction_save_commit_pre(dt->save_ctx) < 0) {
- dt->save_ctx = NULL;
- ret = -1;
- }
- }
-
- save_ctx = dt->save_ctx;
-
- if (ret < 0)
- index_transaction_finish_rollback(&dt->ictx);
- else {
- if (index_transaction_finish_commit(&dt->ictx, log_file_seq_r,
- log_file_offset_r) < 0)
- ret = -1;
- }
-
- /* transaction is destroyed now. */
- dt = NULL;
-
- if (save_ctx != NULL) {
- /* unlock uidlist file after writing to transaction log,
- to make sure we don't write uids in wrong order. */
- cydir_transaction_save_commit_post(save_ctx);
- }
- return ret;
-}
-
-static void cydir_transaction_rollback(struct mail_index_transaction *t)
-{
- struct cydir_transaction_context *dt = MAIL_STORAGE_CONTEXT(t);
-
- if (dt->save_ctx != NULL)
- cydir_transaction_save_rollback(dt->save_ctx);
-
- index_transaction_finish_rollback(&dt->ictx);
-}
-
-static void cydir_transaction_created(struct mail_index_transaction *t)
-{
- struct mailbox *box = MAIL_STORAGE_CONTEXT(t->view);
-
- /* index can be for mailbox list index, in which case box=NULL */
- if (box != NULL &&
- strcmp(box->storage->name, CYDIR_STORAGE_NAME) == 0) {
- struct cydir_mailbox *cydir = (struct cydir_mailbox *)box;
- struct cydir_transaction_context *mt;
-
- mt = i_new(struct cydir_transaction_context, 1);
- mt->ictx.trans = t;
- index_transaction_init(&mt->ictx, &cydir->ibox);
-
- t->v.commit = cydir_transaction_commit;
- t->v.rollback = cydir_transaction_rollback;
- MODULE_CONTEXT_SET(t, mail_storage_mail_index_module, mt);
- }
-
- if (next_hook_mail_index_transaction_created != NULL)
- next_hook_mail_index_transaction_created(t);
-}
-
-void cydir_transaction_class_init(void)
-{
- next_hook_mail_index_transaction_created =
- hook_mail_index_transaction_created;
- hook_mail_index_transaction_created = cydir_transaction_created;
-}
-
-void cydir_transaction_class_deinit(void)
-{
- i_assert(hook_mail_index_transaction_created ==
- cydir_transaction_created);
- hook_mail_index_transaction_created =
- next_hook_mail_index_transaction_created;
-}
diff -r 20934905ccdc -r ef135231b675 src/lib-storage/index/dbox/Makefile.am
--- a/src/lib-storage/index/dbox/Makefile.am Thu Jul 30 22:08:44 2009 -0400
+++ b/src/lib-storage/index/dbox/Makefile.am Thu Jul 30 22:10:11 2009 -0400
@@ -21,8 +21,7 @@ libstorage_dbox_la_SOURCES = \
dbox-sync-file.c \
dbox-sync-rebuild.c \
dbox-storage.c \
- dbox-storage-rebuild.c \
More information about the dovecot-cvs
mailing list