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