[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