[dovecot-cvs] dovecot/src/lib-index mail-index-private.h, 1.38, 1.39 mail-index-sync-update.c, 1.63, 1.64 mail-index-view-sync.c, 1.31, 1.32 mail-index.c, 1.170, 1.171

cras at dovecot.org cras at dovecot.org
Mon Nov 29 02:48:47 EET 2004


Update of /var/lib/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv10119/lib-index

Modified Files:
	mail-index-private.h mail-index-sync-update.c 
	mail-index-view-sync.c mail-index.c 
Log Message:
Changed mail_index_map_to_memory() to mail_index_map_clone(). Even if the
index is already in memory, we wish to copy it instead of just raising
refcount. Fixes some problems with mmap_disable=yes.



Index: mail-index-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- mail-index-private.h	24 Nov 2004 20:40:39 -0000	1.38
+++ mail-index-private.h	29 Nov 2004 00:48:45 -0000	1.39
@@ -175,7 +175,7 @@
 /* Unreference given mapping and unmap it if it's dropped to zero. */
 void mail_index_unmap(struct mail_index *index, struct mail_index_map *map);
 struct mail_index_map *
-mail_index_map_to_memory(struct mail_index_map *map, uint32_t new_record_size);
+mail_index_map_clone(struct mail_index_map *map, uint32_t new_record_size);
 
 uint32_t mail_index_map_lookup_ext(struct mail_index_map *map,
 				   const char *name);

Index: mail-index-sync-update.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-sync-update.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- mail-index-sync-update.c	29 Nov 2004 00:23:35 -0000	1.63
+++ mail-index-sync-update.c	29 Nov 2004 00:48:45 -0000	1.64
@@ -16,6 +16,10 @@
 					struct mail_index_map *map)
 {
         struct mail_index_view *view = ctx->view;
+
+	/* if map still exists after this, it's only in views. */
+	view->map->write_to_disk = FALSE;
+
 	mail_index_unmap(view->index, view->map);
 	view->map = map;
 	view->map->refcount++;
@@ -198,13 +202,13 @@
 		return -1;
 	}
 
-	if (!view->map->write_to_disk) {
+	if (!view->map->write_to_disk || view->map->refcount != 1) {
 		/* expunges have to be atomic. so we'll have to copy
 		   the mapping, do the changes there and then finally
 		   replace the whole index file. to avoid extra disk
 		   I/O we copy the index into memory rather than to
 		   temporary file */
-		map = mail_index_map_to_memory(map, map->hdr.record_size);
+		map = mail_index_map_clone(map, map->hdr.record_size);
 		mail_index_sync_replace_map(ctx, map);
 	}
 	i_assert(MAIL_INDEX_MAP_IS_IN_MEMORY(map));
@@ -480,7 +484,7 @@
 	/* create a new mapping without records. a bit kludgy. */
 	old_records_count = map->records_count;
 	map->records_count = 0;
-	new_map = mail_index_map_to_memory(map, offset);
+	new_map = mail_index_map_clone(map, offset);
 	map->records_count = old_records_count;
 
 	if (old_size > ext[ext_id].record_size) {

Index: mail-index-view-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-view-sync.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- mail-index-view-sync.c	28 Nov 2004 23:19:53 -0000	1.31
+++ mail-index-view-sync.c	29 Nov 2004 00:48:45 -0000	1.32
@@ -139,12 +139,14 @@
 		uint32_t old_records_count = view->map->records_count;
 
 		if (view->map != view->index->map) {
-			ctx->sync_map_update = TRUE;
+			i_assert(view->map->records_count >=
+				 view->hdr.messages_count);
                         view->map->records_count = view->hdr.messages_count;
+			ctx->sync_map_update = TRUE;
 		}
 
-		map = mail_index_map_to_memory(view->map,
-					       view->map->hdr.record_size);
+		map = mail_index_map_clone(view->map,
+					   view->map->hdr.record_size);
 		view->map->records_count = old_records_count;
 		mail_index_unmap(view->index, view->map);
 		view->map = map;

Index: mail-index.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.170
retrieving revision 1.171
diff -u -d -r1.170 -r1.171
--- mail-index.c	28 Nov 2004 22:45:39 -0000	1.170
+++ mail-index.c	29 Nov 2004 00:48:45 -0000	1.171
@@ -723,8 +723,8 @@
 		} else {
 			/* create a copy of the mapping instead so we don't
 			   have to re-read it */
-			map = mail_index_map_to_memory(index->map,
-						index->map->hdr.record_size);
+			map = mail_index_map_clone(index->map,
+						   index->map->hdr.record_size);
 		}
 		index->map->refcount--;
 		index->map = NULL;
@@ -772,7 +772,7 @@
 }
 
 struct mail_index_map *
-mail_index_map_to_memory(struct mail_index_map *map, uint32_t new_record_size)
+mail_index_map_clone(struct mail_index_map *map, uint32_t new_record_size)
 {
 	struct mail_index_map *mem_map;
 	struct mail_index_header *hdr;
@@ -781,12 +781,6 @@
 	size_t size, copy_size;
 	unsigned int i, count;
 
-	if (MAIL_INDEX_MAP_IS_IN_MEMORY(map) &&
-	    map->hdr.record_size == new_record_size) {
-		map->refcount++;
-		return map;
-	}
-
         size = map->records_count * new_record_size;
 
 	mem_map = i_new(struct mail_index_map, 1);



More information about the dovecot-cvs mailing list