dovecot-2.0: lib-index: Added "transaction boundary" record for ...

dovecot at dovecot.org dovecot at dovecot.org
Fri Dec 3 06:27:29 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/b7d13ee51aa4
changeset: 12493:b7d13ee51aa4
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Dec 03 04:25:06 2010 +0000
description:
lib-index: Added "transaction boundary" record for future compatibility.

diffstat:

 src/doveadm/doveadm-dump-log.c              |   9 +++++++++
 src/lib-index/mail-index-sync-update.c      |   2 ++
 src/lib-index/mail-transaction-log-append.c |   2 +-
 src/lib-index/mail-transaction-log-file.c   |  27 ++++++++++++++++++++++-----
 src/lib-index/mail-transaction-log.h        |   5 +++++
 5 files changed, 39 insertions(+), 6 deletions(-)

diffs (144 lines):

diff -r 8e30a07d8dd0 -r b7d13ee51aa4 src/doveadm/doveadm-dump-log.c
--- a/src/doveadm/doveadm-dump-log.c	Thu Dec 02 22:59:42 2010 +0000
+++ b/src/doveadm/doveadm-dump-log.c	Fri Dec 03 04:25:06 2010 +0000
@@ -111,6 +111,9 @@
 	case MAIL_TRANSACTION_INDEX_UNDELETED:
 		name = "index-undeleted";
 		break;
+	case MAIL_TRANSACTION_BOUNDARY:
+		name = "boundary";
+		break;
 	default:
 		name = t_strdup_printf("unknown: %x", type);
 		break;
@@ -406,6 +409,12 @@
 	case MAIL_TRANSACTION_INDEX_DELETED:
 	case MAIL_TRANSACTION_INDEX_UNDELETED:
 		break;
+	case MAIL_TRANSACTION_BOUNDARY: {
+		const struct mail_transaction_boundary *rec = data;
+
+		printf(" - size=%u\n", rec->size);
+		break;
+	}
 	default:
 		break;
 	}
diff -r 8e30a07d8dd0 -r b7d13ee51aa4 src/lib-index/mail-index-sync-update.c
--- a/src/lib-index/mail-index-sync-update.c	Thu Dec 02 22:59:42 2010 +0000
+++ b/src/lib-index/mail-index-sync-update.c	Fri Dec 03 04:25:06 2010 +0000
@@ -792,6 +792,8 @@
 	case MAIL_TRANSACTION_INDEX_UNDELETED:
 		ctx->view->index->index_delete_requested = FALSE;
 		break;
+	case MAIL_TRANSACTION_BOUNDARY:
+		break;
 	default:
 		mail_index_sync_set_corrupted(ctx,
 			"Unknown transaction record type 0x%x",
diff -r 8e30a07d8dd0 -r b7d13ee51aa4 src/lib-index/mail-transaction-log-append.c
--- a/src/lib-index/mail-transaction-log-append.c	Thu Dec 02 22:59:42 2010 +0000
+++ b/src/lib-index/mail-transaction-log-append.c	Fri Dec 03 04:25:06 2010 +0000
@@ -23,7 +23,7 @@
 	if (type == MAIL_TRANSACTION_EXPUNGE ||
 	    type == MAIL_TRANSACTION_EXPUNGE_GUID)
 		hdr.type |= MAIL_TRANSACTION_EXPUNGE_PROT;
-	if (ctx->external)
+	if (ctx->external || type == MAIL_TRANSACTION_BOUNDARY)
 		hdr.type |= MAIL_TRANSACTION_EXTERNAL;
 	hdr.size = sizeof(hdr) + size;
 	hdr.size = mail_index_uint32_to_offset(hdr.size);
diff -r 8e30a07d8dd0 -r b7d13ee51aa4 src/lib-index/mail-transaction-log-file.c
--- a/src/lib-index/mail-transaction-log-file.c	Thu Dec 02 22:59:42 2010 +0000
+++ b/src/lib-index/mail-transaction-log-file.c	Fri Dec 03 04:25:06 2010 +0000
@@ -1161,7 +1161,7 @@
 	mail_transaction_update_modseq(hdr, hdr + 1,
 				       &file->sync_highest_modseq);
 	if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0)
-		return 0;
+		return 1;
 
 	/* external transactions: */
 	switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) {
@@ -1171,7 +1171,7 @@
 							     trans_size -
 							     sizeof(*hdr));
 		if (ret != 0)
-			return ret < 0 ? -1 : 0;
+			return ret < 0 ? -1 : 1;
 		break;
 	case MAIL_TRANSACTION_INDEX_DELETED:
 		if (file->sync_offset < file->index_undeleted_offset)
@@ -1186,6 +1186,19 @@
 		file->log->index->index_delete_requested = FALSE;
 		file->index_undeleted_offset = file->sync_offset + trans_size;
 		break;
+	case MAIL_TRANSACTION_BOUNDARY: {
+		const struct mail_transaction_boundary *boundary =
+			(const void *)(hdr + 1);
+		size_t wanted_buffer_size;
+
+		wanted_buffer_size = file->sync_offset - file->buffer_offset +
+			boundary->size;
+		if (wanted_buffer_size > file->buffer->used) {
+			/* the full transaction hasn't been written yet */
+			return 0;
+		}
+		break;
+	}
 	}
 
 	if (file->max_tail_offset == file->sync_offset) {
@@ -1194,7 +1207,7 @@
 		   avoid re-reading it at the next sync. */
 		file->max_tail_offset += trans_size;
 	}
-	return 0;
+	return 1;
 }
 
 static int
@@ -1205,6 +1218,7 @@
 	struct stat st;
 	size_t size, avail;
 	uint32_t trans_size = 0;
+	int ret;
 
 	i_assert(file->sync_offset >= file->buffer_offset);
 
@@ -1233,8 +1247,11 @@
 			break;
 
 		/* transaction has been fully written */
-		if (log_file_track_sync(file, hdr, trans_size) < 0)
-			return -1;
+		if ((ret = log_file_track_sync(file, hdr, trans_size)) <= 0) {
+			if (ret < 0)
+				return -1;
+			break;
+		}
 
 		file->sync_offset += trans_size;
 		trans_size = 0;
diff -r 8e30a07d8dd0 -r b7d13ee51aa4 src/lib-index/mail-transaction-log.h
--- a/src/lib-index/mail-transaction-log.h	Thu Dec 02 22:59:42 2010 +0000
+++ b/src/lib-index/mail-transaction-log.h	Fri Dec 03 04:25:06 2010 +0000
@@ -43,6 +43,7 @@
 	MAIL_TRANSACTION_EXT_HDR_UPDATE32	= 0x00010000,
 	MAIL_TRANSACTION_INDEX_DELETED		= 0x00020000,
 	MAIL_TRANSACTION_INDEX_UNDELETED	= 0x00040000,
+	MAIL_TRANSACTION_BOUNDARY		= 0x00080000,
 
 	MAIL_TRANSACTION_TYPE_MASK		= 0x000fffff,
 
@@ -157,6 +158,10 @@
 	int32_t diff;
 };
 
+struct mail_transaction_boundary {
+	uint32_t size;
+};
+
 struct mail_transaction_log_append_ctx {
 	struct mail_transaction_log *log;
 	buffer_t *output;


More information about the dovecot-cvs mailing list