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