]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: Make sure indexes are never moved to memory (in case of out-of-disk space).
authorTimo Sirainen <tss@iki.fi>
Mon, 23 Mar 2009 20:16:17 +0000 (16:16 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 23 Mar 2009 20:16:17 +0000 (16:16 -0400)
--HG--
branch : HEAD

src/lib-index/mail-cache.c
src/lib-index/mail-index-private.h
src/lib-index/mail-index-strmap.c
src/lib-index/mail-index.c
src/lib-index/mail-index.h
src/lib-storage/index/dbox/dbox-map.c
src/lib-storage/index/dbox/dbox-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/index-storage.h

index e6545afb90ac7e1ed25cc53e534839af2356c854..eaa231268c93c335f9368c6440ba462356a45c28 100644 (file)
@@ -19,7 +19,8 @@ void mail_cache_set_syscall_error(struct mail_cache *cache,
 
        if (ENOSPACE(errno)) {
                cache->index->nodiskspace = TRUE;
-               return;
+               if (!cache->index->never_in_memory)
+                       return;
        }
 
        mail_index_set_error(cache->index,
index eca7a4532b98edd3721e8a8ce8efd5314a1307b1..1a843d18c376c1b52fbe54d1fd91e7fed5f2baf8 100644 (file)
@@ -230,6 +230,7 @@ struct mail_index {
        unsigned int modseqs_enabled:1;
        unsigned int initial_create:1;
        unsigned int initial_mapped:1;
+       unsigned int never_in_memory:1;
 };
 
 extern struct mail_index_module_register mail_index_module_register;
index 8023a6561c2df32e72bd5649d27ac5737cbaf6af..5c91854c302e85006ba4df6d7446fd6f04fc9fa8 100644 (file)
@@ -125,7 +125,8 @@ mail_index_strmap_set_syscall_error(struct mail_index_strmap *strmap,
 
        if (ENOSPACE(errno)) {
                strmap->index->nodiskspace = TRUE;
-               return;
+               if (!strmap->index->never_in_memory)
+                       return;
        }
 
        mail_index_set_error(strmap->index,
index ce4d5b7d47d64af4fc8b3965442f91043c3d7e94..9fdd5c46df347881ebda3aa625c3360f9d19309d 100644 (file)
@@ -420,6 +420,8 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags,
        index->nfs_flush = (flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0;
        index->readonly = (flags & MAIL_INDEX_OPEN_FLAG_READONLY) != 0;
        index->keep_backups = (flags & MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS) != 0;
+       index->never_in_memory =
+               (flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0;
        index->lock_method = lock_method;
 
        if (index->nfs_flush && index->fsync_disable)
@@ -560,6 +562,9 @@ int mail_index_move_to_memory(struct mail_index *index)
        if (MAIL_INDEX_IS_IN_MEMORY(index))
                return index->map == NULL ? -1 : 0;
 
+       if (index->never_in_memory)
+               return -1;
+
        /* set the index as being into memory */
        i_free_and_null(index->dir);
 
@@ -617,7 +622,8 @@ int mail_index_set_syscall_error(struct mail_index *index,
 
        if (ENOSPACE(errno)) {
                index->nodiskspace = TRUE;
-               return -1;
+               if (!index->never_in_memory)
+                       return -1;
        }
 
        return mail_index_set_error(index, "%s failed with index file %s: %m",
@@ -633,7 +639,8 @@ int mail_index_file_set_syscall_error(struct mail_index *index,
 
        if (ENOSPACE(errno)) {
                index->nodiskspace = TRUE;
-               return -1;
+               if (!index->never_in_memory)
+                       return -1;
        }
 
        return mail_index_set_error(index, "%s failed with file %s: %m",
index 3bc2007d29b493868c82dc2ae66f6e434dd9cab6..8082f2b69921973feea94bf9b314dbdf9e98a66e 100644 (file)
@@ -24,7 +24,10 @@ enum mail_index_open_flags {
        /* Open the index read-only */
        MAIL_INDEX_OPEN_FLAG_READONLY           = 0x80,
        /* Create backups of dovecot.index files once in a while */
-       MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS       = 0x100
+       MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS       = 0x100,
+       /* If we run out of disk space, fail modifications instead of moving
+          indexes to memory. */
+       MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY    = 0x200
 };
 
 enum mail_index_header_compat_flags {
index add25240cb874c17de9b5ac8d943af9c04cb9012..0b1e5ed9f396e22d0e62c7260c49e429ee16fbd5 100644 (file)
@@ -70,7 +70,8 @@ int dbox_map_open(struct dbox_map *map)
                return 0;
        }
 
-       open_flags = index_storage_get_index_open_flags(storage);
+       open_flags = MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY |
+               index_storage_get_index_open_flags(storage);
        ret = mail_index_open_or_create(map->index, open_flags,
                                        storage->lock_method);
        if (ret < 0) {
index bc017e200126dee7916bba0b17dfbca9dfdd74a4..3ef8b27d3aecd85cafb2640768bc2fd3aff2bf93 100644 (file)
@@ -277,6 +277,7 @@ dbox_open(struct dbox_storage *storage, const char *name,
        mbox->ibox.mail_vfuncs = &dbox_mail_vfuncs;
        mbox->ibox.index = index;
        mbox->ibox.keep_index_backups = TRUE;
+       mbox->ibox.index_never_in_memory = TRUE;
        mbox->path = p_strdup(pool, path);
        mbox->alt_path = p_strdup(pool, dbox_get_alt_path(storage, path));
        mbox->storage = storage;
index 1fa77da4b46fb98d12c40b993c7b7a5cd4fca3f4..fada12c2a332e9185ed2cb4e585f29adc92e0648 100644 (file)
@@ -424,6 +424,8 @@ void index_storage_mailbox_open(struct index_mailbox *ibox)
                ibox->fsync_disable = TRUE;
        if (ibox->keep_index_backups)
                index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS;
+       if (ibox->index_never_in_memory)
+               index_flags |= MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY;
 
        ret = mail_index_open(ibox->index, index_flags, storage->lock_method);
        if (ret <= 0 || ibox->move_to_memory) {
index d053951844a439ea14c3afdad035562abed62164..25c7022cf53aee1f1b3ab10e91585312df794e18 100644 (file)
@@ -65,6 +65,7 @@ struct index_mailbox {
        unsigned int move_to_memory:1;
        unsigned int fsync_disable:1;
        unsigned int keep_index_backups:1;
+       unsigned int index_never_in_memory:1;
 };
 
 struct index_transaction_context {