]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Index syncing fixes.
authorTimo Sirainen <tss@iki.fi>
Sun, 20 Jun 2004 12:23:27 +0000 (15:23 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 20 Jun 2004 12:23:27 +0000 (15:23 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-sync-update.c
src/lib-index/mail-index-view.c
src/lib-index/mail-index.c

index 48fabe351a067dde6b1060c854b761f98b628c03..84792bc02a1c40b33c7d627f0c986c444e3c6c85 100644 (file)
@@ -250,6 +250,7 @@ sync_extra_rec_update(const struct mail_transaction_extra_rec_header *hdr,
 static int mail_index_grow(struct mail_index *index, struct mail_index_map *map,
                           unsigned int count)
 {
+       struct mail_index_header hdr;
        size_t size;
 
        if (MAIL_INDEX_MAP_IS_IN_MEMORY(map))
@@ -274,9 +275,17 @@ static int mail_index_grow(struct mail_index *index, struct mail_index_map *map,
        if (file_set_size(index->fd, (off_t)size) < 0)
                return mail_index_set_syscall_error(index, "file_set_size()");
 
+       /* we only wish to grow the file, but mail_index_map() updates the
+          headers as well and may break our modified hdr_copy. so, take
+          a backup of it and put it back afterwards */
+       hdr = map->hdr_copy;
+
        if (mail_index_map(index, TRUE) <= 0)
                return -1;
 
+       map->hdr_copy = hdr;
+       map->hdr = &map->hdr_copy;
+
        i_assert(map->mmap_size >= size);
        return 0;
 }
@@ -288,12 +297,12 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx)
        struct mail_index_map *map;
        const struct mail_transaction_header *hdr;
        const void *data;
-       unsigned int lock_id, count;
+       unsigned int count;
        uint32_t seq, i;
        uoff_t offset;
        int ret, had_dirty, skipped;
 
-       if (mail_index_lock_exclusive(index, &lock_id) < 0)
+       if (mail_index_lock_exclusive(index, &view->lock_id) < 0)
                return -1;
 
        /* NOTE: locking may change index->map so make sure assignment
@@ -349,6 +358,9 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx)
        if (ret < 0)
                return -1;
 
+       i_assert(map->records_count == map->hdr->messages_count);
+       i_assert(view->messages_count == map->hdr->messages_count);
+
        mail_transaction_log_get_head(index->log, &seq, &offset);
 
        map->hdr_copy.log_file_seq = seq;
@@ -381,7 +393,7 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx)
                map->hdr = map->mmap_base;
        }
 
-       mail_index_unlock(index, lock_id);
+        mail_index_view_unlock(view);
        return ret;
 }
 
index 9d1fdd441dce3bad038b61872d764cb0dcc22b4e..3d8fc5d924e093f271f7091e310a711545d87f7c 100644 (file)
@@ -51,6 +51,9 @@ int mail_index_view_lock_head(struct mail_index_view *view, int update_index)
 {
        unsigned int lock_id;
 
+       if (MAIL_INDEX_MAP_IS_IN_MEMORY(view->index->map))
+               return 0;
+
        if (!mail_index_is_locked(view->index, view->lock_id)) {
                if (mail_index_lock_shared(view->index, update_index,
                                           &view->lock_id) < 0)
index ff0cb25d9e5346b815ec579204ad285feb9167b3..3093020df70ec0ffc9e1552735494d14a4227dc1 100644 (file)
@@ -412,7 +412,6 @@ int mail_index_map(struct mail_index *index, int force)
 struct mail_index_map *
 mail_index_map_to_memory(struct mail_index *index, struct mail_index_map *map)
 {
-       const struct mail_index_header *hdr;
        struct mail_index_map *mem_map;
        size_t size;
 
@@ -431,9 +430,7 @@ mail_index_map_to_memory(struct mail_index *index, struct mail_index_map *map)
        mem_map->records = buffer_get_modifyable_data(mem_map->buffer, NULL);
        mem_map->records_count = map->records_count;
 
-       hdr = map->mmap_base;
-       memcpy(&mem_map->hdr_copy, map->mmap_base,
-              I_MIN(hdr->base_header_size, sizeof(mem_map->hdr_copy)));
+       mem_map->hdr_copy = *map->hdr;
        mem_map->hdr = &mem_map->hdr_copy;
        return mem_map;
 }