dovecot-1.2: Replaced "no extension resizing" flag with "no exte...

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 31 10:22:14 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/b97c3be33b04
changeset: 8130:b97c3be33b04
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 31 10:22:10 2008 +0300
description:
Replaced "no extension resizing" flag with "no extension shrinking".
It fixes some bugs while still handling the original reason it was added.

diffstat:

3 files changed, 37 insertions(+), 19 deletions(-)
src/lib-index/mail-index-sync-ext.c         |   49 ++++++++++++++++++---------
src/lib-index/mail-transaction-log-append.c |    2 -
src/lib-index/mail-transaction-log.h        |    5 +-

diffs (158 lines):

diff -r 612eb505775f -r b97c3be33b04 src/lib-index/mail-index-sync-ext.c
--- a/src/lib-index/mail-index-sync-ext.c	Sun Aug 31 09:31:27 2008 +0300
+++ b/src/lib-index/mail-index-sync-ext.c	Sun Aug 31 10:22:10 2008 +0300
@@ -260,13 +260,14 @@ static void sync_ext_reorder(struct mail
 
 static void
 sync_ext_resize(const struct mail_transaction_ext_intro *u,
-		uint32_t ext_map_idx, struct mail_index_sync_map_ctx *ctx)
+		uint32_t ext_map_idx, struct mail_index_sync_map_ctx *ctx,
+		bool no_shrink)
 {
 	struct mail_index_map *map = ctx->view->map;
 	struct mail_index_ext *ext;
 	struct mail_index_ext_header *ext_hdr;
 	uint32_t old_size, new_size, old_record_size;
-	bool modified = FALSE;
+	bool modified = FALSE, reorder = FALSE;
 
 	ext = array_idx_modifiable(&map->extensions, ext_map_idx);
 
@@ -275,25 +276,38 @@ sync_ext_resize(const struct mail_transa
 
 	if (new_size < old_size) {
 		/* header shrank */
-		buffer_delete(map->hdr_copy_buf, ext->hdr_offset + new_size,
-			      old_size - new_size);
-		modified = TRUE;
+		if (!no_shrink) {
+			new_size = old_size;
+			buffer_delete(map->hdr_copy_buf,
+				      ext->hdr_offset + new_size,
+				      old_size - new_size);
+			ext->hdr_size = u->hdr_size;
+			modified = TRUE;
+		}
 	} else if (new_size > old_size) {
 		/* header grown */
 		buffer_insert_zero(map->hdr_copy_buf,
 				   ext->hdr_offset + old_size,
 				   new_size - old_size);
+		ext->hdr_size = u->hdr_size;
 		modified = TRUE;
 	}
 	map->hdr_base = map->hdr_copy_buf->data;
 
+	if (ext->record_align < u->record_align ||
+	    (ext->record_align > u->record_align && !no_shrink)) {
+		ext->record_align = u->record_align;
+		modified = TRUE;
+		reorder = TRUE;
+	}
+
 	old_record_size = ext->record_size;
-	ext->hdr_size = u->hdr_size;
-	ext->record_size = u->record_size;
-	ext->record_align = u->record_align;
-
-	if (old_record_size != u->record_size)
+	if (ext->record_size < u->record_size ||
+	    (ext->record_size > u->record_size && !no_shrink)) {
+		ext->record_size = u->record_size;
 		modified = TRUE;
+		reorder = TRUE;
+	}
 
 	if (modified) {
 		i_assert((map->hdr_copy_buf->used % sizeof(uint64_t)) == 0);
@@ -321,7 +335,7 @@ sync_ext_resize(const struct mail_transa
 		}
 	}
 
-	if (old_record_size != u->record_size) {
+	if (reorder) {
 		map = mail_index_sync_get_atomic_map(ctx);
 		sync_ext_reorder(map, ext_map_idx, old_record_size);
 	} else if (modified) {
@@ -426,7 +440,7 @@ void mail_index_sync_ext_init(struct mai
 		u.hdr_size = rext->hdr_size;
 		u.record_size = rext->record_size;
 		u.record_align = rext->record_align;
-		sync_ext_resize(&u, *ext_map_idx_r, ctx);
+		sync_ext_resize(&u, *ext_map_idx_r, ctx, FALSE);
 	} else {
 		memset(&ext_hdr, 0, sizeof(ext_hdr));
 		ext_hdr.name_size = strlen(name);
@@ -446,7 +460,7 @@ int mail_index_sync_ext_intro(struct mai
 	const struct mail_index_ext *ext;
 	const char *name, *error;
 	uint32_t ext_map_idx;
-	bool no_resize;
+	bool no_shrink;
 
 	/* default to ignoring the following extension updates in case this
 	   intro is corrupted */
@@ -497,7 +511,7 @@ int mail_index_sync_ext_intro(struct mai
 	ext_hdr.hdr_size = u->hdr_size;
 	ext_hdr.record_size = u->record_size;
 	ext_hdr.record_align = u->record_align;
-	no_resize = (u->flags & MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_RESIZE) != 0;
+	no_shrink = (u->flags & MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK) != 0;
 
 	/* make sure the header looks valid before doing anything with it */
 	if (mail_index_map_ext_hdr_check(&map->hdr, &ext_hdr,
@@ -511,8 +525,7 @@ int mail_index_sync_ext_intro(struct mai
 		/* exists already */
 		if (u->reset_id == ext->reset_id) {
 			/* check if we need to resize anything */
-			if (!no_resize)
-				sync_ext_resize(u, ext_map_idx, ctx);
+			sync_ext_resize(u, ext_map_idx, ctx, no_shrink);
 			ctx->cur_ext_ignore = FALSE;
 		} else {
 			/* extension was reset and this transaction hadn't
@@ -598,6 +611,8 @@ mail_index_sync_ext_hdr_update(struct ma
 		return 1;
 
 	ext = array_idx(&map->extensions, ctx->cur_ext_map_idx);
+	i_assert(ext->hdr_offset + u->offset + u->size <= map->hdr.header_size);
+
 	buffer_write(map->hdr_copy_buf, ext->hdr_offset + u->offset,
 		     u + 1, u->size);
 	map->hdr_base = map->hdr_copy_buf->data;
@@ -634,6 +649,8 @@ mail_index_sync_ext_rec_update(struct ma
 		return 1;
 
 	ext = array_idx(&view->map->extensions, ctx->cur_ext_map_idx);
+	i_assert(ext->record_offset + ext->record_size <=
+		 view->map->hdr.record_size);
 
 	rec = MAIL_INDEX_MAP_IDX(view->map, seq-1);
 	old_data = PTR_OFFSET(rec, ext->record_offset);
diff -r 612eb505775f -r b97c3be33b04 src/lib-index/mail-transaction-log-append.c
--- a/src/lib-index/mail-transaction-log-append.c	Sun Aug 31 09:31:27 2008 +0300
+++ b/src/lib-index/mail-transaction-log-append.c	Sun Aug 31 10:22:10 2008 +0300
@@ -271,7 +271,7 @@ static void log_append_ext_intro(struct 
 		intro->hdr_size = rext->hdr_size;
 		intro->record_size = rext->record_size;
 		intro->record_align = rext->record_align;
-		intro->flags = MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_RESIZE;
+		intro->flags = MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK;
 		intro->name_size = idx != (uint32_t)-1 ? 0 :
 			strlen(rext->name);
 	}
diff -r 612eb505775f -r b97c3be33b04 src/lib-index/mail-transaction-log.h
--- a/src/lib-index/mail-transaction-log.h	Sun Aug 31 09:31:27 2008 +0300
+++ b/src/lib-index/mail-transaction-log.h	Sun Aug 31 10:22:10 2008 +0300
@@ -88,8 +88,9 @@ struct mail_transaction_header_update {
 };
 
 enum {
-	/* Ignore hdr_size, record_size and record_align */
-	MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_RESIZE = 0x01
+	/* Don't shrink hdr_size, record_size or record_align but grow them
+	   if necessary. */
+	MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK = 0x01
 };
 
 struct mail_transaction_ext_intro {


More information about the dovecot-cvs mailing list