Mercurial > dovecot > core-2.2
changeset 12493:b7d13ee51aa4
lib-index: Added "transaction boundary" record for future compatibility.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 03 Dec 2010 04:25:06 +0000 |
parents | 8e30a07d8dd0 |
children | 8ebf513b875c |
files | src/doveadm/doveadm-dump-log.c src/lib-index/mail-index-sync-update.c src/lib-index/mail-transaction-log-append.c src/lib-index/mail-transaction-log-file.c src/lib-index/mail-transaction-log.h |
diffstat | 5 files changed, 39 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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",
--- 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);
--- 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;
--- 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;