From: Timo Sirainen Date: Mon, 23 Mar 2009 20:16:17 +0000 (-0400) Subject: dbox: Make sure indexes are never moved to memory (in case of out-of-disk space). X-Git-Tag: 2.0.alpha1~1038^2~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef5fb27361cc5e15766e85e28355750ff04b13c9;p=thirdparty%2Fdovecot%2Fcore.git dbox: Make sure indexes are never moved to memory (in case of out-of-disk space). --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-cache.c b/src/lib-index/mail-cache.c index e6545afb90..eaa231268c 100644 --- a/src/lib-index/mail-cache.c +++ b/src/lib-index/mail-cache.c @@ -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, diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index eca7a4532b..1a843d18c3 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -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; diff --git a/src/lib-index/mail-index-strmap.c b/src/lib-index/mail-index-strmap.c index 8023a6561c..5c91854c30 100644 --- a/src/lib-index/mail-index-strmap.c +++ b/src/lib-index/mail-index-strmap.c @@ -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, diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index ce4d5b7d47..9fdd5c46df 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -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", diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 3bc2007d29..8082f2b699 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -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 { diff --git a/src/lib-storage/index/dbox/dbox-map.c b/src/lib-storage/index/dbox/dbox-map.c index add25240cb..0b1e5ed9f3 100644 --- a/src/lib-storage/index/dbox/dbox-map.c +++ b/src/lib-storage/index/dbox/dbox-map.c @@ -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) { diff --git a/src/lib-storage/index/dbox/dbox-storage.c b/src/lib-storage/index/dbox/dbox-storage.c index bc017e2001..3ef8b27d3a 100644 --- a/src/lib-storage/index/dbox/dbox-storage.c +++ b/src/lib-storage/index/dbox/dbox-storage.c @@ -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; diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 1fa77da4b4..fada12c2a3 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -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) { diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index d053951844..25c7022cf5 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -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 {