mail-index-alloc-cache.c revision e10d8b1291090c26b9ef499637e6e632485ca5be
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen MODULE_CONTEXT(obj, mail_index_alloc_cache_index_module)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen/* How many seconds to keep index opened for reuse after it's been closed */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen/* How many closed indexes to keep */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mail_index_alloc_cache_index_module,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenstatic struct mail_index_alloc_cache_list *indexes = NULL;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenmail_index_alloc_cache_add(struct mail_index *index,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen list = i_new(struct mail_index_alloc_cache_list, 1);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen MODULE_CONTEXT_SET(index, mail_index_alloc_cache_index_module, list);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenmail_index_alloc_cache_list_free(struct mail_index_alloc_cache_list *list)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenmail_index_alloc_cache_get(const char *mailbox_path,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen struct mail_index_alloc_cache_list **indexp, *rec, *match;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* compare index_dir inodes so we don't break even with symlinks.
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if index_dir doesn't exist yet or if using in-memory indexes, just
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen compare mailbox paths */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* in-memory indexes */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* it'll be created later */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen i_error("%s", eacces_error_get("stat", index_dir));
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* already found the index. we're just going through
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen the rest of them to drop 0 refcounts */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen } else if (index_dir != NULL && rec->index_dir_ino != 0) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* make sure the directory still exists.
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen it might have been renamed and we're trying
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen to access it via its new path now. */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (strcmp(mailbox_path, rec->mailbox_path) == 0)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen struct mail_index *index = mail_index_alloc(index_dir, prefix);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen match = mail_index_alloc_cache_add(index, mailbox_path, &st);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen struct mail_index_alloc_cache_list **list, *rec;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenstatic void index_removal_timeout(void *context ATTR_UNUSED)
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainenvoid mail_index_alloc_cache_unref(struct mail_index **_index)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen for (list = indexes; list != NULL; list = list->next) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen list->destroy_time = ioloop_time + INDEX_CACHE_TIMEOUT;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen to_index = timeout_add(INDEX_CACHE_TIMEOUT*1000/2,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenvoid mail_index_alloc_cache_destroy_unrefed(void)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenvoid mail_index_alloc_cache_index_opened(struct mail_index *index)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (list != NULL && list->index_dir_ino == 0 &&
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* newly created index directory. update its stat. */